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 = >k::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}