summary refs log tree commit diff
path: root/src/components/preferences.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/preferences.rs')
-rw-r--r--src/components/preferences.rs90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/components/preferences.rs b/src/components/preferences.rs
new file mode 100644
index 0000000..9bbc313
--- /dev/null
+++ b/src/components/preferences.rs
@@ -0,0 +1,90 @@
+use gettextrs::*;
+use gio::prelude::*;
+use adw::prelude::*;
+use relm4::prelude::*;
+
+pub struct Preferences {
+    settings: gio::Settings,
+}
+
+#[relm4::component(pub)]
+impl Component for Preferences {
+    type CommandOutput = ();
+    type Input = Option<gtk::Widget>;
+    type Output = ();
+    type Init = ();
+
+    view! {
+        #[root]
+        adw::PreferencesDialog {
+            add = &adw::PreferencesPage {
+                set_title: &gettext("Language Models"),
+                set_description: &gettext("Settings for the language model integrations."),
+                set_icon_name: Some("magic-wand"),
+
+                adw::PreferencesGroup {
+                    set_title: &gettext("General"),
+
+                    #[name = "llm_endpoint"]
+                    adw::EntryRow {},
+                },
+
+                adw::PreferencesGroup {
+                    set_title: &gettext("Smart Summary"),
+
+                    #[name = "smart_summary_model"] adw::EntryRow {},
+                    #[name = "smart_summary_system_prompt"] adw::EntryRow {},
+                    #[name = "smart_summary_prompt_prefix"] adw::EntryRow {},
+                    #[name = "smart_summary_prompt_suffix"] adw::EntryRow {},
+                }
+            }
+        }
+    }
+
+    fn init(
+        _: Self::Init,
+        root: Self::Root,
+        _sender: ComponentSender<Self>,
+    ) -> ComponentParts<Self> {
+        let model = Self {
+            settings: gio::Settings::new(crate::APPLICATION_ID),
+        };
+
+        model.settings.delay();
+        let schema = model.settings.settings_schema().unwrap();
+
+        let widgets = view_output!();
+
+        for (row, key) in [
+            (&widgets.llm_endpoint, "llm-endpoint"),
+            (&widgets.smart_summary_model, "smart-summary-model"),
+            (&widgets.smart_summary_system_prompt, "smart-summary-system-prompt"),
+            (&widgets.smart_summary_prompt_prefix, "smart-summary-prompt-prefix"),
+            (&widgets.smart_summary_prompt_suffix, "smart-summary-prompt-suffix"),
+        ] {
+            model.settings.bind(key, row, "text")
+                .get()
+                .set()
+                .build();
+            row.set_title(&gettext(schema.key(key).summary().unwrap()));
+        }
+
+        root.connect_closed(glib::clone!(
+            #[strong(rename_to = settings)]
+            model.settings,
+            move |_| {
+                settings.apply()
+            }
+        ));
+
+        ComponentParts { model, widgets }
+    }
+
+    fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>, root: &Self::Root) {
+        root.present(msg.as_ref());
+    }
+
+    fn shutdown(&mut self, _: &mut Self::Widgets, _: relm4::Sender<()>) {
+        self.settings.apply()
+    }
+}