diff options
Diffstat (limited to 'src/preferences_dialog.rs')
| -rw-r--r-- | src/preferences_dialog.rs | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/preferences_dialog.rs b/src/preferences_dialog.rs new file mode 100644 index 0000000..5aacfe8 --- /dev/null +++ b/src/preferences_dialog.rs @@ -0,0 +1,70 @@ +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<Self>, + ) -> ComponentParts<Self> { + 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<Self>) { + match msg { + PreferencesDialogMsg::Show => { + self.dialog.present(Some(&self.parent_window)); + } + } + } +} |