Add processing, results, and settings UI screens
Processing screen with progress bar, activity log, and pause/cancel. Results screen with stats summary, error section, and action buttons. Settings dialog with General, Processing, Accessibility, Notifications.
This commit is contained in:
161
pixstrip-gtk/src/settings.rs
Normal file
161
pixstrip-gtk/src/settings.rs
Normal file
@@ -0,0 +1,161 @@
|
||||
use adw::prelude::*;
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn build_settings_dialog() -> adw::PreferencesDialog {
|
||||
let dialog = adw::PreferencesDialog::builder()
|
||||
.title("Settings")
|
||||
.build();
|
||||
|
||||
// General page
|
||||
let general_page = adw::PreferencesPage::builder()
|
||||
.title("General")
|
||||
.icon_name("preferences-system-symbolic")
|
||||
.build();
|
||||
|
||||
let output_group = adw::PreferencesGroup::builder()
|
||||
.title("Output")
|
||||
.build();
|
||||
|
||||
let subfolder_row = adw::EntryRow::builder()
|
||||
.title("Default output subfolder")
|
||||
.text("processed")
|
||||
.build();
|
||||
|
||||
let overwrite_row = adw::ComboRow::builder()
|
||||
.title("Default overwrite behavior")
|
||||
.subtitle("What to do when output files already exist")
|
||||
.build();
|
||||
let overwrite_model = gtk::StringList::new(&[
|
||||
"Ask before overwriting",
|
||||
"Auto-rename with suffix",
|
||||
"Always overwrite",
|
||||
"Skip existing files",
|
||||
]);
|
||||
overwrite_row.set_model(Some(&overwrite_model));
|
||||
|
||||
let remember_row = adw::SwitchRow::builder()
|
||||
.title("Remember last-used settings")
|
||||
.subtitle("Restore wizard state on next launch")
|
||||
.active(true)
|
||||
.build();
|
||||
|
||||
output_group.add(&subfolder_row);
|
||||
output_group.add(&overwrite_row);
|
||||
output_group.add(&remember_row);
|
||||
general_page.add(&output_group);
|
||||
|
||||
let ui_group = adw::PreferencesGroup::builder()
|
||||
.title("Interface")
|
||||
.build();
|
||||
|
||||
let skill_row = adw::ComboRow::builder()
|
||||
.title("Detail level")
|
||||
.subtitle("Controls how many options are visible by default")
|
||||
.build();
|
||||
let skill_model = gtk::StringList::new(&["Simple", "Detailed"]);
|
||||
skill_row.set_model(Some(&skill_model));
|
||||
|
||||
ui_group.add(&skill_row);
|
||||
general_page.add(&ui_group);
|
||||
dialog.add(&general_page);
|
||||
|
||||
// Processing page
|
||||
let processing_page = adw::PreferencesPage::builder()
|
||||
.title("Processing")
|
||||
.icon_name("system-run-symbolic")
|
||||
.build();
|
||||
|
||||
let threads_group = adw::PreferencesGroup::builder()
|
||||
.title("Performance")
|
||||
.build();
|
||||
|
||||
let threads_row = adw::ComboRow::builder()
|
||||
.title("Processing threads")
|
||||
.subtitle("Auto uses all available CPU cores")
|
||||
.build();
|
||||
let threads_model = gtk::StringList::new(&["Auto", "1", "2", "4", "8"]);
|
||||
threads_row.set_model(Some(&threads_model));
|
||||
|
||||
let error_row = adw::ComboRow::builder()
|
||||
.title("On error")
|
||||
.subtitle("What to do when an image fails to process")
|
||||
.build();
|
||||
let error_model = gtk::StringList::new(&["Skip and continue", "Pause on error"]);
|
||||
error_row.set_model(Some(&error_model));
|
||||
|
||||
threads_group.add(&threads_row);
|
||||
threads_group.add(&error_row);
|
||||
processing_page.add(&threads_group);
|
||||
dialog.add(&processing_page);
|
||||
|
||||
// Accessibility page
|
||||
let a11y_page = adw::PreferencesPage::builder()
|
||||
.title("Accessibility")
|
||||
.icon_name("preferences-desktop-accessibility-symbolic")
|
||||
.build();
|
||||
|
||||
let a11y_group = adw::PreferencesGroup::builder()
|
||||
.title("Visual Preferences")
|
||||
.description("Override system settings for this app only")
|
||||
.build();
|
||||
|
||||
let contrast_row = adw::SwitchRow::builder()
|
||||
.title("High contrast")
|
||||
.subtitle("Increase visual contrast throughout the app")
|
||||
.active(false)
|
||||
.build();
|
||||
|
||||
let large_text_row = adw::SwitchRow::builder()
|
||||
.title("Large text")
|
||||
.subtitle("Increase text size throughout the app")
|
||||
.active(false)
|
||||
.build();
|
||||
|
||||
let motion_row = adw::SwitchRow::builder()
|
||||
.title("Reduced motion")
|
||||
.subtitle("Minimize animations and transitions")
|
||||
.active(false)
|
||||
.build();
|
||||
|
||||
a11y_group.add(&contrast_row);
|
||||
a11y_group.add(&large_text_row);
|
||||
a11y_group.add(&motion_row);
|
||||
a11y_page.add(&a11y_group);
|
||||
dialog.add(&a11y_page);
|
||||
|
||||
// Notifications page
|
||||
let notify_page = adw::PreferencesPage::builder()
|
||||
.title("Notifications")
|
||||
.icon_name("preferences-system-notifications-symbolic")
|
||||
.build();
|
||||
|
||||
let notify_group = adw::PreferencesGroup::builder()
|
||||
.title("Completion")
|
||||
.build();
|
||||
|
||||
let desktop_notify_row = adw::SwitchRow::builder()
|
||||
.title("Desktop notification")
|
||||
.subtitle("Show notification when processing completes")
|
||||
.active(true)
|
||||
.build();
|
||||
|
||||
let sound_row = adw::SwitchRow::builder()
|
||||
.title("Completion sound")
|
||||
.subtitle("Play a sound when processing completes")
|
||||
.active(false)
|
||||
.build();
|
||||
|
||||
let auto_open_row = adw::SwitchRow::builder()
|
||||
.title("Auto-open output folder")
|
||||
.subtitle("Open the output folder in file manager when done")
|
||||
.active(false)
|
||||
.build();
|
||||
|
||||
notify_group.add(&desktop_notify_row);
|
||||
notify_group.add(&sound_row);
|
||||
notify_group.add(&auto_open_row);
|
||||
notify_page.add(¬ify_group);
|
||||
dialog.add(¬ify_page);
|
||||
|
||||
dialog
|
||||
}
|
||||
Reference in New Issue
Block a user