Skip to main content

traaains/ui/track/segment/signals_list/item/data/
is_repeat.rs

1use bevy::{
2    ecs::{
3        entity::Entity,
4        event::EntityEvent,
5        hierarchy::ChildOf,
6        observer::On,
7        query::With,
8        system::{Commands, Query},
9    },
10    feathers::controls::FeathersCheckbox,
11    log::tracing,
12    scene::{Scene, bsn, on},
13    ui_widgets::ValueChange,
14};
15
16use crate::{
17    sim::signal::Signals,
18    ui::{
19        Target,
20        segment::signals_list::item::{
21            SignalListItem,
22            data::{is_checkbox_checked, update_checkbox_visual},
23            find_root_with_target,
24        },
25    },
26};
27
28fn on_value_change(
29    e: On<ValueChange<bool>>,
30    mut cmd: Commands,
31    target: Query<(Entity, &Target), With<SignalListItem>>,
32    children: Query<&ChildOf>,
33    mut signals: Query<&mut Signals>,
34) {
35    update_checkbox_visual(e.value, e.event_target(), &mut cmd);
36
37    let Some((_, target_signal)) = find_root_with_target(e.event_target(), &target, &children)
38    else {
39        tracing::error!(
40            "Could not find parent UI entity with a target component pointing to a signal!"
41        );
42        return;
43    };
44
45    if let Ok(mut signal) = signals.get_mut(target_signal) {
46        match &mut *signal {
47            Signals::Main(main_signal) => main_signal.is_repeat = e.value,
48            _ => panic!("Unexpected signal type!"),
49        }
50    }
51}
52
53pub fn is_repeat_checkbox(is_repeat: bool) -> impl Scene {
54    bsn! {
55        @FeathersCheckbox
56        @is_checkbox_checked(is_repeat)
57        on(on_value_change)
58    }
59}