use adw::prelude::*; use relm4::prelude::*; use crate::settings::Settings; pub struct PreferencesDialog { parent_window: adw::ApplicationWindow, dialog: adw::PreferencesDialog, } #[derive(Debug)] pub enum PreferencesDialogMsg { Show, } #[relm4::component(pub)] impl SimpleComponent for PreferencesDialog { type Init = adw::ApplicationWindow; type Input = PreferencesDialogMsg; type Output = (); view! { #[root] adw::PreferencesDialog { set_title: "Preferences", add: &page, }, #[name(page)] adw::PreferencesPage { adw::PreferencesGroup { set_title: "Machine Translation", #[name(deepl_api_key_row)] adw::EntryRow { set_title: "DeepL API key", }, } } } fn init( parent_window: Self::Init, root: Self::Root, _sender: ComponentSender, ) -> ComponentParts { let settings = Settings::default(); let model = Self { parent_window, dialog: root.clone(), }; let widgets = view_output!(); settings .bind_deepl_api_key(&widgets.deepl_api_key_row, "text") .build(); ComponentParts { model, widgets } } fn update(&mut self, msg: Self::Input, _sender: ComponentSender) { match msg { PreferencesDialogMsg::Show => { self.dialog.present(Some(&self.parent_window)); } } } }