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,
|
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(>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);
|
dialog.add(&general_page);
|
||||||
|
|
||||||
// Processing page
|
// Processing page
|
||||||
@@ -182,6 +240,37 @@ pub fn build_settings_dialog() -> adw::PreferencesDialog {
|
|||||||
notify_page.add(¬ify_group);
|
notify_page.add(¬ify_group);
|
||||||
dialog.add(¬ify_page);
|
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
|
// Save settings when the dialog closes
|
||||||
dialog.connect_closed(move |_| {
|
dialog.connect_closed(move |_| {
|
||||||
let new_config = AppConfig {
|
let new_config = AppConfig {
|
||||||
|
|||||||
Reference in New Issue
Block a user