simple/
simple.rs

1use gtk::prelude::*;
2use relm4::prelude::*;
3
4struct AppModel {
5    counter: u8,
6}
7
8#[derive(Debug)]
9enum AppMsg {
10    Increment,
11    Decrement,
12}
13
14#[relm4::component]
15impl SimpleComponent for AppModel {
16    type Init = u8;
17    type Input = AppMsg;
18    type Output = ();
19
20    view! {
21        gtk::Window {
22            set_title: Some("Simple app"),
23            set_default_size: (300, 100),
24
25            gtk::Box {
26                set_orientation: gtk::Orientation::Vertical,
27                set_spacing: 5,
28                set_margin_all: 5,
29
30                gtk::Button {
31                    set_label: "Increment",
32                    connect_clicked => AppMsg::Increment,
33                },
34
35                gtk::Button {
36                    set_label: "Decrement",
37                    connect_clicked => AppMsg::Decrement,
38                },
39
40                gtk::Label {
41                    #[watch]
42                    set_label: &format!("Counter: {}", model.counter),
43                    set_margin_all: 5,
44                }
45            }
46        }
47    }
48
49    // Initialize the component.
50    fn init(
51        counter: Self::Init,
52        root: Self::Root,
53        sender: ComponentSender<Self>,
54    ) -> ComponentParts<Self> {
55        let model = AppModel { counter };
56
57        // Insert the code generation of the view! macro here
58        let widgets = view_output!();
59
60        ComponentParts { model, widgets }
61    }
62
63    fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
64        match msg {
65            AppMsg::Increment => {
66                self.counter = self.counter.wrapping_add(1);
67            }
68            AppMsg::Decrement => {
69                self.counter = self.counter.wrapping_sub(1);
70            }
71        }
72    }
73}
74
75fn main() {
76    let app = RelmApp::new("relm4.example.simple");
77    app.run::<AppModel>(0);
78}