summary refs log tree commit diff
path: root/src/preferences.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/preferences.rs')
-rw-r--r--src/preferences.rs71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/preferences.rs b/src/preferences.rs
new file mode 100644
index 0000000..c5f9bb1
--- /dev/null
+++ b/src/preferences.rs
@@ -0,0 +1,71 @@
+use adw::prelude::*;
+use gtk::gio;
+use relm4::prelude::*;
+
+pub struct Preferences {
+    parent_window: adw::ApplicationWindow,
+    dialog: adw::PreferencesDialog,
+}
+
+#[derive(Debug)]
+pub enum PreferencesMsg {
+    Show,
+}
+
+#[derive(Debug)]
+pub enum PreferencesOutput {}
+
+#[relm4::component(pub)]
+impl SimpleComponent for Preferences {
+    type Init = adw::ApplicationWindow;
+    type Input = PreferencesMsg;
+    type Output = PreferencesOutput;
+
+    view! {
+        #[root]
+        adw::PreferencesDialog {
+            set_title: "Preferences",
+            add: &page,
+        },
+
+        #[name(page)]
+        adw::PreferencesPage {
+            adw::PreferencesGroup {
+                set_title: "Machine Translation",
+
+                adw::EntryRow {
+                    set_title: "DeepL API key",
+                    set_text: settings.string("deepl-api-key").as_str(),
+                    connect_changed[settings] => move |entry| {
+                        settings.set_string("deepl-api-key", entry.text().as_str()).unwrap()
+                    }
+                },
+            }
+        }
+    }
+
+    fn init(
+        parent_window: Self::Init,
+        root: Self::Root,
+        _sender: ComponentSender<Self>,
+    ) -> ComponentParts<Self> {
+        let settings = gio::Settings::new("tc.mal.lleap");
+
+        let model = Self {
+            parent_window,
+            dialog: root.clone(),
+        };
+
+        let widgets = view_output!();
+
+        ComponentParts { model, widgets }
+    }
+
+    fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
+        match msg {
+            PreferencesMsg::Show => {
+                self.dialog.present(Some(&self.parent_window));
+            }
+        }
+    }
+}