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
This commit is contained in:
2026-03-06 13:29:25 +02:00
parent 2911c608c2
commit a74010a121

View File

@@ -69,8 +69,66 @@ pub fn build_settings_dialog() -> adw::PreferencesDialog {
SkillLevel::Detailed => 1, 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); ui_group.add(&skill_row);
general_page.add(&ui_group); 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(&gtk::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); dialog.add(&general_page);
// Processing page // Processing page
@@ -182,6 +240,37 @@ pub fn build_settings_dialog() -> adw::PreferencesDialog {
notify_page.add(&notify_group); notify_page.add(&notify_group);
dialog.add(&notify_page); dialog.add(&notify_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 // Save settings when the dialog closes
dialog.connect_closed(move |_| { dialog.connect_closed(move |_| {
let new_config = AppConfig { let new_config = AppConfig {