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 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 .children_signal_vec(
51 numbers
53 .signal_vec()
54 .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(|In(n)| item(n))
90 )
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}