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.rs119
1 files changed, 98 insertions, 21 deletions
diff --git a/src/components/preferences.rs b/src/components/preferences.rs
index fbf406d..27f84a9 100644
--- a/src/components/preferences.rs
+++ b/src/components/preferences.rs
@@ -1,4 +1,5 @@
-use gio::prelude::*;
+use gettextrs::*;
+
 use adw::prelude::*;
 use relm4::prelude::*;
 
@@ -6,6 +7,55 @@ pub struct Preferences {
     settings: gio::Settings,
 }
 
+#[allow(dead_code)]
+struct ComposerPreferencesWidgets {
+    page: adw::PreferencesPage,
+    general_group: adw::PreferencesGroup,
+    send_html_directly: adw::SwitchRow,
+}
+
+impl ComposerPreferencesWidgets {
+    fn new(settings: &gio::Settings) -> Self {
+        let page = adw::PreferencesPage::builder()
+            .title(gettext("Post composer"))
+            .description(gettext(
+                "Settings for composing new posts and editing existing ones.",
+            ))
+            .icon_name("editor-symbolic")
+            .build();
+        let general_group = adw::PreferencesGroup::builder()
+            .title(gettext("General"))
+            .build();
+        let send_html_directly = adw::SwitchRow::new();
+        general_group.add(&send_html_directly);
+        page.add(&general_group);
+
+        let widgets = Self {
+            page,
+            general_group,
+            send_html_directly,
+        };
+
+        let schema = settings.settings_schema().unwrap();
+
+        #[expect(clippy::single_element_loop)]
+        for (row, key, property) in [(
+            widgets
+                .send_html_directly
+                .upcast_ref::<adw::PreferencesRow>(),
+            "send-html-directly",
+            "active",
+        )] {
+            let key_data = schema.key(key);
+            settings.bind(key, row, property).get().set().build();
+            row.set_title(&gettext(key_data.summary().unwrap()));
+            row.set_tooltip_markup(key_data.description().map(gettext).as_deref());
+        }
+
+        widgets
+    }
+}
+
 #[cfg(feature = "smart-summary")]
 #[allow(dead_code)]
 struct LanguageModelPreferencesWidgets {
@@ -13,6 +63,7 @@ struct LanguageModelPreferencesWidgets {
 
     general_group: adw::PreferencesGroup,
     llm_endpoint: adw::EntryRow,
+    smart_summary_show_warning: adw::SwitchRow,
 
     smart_summary_group: adw::PreferencesGroup,
     smart_summary_model: adw::EntryRow,
@@ -24,19 +75,19 @@ struct LanguageModelPreferencesWidgets {
 #[cfg(feature = "smart-summary")]
 impl LanguageModelPreferencesWidgets {
     fn new(settings: &gio::Settings) -> Self {
-        use gettextrs::*;
-
         let page = adw::PreferencesPage::builder()
-            .title(gettext("Language Models"))
+            .title(gettext("Language models"))
             .description(gettext("Settings for the language model integrations."))
-            .icon_name("magic-wand")
+            .icon_name("brain-augemnted") // sic!
             .build();
 
         let general_group = adw::PreferencesGroup::builder()
             .title(gettext("General"))
             .build();
         let llm_endpoint = adw::EntryRow::new();
+        let smart_summary_show_warning = adw::SwitchRow::new();
         general_group.add(&llm_endpoint);
+        general_group.add(&smart_summary_show_warning);
         page.add(&general_group);
 
         let smart_summary_group = adw::PreferencesGroup::builder()
@@ -57,28 +108,53 @@ impl LanguageModelPreferencesWidgets {
 
             general_group,
             llm_endpoint,
+            smart_summary_show_warning,
 
             smart_summary_group,
             smart_summary_model,
             smart_summary_system_prompt,
             smart_summary_prompt_prefix,
-            smart_summary_prompt_suffix
+            smart_summary_prompt_suffix,
         };
 
         let schema = settings.settings_schema().unwrap();
 
-        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"),
+        for (row, key, property) in [
+            (
+                widgets.llm_endpoint.upcast_ref::<adw::PreferencesRow>(),
+                "llm-endpoint",
+                "text",
+            ),
+            (
+                widgets.smart_summary_show_warning.upcast_ref::<_>(),
+                "smart-summary-show-warning",
+                "active",
+            ),
+            (
+                widgets.smart_summary_model.upcast_ref::<_>(),
+                "smart-summary-model",
+                "text",
+            ),
+            (
+                widgets.smart_summary_system_prompt.upcast_ref::<_>(),
+                "smart-summary-system-prompt",
+                "text",
+            ),
+            (
+                widgets.smart_summary_prompt_prefix.upcast_ref::<_>(),
+                "smart-summary-prompt-prefix",
+                "text",
+            ),
+            (
+                widgets.smart_summary_prompt_suffix.upcast_ref::<_>(),
+                "smart-summary-prompt-suffix",
+                "text",
+            ),
         ] {
-            settings.bind(key, row, "text")
-                .get()
-                .set()
-                .build();
-            row.set_title(&gettext(schema.key(key).summary().unwrap()));
+            let key_data = schema.key(key);
+            settings.bind(key, row, property).get().set().build();
+            row.set_title(&gettext(key_data.summary().unwrap()));
+            row.set_tooltip_markup(key_data.description().map(gettext).as_deref());
         }
 
         widgets
@@ -86,8 +162,9 @@ impl LanguageModelPreferencesWidgets {
 }
 
 pub struct PreferencesWidgets {
+    composer: ComposerPreferencesWidgets,
     #[cfg(feature = "smart-summary")]
-    llm: LanguageModelPreferencesWidgets
+    llm: LanguageModelPreferencesWidgets,
 }
 
 impl Component for Preferences {
@@ -114,18 +191,18 @@ impl Component for Preferences {
         model.settings.delay();
 
         let widgets = PreferencesWidgets {
+            composer: ComposerPreferencesWidgets::new(&model.settings),
             #[cfg(feature = "smart-summary")]
             llm: LanguageModelPreferencesWidgets::new(&model.settings),
         };
+        root.add(&widgets.composer.page);
         #[cfg(feature = "smart-summary")]
         root.add(&widgets.llm.page);
 
         root.connect_closed(glib::clone!(
             #[strong(rename_to = settings)]
             model.settings,
-            move |_| {
-                settings.apply()
-            }
+            move |_| settings.apply()
         ));
 
         ComponentParts { model, widgets }