log/
log.rs

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        // Insert the macro code generation here
57        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    // Show traces to find potential performance bottlenecks, for example
76    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}