feathers_counter/
feathers_counter.rs1use bevy::{
6 feathers::{
7 controls::FeathersButton,
8 dark_theme::create_dark_theme,
9 theme::{ThemeBackgroundColor, ThemedText, UiTheme},
10 tokens, FeathersPlugins,
11 },
12 prelude::*,
13 ui_widgets::Activate,
14};
15
16#[derive(Resource)]
17struct Counter(i32);
18
19#[derive(Component, Default, Clone)]
20struct CounterText;
21
22fn main() {
23 App::new()
24 .add_plugins((
25 DefaultPlugins,
26 FeathersPlugins,
29 ))
30 .insert_resource(UiTheme(create_dark_theme()))
32 .insert_resource(Counter(0))
33 .add_systems(Startup, scene.spawn())
34 .add_systems(
35 Update,
36 update_counter_text.run_if(resource_changed::<Counter>),
37 )
38 .run();
39}
40
41fn scene() -> impl SceneList {
42 bsn_list![Camera2d, demo_root()]
43}
44
45fn demo_root() -> impl Scene {
46 bsn! {
47 Node {
48 width: percent(100),
49 height: percent(100),
50 align_items: AlignItems::Center,
51 justify_content: JustifyContent::Center,
52 }
53 ThemeBackgroundColor(tokens::WINDOW_BG)
54 Children[(
55 Node {
56 align_items: AlignItems::Center,
57 justify_content: JustifyContent::Center,
58 }
59 Children [
60 (
61 @FeathersButton
62 on(|_activate: On<Activate>, mut counter: ResMut<Counter>| {
63 counter.0 -= 1;
64 })
65 Children [ (Text("-1") ThemedText) ]
66 ),
67 (
68 Node {
69 margin: UiRect::horizontal(px(10.0)),
70 }
71 Text("0") ThemedText CounterText
72 ),
73 (
74 @FeathersButton
75 on(|_activate: On<Activate>, mut counter: ResMut<Counter>| {
76 counter.0 += 1;
77 })
78 Children [ (Text("+1") ThemedText) ]
79 )
80 ]
81 )]
82 }
83}
84
85fn update_counter_text(
86 counter: Res<Counter>,
87 mut counter_text: Single<&mut Text, With<CounterText>>,
88) {
89 info!("Counter updated");
90 counter_text.0 = format!("{}", counter.0);
91}