timer/
timer.rs

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}