test/
test.rs

1#![allow(missing_docs)]
2#![allow(unused_variables)]
3mod utils;
4use utils::*;
5
6use bevy::prelude::*;
7use jonmo::prelude::*;
8
9fn main() {
10    let mut app = App::new();
11    let numbers = MutableVecBuilder::from([1, 2, 3, 4, 5]).spawn(app.world_mut());
12    app.add_plugins(examples_plugin)
13        .insert_resource(Numbers(numbers.clone()))
14        .add_systems(
15            PostStartup,
16            (
17                move |world: &mut World| {
18                    ui_root(numbers.clone(), world).spawn(world);
19                },
20                camera,
21            ),
22        )
23        .add_systems(Update, (live.run_if(any_with_component::<Lifetime>), hotkeys, toggle))
24        .insert_resource(ToggleFilter(true))
25        .run();
26}
27
28#[derive(Resource, Clone)]
29struct Numbers(MutableVec<i32>);
30
31#[derive(Component, Default, Clone)]
32struct Lifetime(f32);
33
34#[rustfmt::skip]
35fn ui_root(numbers: MutableVec<i32>, world: &mut World) -> JonmoBuilder {
36    let list_a = MutableVecBuilder::from([1, 2, 3, 4, 5]).spawn(world).signal_vec();
37    let list_b = MutableVecBuilder::from([3, 4, 5]).spawn(world).signal_vec();
38    let map = MutableBTreeMapBuilder::from([(1, 2), (2, 3)]).spawn(world);
39    // map.signal_map().
40    JonmoBuilder::from(Node {
41        height: Val::Percent(100.0),
42        width: Val::Percent(100.0),
43        flex_direction: FlexDirection::Column,
44        align_items: AlignItems::Center,
45        justify_content: JustifyContent::Center,
46        row_gap: Val::Px(10.0),
47        ..default()
48    })
49    // .child_signal(numbers.clone().is_empty().map(|In(len)| item(len as u32)))
50    .children_signal_vec(
51        // MutableVec::from([numbers.signal_vec(), numbers.signal_vec()]).signal_vec()
52        numbers
53            .signal_vec()
54            // SignalBuilder::from_system(|_: In<()>| 1)
55            // SignalBuilder::from_system(|_: In<()>, toggle: Res<ToggleFilter>| toggle.0)
56            // .dedupe()
57            // .switch_signal_vec(move |In(toggle)| {
58            //     if toggle {
59            //         // println!("toggled to A");
60            //         list_a.clone()
61            //     } else {
62            //         // println!("toggled to B");
63            //         list_b.clone()
64            //     }
65            // })
66            // .dedupe()
67            // .to_signal_vec()
68            .filter_signal(|In(n)| {
69                SignalBuilder::from_system(move |_: In<()>, toggle: Res<ToggleFilter>| {
70                    n % 2 == if toggle.0 { 0 } else { 1 }
71                })
72            })
73            // .map_signal(|In(n): In<i32>| {
74            //     SignalBuilder::from_system(move |_: In<()>| n + 1).dedupe()
75            // })
76            // .debug()
77            // .map_in(|n: i32| -n)
78            // .sort_by_cmp()
79            // .flatten()
80            // .chain(numbers)
81            // .intersperse(0)
82            // .sort_by(|In((left, right)): In<(i32, i32)>| left.cmp(&right).reverse())
83            // .sort_by_key(|In(n): In<i32>| -n)
84            // .intersperse_with(|In(index_signal): In<jonmo::signal::Dedupe<jonmo::signal::Source<Option<usize>>>>, world: &mut World| {
85            //     let signal = index_signal.debug().register(world);
86            //     poll_signal(world, *signal)
87            //         .and_then(downcast_any_clone::<Option<usize>>).flatten().unwrap_or_default() as i32
88            // })
89            .map(|In(n)| item(n))
90            // .intersperse_with(
91            //     |index_signal: In<jonmo::signal::Dedupe<jonmo::signal::Source<Option<usize>>>>| {
92            //         JonmoBuilder::from(Node::default()).component_signal(
93            //             index_signal
94            //                 .debug()
95            //                 .map_in(|idx_opt| Text::new(format!("{}", idx_opt.unwrap_or(0)))),
96            //         )
97            //     },
98            // ),
99    )
100}
101
102#[derive(Resource)]
103struct ToggleFilter(bool);
104
105fn item(number: i32) -> JonmoBuilder {
106    JonmoBuilder::from((
107        Node {
108            height: Val::Px(40.0),
109            width: Val::Px(200.0),
110            padding: UiRect::all(Val::Px(5.0)),
111            align_items: AlignItems::Center,
112            ..default()
113        },
114        BackgroundColor(Color::WHITE),
115    ))
116    .child(JonmoBuilder::from((
117        Node {
118            height: Val::Percent(100.),
119            width: Val::Percent(100.),
120            ..default()
121        },
122        Text(number.to_string()),
123        TextColor(Color::BLACK),
124        TextLayout::new_with_justify(JustifyText::Center),
125        Lifetime::default(),
126    )))
127}
128
129fn camera(mut commands: Commands) {
130    commands.spawn(Camera2d);
131}
132
133fn live(mut lifetimes: Query<&mut Lifetime>, time: Res<Time>) {
134    for mut lifetime in lifetimes.iter_mut() {
135        lifetime.0 += time.delta_secs();
136    }
137}
138
139fn hotkeys(
140    keys: Res<ButtonInput<KeyCode>>,
141    numbers: ResMut<Numbers>,
142    mut mutable_vec_datas: Query<&mut MutableVecData<i32>>,
143) {
144    let mut guard = numbers.0.write(&mut mutable_vec_datas);
145    if keys.just_pressed(KeyCode::Equal) {
146        guard.push((guard.len() + 1) as i32);
147    } else if keys.just_pressed(KeyCode::Minus) {
148        guard.pop();
149    }
150}
151
152fn toggle(keys: Res<ButtonInput<KeyCode>>, mut toggle: ResMut<ToggleFilter>) {
153    if keys.just_pressed(KeyCode::Space) {
154        toggle.0 = !toggle.0;
155    }
156}