use crate::styles::{CssSource, TagName};
use crate::widgets::{Headline, UIGenID, UIWidgetState, WidgetId, WidgetKind};
use crate::{CurrentWidgetState, ExtendedUiConfiguration};
use bevy::camera::visibility::RenderLayers;
use bevy::prelude::*;
#[derive(Component)]
struct HeadlineBase;
pub struct HeadlineWidget;
impl Plugin for HeadlineWidget {
fn build(&self, app: &mut App) {
app.add_systems(Update, (internal_node_creation_system, update_text));
}
}
fn internal_node_creation_system(
mut commands: Commands,
query: Query<(Entity, &Headline, Option<&CssSource>), (With<Headline>, Without<HeadlineBase>)>,
config: Res<ExtendedUiConfiguration>,
) {
let layer = config.render_layers.first().unwrap_or(&1);
for (entity, headline, source_opt) in query.iter() {
let mut css_source = CssSource::default();
if let Some(source) = source_opt {
css_source = source.clone();
}
commands
.entity(entity)
.insert((
Name::new(format!(
"{}-{}",
headline.h_type.to_string().to_uppercase(),
headline.entry
)),
Node::default(),
WidgetId {
id: headline.entry,
kind: WidgetKind::Headline,
},
Text::new(headline.text.clone()),
TextColor::default(),
TextFont::default(),
TextLayout::default(),
ZIndex::default(),
Pickable::default(),
css_source,
TagName(format!("{}", headline.h_type.to_string())),
RenderLayers::layer(*layer),
HeadlineBase,
))
.observe(on_internal_click)
.observe(on_internal_cursor_entered)
.observe(on_internal_cursor_leave);
}
}
fn update_text(mut query: Query<(&mut Text, &Headline), Changed<Headline>>) {
for (mut text, headline) in query.iter_mut() {
if text.0 != headline.text {
text.0 = headline.text.clone();
}
}
}
fn on_internal_click(
mut trigger: On<Pointer<Click>>,
mut query: Query<(&mut UIWidgetState, &UIGenID), With<Headline>>,
mut current_widget_state: ResMut<CurrentWidgetState>,
) {
if let Ok((mut state, gen_id)) = query.get_mut(trigger.entity) {
state.focused = true;
current_widget_state.widget_id = gen_id.0;
}
trigger.propagate(false);
}
fn on_internal_cursor_entered(
mut trigger: On<Pointer<Over>>,
mut query: Query<&mut UIWidgetState, With<Headline>>,
) {
if let Ok(mut state) = query.get_mut(trigger.entity) {
state.hovered = true;
}
trigger.propagate(false);
}
fn on_internal_cursor_leave(
mut trigger: On<Pointer<Out>>,
mut query: Query<&mut UIWidgetState, With<Headline>>,
) {
if let Ok(mut state) = query.get_mut(trigger.entity) {
state.hovered = false;
}
trigger.propagate(false);
}