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:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user