summary refs log tree commit diff
path: root/src/preferences_dialog.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/preferences_dialog.rs')
-rw-r--r--src/preferences_dialog.rs70
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));
+            }
+        }
+    }
+}