diff options
Diffstat (limited to 'src/components/preferences.rs')
-rw-r--r-- | src/components/preferences.rs | 90 |
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() + } +} |