traaains/ui/track/segment/signals_list/item/data/
is_repeat.rs1use 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}