From a74010a12179fa344d94b9b7deff6047300c6b38 Mon Sep 17 00:00:00 2001 From: lashman Date: Fri, 6 Mar 2026 13:29:25 +0200 Subject: [PATCH] Add file manager integration toggles and reset button to Settings - Settings now has a File Manager Integration group with toggle rows for each detected file manager (Nautilus, Nemo, Thunar, Dolphin) - Added Reset to Defaults button that restores all settings to defaults --- pixstrip-gtk/src/settings.rs | 89 ++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/pixstrip-gtk/src/settings.rs b/pixstrip-gtk/src/settings.rs index 680b37a..7b569c4 100644 --- a/pixstrip-gtk/src/settings.rs +++ b/pixstrip-gtk/src/settings.rs @@ -69,8 +69,66 @@ pub fn build_settings_dialog() -> adw::PreferencesDialog { SkillLevel::Detailed => 1, }); + let reset_button = gtk::Button::builder() + .label("Reset to Defaults") + .halign(gtk::Align::Start) + .margin_top(8) + .build(); + reset_button.add_css_class("destructive-action"); + ui_group.add(&skill_row); general_page.add(&ui_group); + + // File Manager Integration + let fm_group = adw::PreferencesGroup::builder() + .title("File Manager Integration") + .description("Add 'Process with Pixstrip' to your file manager's right-click menu") + .build(); + + let file_managers = [ + ("Nautilus", "org.gnome.Nautilus"), + ("Nemo", "org.nemo.Nemo"), + ("Thunar", "thunar"), + ("Dolphin", "org.kde.dolphin"), + ]; + + let mut found_fm = false; + for (name, desktop_id) in &file_managers { + let is_installed = gtk::gio::AppInfo::all() + .iter() + .any(|info| { + info.id() + .map(|id| id.as_str().contains(desktop_id)) + .unwrap_or(false) + }); + + if is_installed { + found_fm = true; + let row = adw::SwitchRow::builder() + .title(*name) + .subtitle(format!("Add right-click menu to {}", name)) + .active(false) + .build(); + fm_group.add(&row); + } + } + + if !found_fm { + let row = adw::ActionRow::builder() + .title("No supported file managers detected") + .subtitle("Nautilus, Nemo, Thunar, and Dolphin are supported") + .build(); + row.add_prefix(>k::Image::from_icon_name("dialog-information-symbolic")); + fm_group.add(&row); + } + + general_page.add(&fm_group); + + // Reset defaults group + let reset_group = adw::PreferencesGroup::new(); + reset_group.add(&reset_button); + general_page.add(&reset_group); + dialog.add(&general_page); // Processing page @@ -182,6 +240,37 @@ pub fn build_settings_dialog() -> adw::PreferencesDialog { notify_page.add(¬ify_group); dialog.add(¬ify_page); + // Wire reset button + { + let subfolder = subfolder_row.clone(); + let overwrite = overwrite_row.clone(); + let remember = remember_row.clone(); + let skill = skill_row.clone(); + let threads = threads_row.clone(); + let error = error_row.clone(); + let contrast = contrast_row.clone(); + let large_text = large_text_row.clone(); + let motion = motion_row.clone(); + let notify = desktop_notify_row.clone(); + let sound = sound_row.clone(); + let auto_open = auto_open_row.clone(); + reset_button.connect_clicked(move |_| { + let defaults = AppConfig::default(); + subfolder.set_text(&defaults.output_subfolder); + overwrite.set_selected(0); + remember.set_active(defaults.remember_settings); + skill.set_selected(0); + threads.set_selected(0); + error.set_selected(0); + contrast.set_active(defaults.high_contrast); + large_text.set_active(defaults.large_text); + motion.set_active(defaults.reduced_motion); + notify.set_active(defaults.notify_on_completion); + sound.set_active(defaults.play_completion_sound); + auto_open.set_active(defaults.auto_open_output); + }); + } + // Save settings when the dialog closes dialog.connect_closed(move |_| { let new_config = AppConfig {