1use std::cell::RefCell;
2use std::rc::Rc;
3
4use neutrino::utils::event::Key;
5use neutrino::widgets::button::{Button, ButtonListener, ButtonState};
6use neutrino::{App, Window, WindowListener};
7
8struct Counter {
9 value: u8,
10}
11
12impl Counter {
13 fn new() -> Self {
14 Self { value: 0 }
15 }
16
17 fn value(&self) -> u8 {
18 self.value
19 }
20
21 fn increment(&mut self) {
22 self.value += 1;
23 }
24
25 fn reset(&mut self) {
26 self.value = 0;
27 }
28}
29
30struct MyButtonListener {
31 counter: Rc<RefCell<Counter>>,
32}
33
34impl MyButtonListener {
35 fn new(counter: Rc<RefCell<Counter>>) -> Self {
36 Self { counter }
37 }
38}
39
40impl ButtonListener for MyButtonListener {
41 fn on_change(&self, _state: &ButtonState) {
42 self.counter.borrow_mut().reset();
43 }
44
45 fn on_update(&self, state: &mut ButtonState) {
46 state.set_text(&format!(
47 "{} seconds since last reset",
48 self.counter.borrow().value().to_string()
49 ));
50 }
51}
52
53struct MyWindowListener {
54 counter: Rc<RefCell<Counter>>,
55}
56
57impl MyWindowListener {
58 fn new(counter: Rc<RefCell<Counter>>) -> Self {
59 Self { counter }
60 }
61}
62
63impl WindowListener for MyWindowListener {
64 fn on_key(&self, _key: Key) {}
65
66 fn on_tick(&self) {
67 self.counter.borrow_mut().increment();
68 }
69}
70
71fn main() {
72 let counter = Rc::new(RefCell::new(Counter::new()));
73
74 let listener = MyButtonListener::new(Rc::clone(&counter));
75
76 let mut button = Button::new("my_button");
77 button.set_text("0 seconds since last reset");
78 button.set_listener(Box::new(listener));
79
80 let wlistener = MyWindowListener::new(Rc::clone(&counter));
81
82 let mut window = Window::new();
83 window.set_title("Timer");
84 window.set_size(320, 240);
85 window.set_child(Box::new(button));
86 window.set_timer(1000);
87 window.set_listener(Box::new(wlistener));
88
89 App::run(window);
90}