adw_combo_row/
adw_combo_row.rs

1use adw::prelude::*;
2use relm4::{
3    Component, ComponentController, ComponentParts, ComponentSender, Controller, RelmApp,
4    SimpleComponent, adw, gtk,
5};
6use relm4_components::simple_adw_combo_row::SimpleComboRow;
7
8#[derive(Debug)]
9enum AppMsg {
10    Selected(usize),
11}
12
13struct App {
14    combo_row: Controller<SimpleComboRow<&'static str>>,
15    selected_variant: usize,
16}
17
18#[relm4::component]
19impl SimpleComponent for App {
20    type Init = ();
21    type Input = AppMsg;
22    type Output = ();
23
24    view! {
25        #[name = "app"]
26        adw::Window {
27            set_default_size: (300, 100),
28            set_title: Some("Libadwaita SimpleComboRow"),
29
30            gtk::Box {
31                set_orientation: gtk::Orientation::Vertical,
32                set_vexpand: true,
33
34                #[name = "sidebar_header"]
35                adw::HeaderBar {
36                    #[wrap(Some)]
37                    set_title_widget = &adw::WindowTitle {
38                        set_title: "Libadwaita SimpleComboRow",
39                    },
40                    set_show_end_title_buttons: false,
41                },
42
43                adw::PreferencesGroup {
44                    #[local_ref]
45                    combo_row -> adw::ComboRow,
46                },
47
48                gtk::Text {
49                    #[watch]
50                    set_text: &format!("Variant {}", model.selected_variant + 1),
51                }
52            },
53        }
54    }
55
56    fn update(&mut self, msg: Self::Input, _: ComponentSender<Self>) {
57        match msg {
58            AppMsg::Selected(selected) => self.selected_variant = selected,
59        }
60    }
61
62    fn init(
63        _: Self::Init,
64        root: Self::Root,
65        sender: ComponentSender<Self>,
66    ) -> ComponentParts<Self> {
67        let model = App {
68            combo_row: SimpleComboRow::builder()
69                .launch(SimpleComboRow {
70                    variants: vec!["Variant 1", "Variant 2"],
71                    active_index: None,
72                })
73                .forward(sender.input_sender(), AppMsg::Selected),
74            selected_variant: 0,
75        };
76
77        let combo_row = model.combo_row.widget();
78        let widgets = view_output!();
79
80        ComponentParts { model, widgets }
81    }
82}
83
84fn main() {
85    let app = RelmApp::new("relm4.example.adw_combo_box");
86    app.run::<App>(());
87}