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; 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, ) -> ComponentParts { 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, root: &Self::Root) { root.present(msg.as_ref()); } fn shutdown(&mut self, _: &mut Self::Widgets, _: relm4::Sender<()>) { self.settings.apply() } }