popover/
popover.rs

1use gtk::prelude::*;
2use relm4::prelude::*;
3
4#[derive(Default)]
5struct App {
6    counter: u8,
7}
8
9#[derive(Debug)]
10enum Msg {
11    Increment,
12    Decrement,
13}
14
15#[relm4::component]
16impl SimpleComponent for App {
17    type Init = ();
18    type Input = Msg;
19    type Output = ();
20
21    view! {
22        gtk::ApplicationWindow {
23            set_title: Some("Popup example"),
24            set_default_size: (300, 100),
25
26            gtk::Box {
27                set_orientation: gtk::Orientation::Vertical,
28                set_margin_all: 5,
29                set_spacing: 5,
30
31                gtk::MenuButton {
32                    set_label: "Pop up!",
33                    set_direction: gtk::ArrowType::Right,
34
35                    #[wrap(Some)]
36                    set_popover: popover = &gtk::Popover {
37                        set_position: gtk::PositionType::Right,
38
39                        gtk::Box {
40                            set_orientation: gtk::Orientation::Vertical,
41                            set_spacing: 5,
42
43                            gtk::Button {
44                                set_label: "Increment counter",
45                                connect_clicked => Msg::Increment,
46                            },
47
48                            gtk::Button {
49                                set_label: "Decrement counter",
50                                connect_clicked => Msg::Decrement,
51                            },
52                        },
53                    },
54                },
55                gtk::Label {
56                    set_margin_all: 5,
57                    #[watch]
58                    set_label: &format!("Counter: {}", model.counter),
59                }
60            },
61        }
62    }
63
64    fn init(
65        _init: Self::Init,
66        root: Self::Root,
67        sender: ComponentSender<Self>,
68    ) -> ComponentParts<Self> {
69        let model = Self { counter: 0 };
70        let widgets = view_output!();
71
72        ComponentParts { model, widgets }
73    }
74
75    fn update(&mut self, message: Self::Input, _sender: ComponentSender<Self>) {
76        match message {
77            Msg::Increment => {
78                self.counter = self.counter.wrapping_add(1);
79            }
80            Msg::Decrement => {
81                self.counter = self.counter.wrapping_sub(1);
82            }
83        }
84    }
85}
86
87fn main() {
88    let app = RelmApp::new("relm4.example.popover");
89    app.run::<App>(());
90}