relm4-components 0.11.0

An idiomatic GUI library inspired by Elm and based on gtk4-rs
Documentation
use adw::prelude::*;
use relm4::{
    Component, ComponentController, ComponentParts, ComponentSender, Controller, RelmApp,
    SimpleComponent, adw, gtk,
};
use relm4_components::simple_adw_combo_row::SimpleComboRow;

#[derive(Debug)]
enum AppMsg {
    Selected(usize),
}

struct App {
    combo_row: Controller<SimpleComboRow<&'static str>>,
    selected_variant: usize,
}

#[relm4::component]
impl SimpleComponent for App {
    type Init = ();
    type Input = AppMsg;
    type Output = ();

    view! {
        #[name = "app"]
        adw::Window {
            set_default_size: (300, 100),
            set_title: Some("Libadwaita SimpleComboRow"),

            gtk::Box {
                set_orientation: gtk::Orientation::Vertical,
                set_vexpand: true,

                #[name = "sidebar_header"]
                adw::HeaderBar {
                    #[wrap(Some)]
                    set_title_widget = &adw::WindowTitle {
                        set_title: "Libadwaita SimpleComboRow",
                    },
                    set_show_end_title_buttons: false,
                },

                adw::PreferencesGroup {
                    #[local_ref]
                    combo_row -> adw::ComboRow,
                },

                gtk::Text {
                    #[watch]
                    set_text: &format!("Variant {}", model.selected_variant + 1),
                }
            },
        }
    }

    fn update(&mut self, msg: Self::Input, _: ComponentSender<Self>) {
        match msg {
            AppMsg::Selected(selected) => self.selected_variant = selected,
        }
    }

    fn init(
        _: Self::Init,
        root: Self::Root,
        sender: ComponentSender<Self>,
    ) -> ComponentParts<Self> {
        let model = App {
            combo_row: SimpleComboRow::builder()
                .launch(SimpleComboRow {
                    variants: vec!["Variant 1", "Variant 2"],
                    active_index: None,
                })
                .forward(sender.input_sender(), AppMsg::Selected),
            selected_variant: 0,
        };

        let combo_row = model.combo_row.widget();
        let widgets = view_output!();

        ComponentParts { model, widgets }
    }
}

fn main() {
    let app = RelmApp::new("relm4.example.adw_combo_box");
    app.run::<App>(());
}