1use gtk::prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt};
2use relm4::{ComponentParts, ComponentSender, RelmApp, RelmWidgetExt, SimpleComponent};
3
4struct App {
5 counter: u8,
6}
7
8#[derive(Debug)]
9enum Msg {
10 Increment,
11 Decrement,
12}
13
14#[relm4::component]
15impl SimpleComponent for App {
16 type Init = u8;
17 type Input = Msg;
18 type Output = ();
19
20 view! {
21 gtk::Window {
22 set_title: Some("Log example"),
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 => Msg::Increment,
33 },
34
35 gtk::Button {
36 set_label: "Decrement",
37 connect_clicked => Msg::Decrement,
38 },
39
40 gtk::Label {
41 set_margin_all: 5,
42 #[watch]
43 set_label: &format!("Counter: {}", model.counter),
44 }
45 }
46 }
47 }
48
49 fn init(
50 counter: Self::Init,
51 root: Self::Root,
52 sender: ComponentSender<Self>,
53 ) -> ComponentParts<Self> {
54 let model = App { counter };
55
56 let widgets = view_output!();
58
59 ComponentParts { model, widgets }
60 }
61
62 fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
63 match msg {
64 Msg::Increment => {
65 self.counter = self.counter.wrapping_add(1);
66 }
67 Msg::Decrement => {
68 self.counter = self.counter.wrapping_sub(1);
69 }
70 }
71 }
72}
73
74fn main() {
75 tracing_subscriber::fmt()
77 .with_span_events(tracing_subscriber::fmt::format::FmtSpan::FULL)
78 .with_max_level(tracing::Level::TRACE)
79 .init();
80
81 tracing::info!("Starting application!");
82
83 let app = RelmApp::new("relm4.example.log");
84 app.run::<App>(0);
85}