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 fn init(
51 counter: Self::Init,
52 root: Self::Root,
53 sender: ComponentSender<Self>,
54 ) -> ComponentParts<Self> {
55 let model = AppModel { counter };
56
57 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}