diff --git a/pixstrip-gtk/src/app.rs b/pixstrip-gtk/src/app.rs index 270370a..cf8e93e 100644 --- a/pixstrip-gtk/src/app.rs +++ b/pixstrip-gtk/src/app.rs @@ -642,7 +642,12 @@ fn setup_window_actions(window: &adw::ApplicationWindow, ui: &WizardUi) { ui.next_button.connect_clicked({ let action_group = action_group.clone(); let ui = ui.clone(); - move |_| { + move |btn| { + // If the button says "Process More", reset the wizard + if btn.label().as_deref() == Some("Process More") { + reset_wizard(&ui); + return; + } let s = ui.state.wizard.borrow(); if s.is_last_step() { drop(s); @@ -1252,9 +1257,10 @@ fn run_processing(_window: &adw::ApplicationWindow, ui: &WizardUi) { let processing_page = crate::processing::build_processing_page(); ui.nav_view.push(&processing_page); - // Hide bottom nav buttons during processing + // Hide bottom nav buttons and step indicator during processing ui.back_button.set_visible(false); ui.next_button.set_visible(false); + ui.step_indicator.widget().set_visible(false); ui.title.set_subtitle("Processing..."); // Get references to progress widgets inside the page @@ -1367,6 +1373,7 @@ fn show_results( ui.nav_view.push(&results_page); ui.title.set_subtitle("Processing Complete"); + ui.step_indicator.widget().set_visible(false); ui.back_button.set_visible(false); ui.next_button.set_label("Process More"); ui.next_button.set_visible(true); @@ -1660,6 +1667,7 @@ fn reset_wizard(ui: &WizardUi) { // Reset nav ui.nav_view.replace(&ui.pages[..1]); ui.step_indicator.set_current(0); + ui.step_indicator.widget().set_visible(true); ui.title.set_subtitle("Batch Image Processor"); ui.back_button.set_visible(false); ui.next_button.set_label("Next"); @@ -2176,78 +2184,87 @@ fn walk_widgets(widget: &Option, f: &dyn Fn(>k::Widget)) { fn show_shortcuts_window(window: &adw::ApplicationWindow) { - let dialog = adw::Dialog::builder() - .title("Keyboard Shortcuts") - .content_width(400) - .content_height(500) + let shortcuts_window = gtk::ShortcutsWindow::builder() + .transient_for(window) + .modal(true) .build(); - let toolbar_view = adw::ToolbarView::new(); - let header = adw::HeaderBar::new(); - toolbar_view.add_top_bar(&header); - - let scrolled = gtk::ScrolledWindow::builder() - .hscrollbar_policy(gtk::PolicyType::Never) - .vexpand(true) + // Wizard Navigation section + let wizard_group = gtk::ShortcutsGroup::builder() + .title("Wizard Navigation") .build(); - let content = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .spacing(0) - .margin_start(12) - .margin_end(12) - .margin_top(12) - .margin_bottom(12) - .build(); - - let sections: &[(&str, &[(&str, &str)])] = &[ - ("Wizard Navigation", &[ - ("Alt + Right", "Next step"), - ("Alt + Left", "Previous step"), - ("Alt + 1...9", "Jump to step by number"), - ("Ctrl + Enter", "Process images"), - ("Escape", "Cancel or go back"), - ]), - ("File Management", &[ - ("Ctrl + O", "Add files"), - ("Ctrl + V", "Paste image from clipboard"), - ("Ctrl + A", "Select all images"), - ("Ctrl + Shift + A", "Deselect all images"), - ("Delete", "Remove selected images"), - ]), - ("Application", &[ - ("Ctrl + ,", "Settings"), - ("F1", "Keyboard shortcuts"), - ("Ctrl + Z", "Undo last batch"), - ("Ctrl + Q", "Quit"), - ]), + let shortcuts_nav: &[(&str, &str)] = &[ + ("Right", "Next step"), + ("Left", "Previous step"), + ("1", "Jump to step 1"), + ("2", "Jump to step 2"), + ("3", "Jump to step 3"), + ("Return", "Process images"), + ("Escape", "Cancel or go back"), ]; - for (title, shortcuts) in sections { - let group = adw::PreferencesGroup::builder() + for (accel, title) in shortcuts_nav { + let shortcut = gtk::ShortcutsShortcut::builder() + .accelerator(*accel) .title(*title) .build(); - - for (accel, desc) in *shortcuts { - let row = adw::ActionRow::builder() - .title(*desc) - .build(); - let label = gtk::Label::builder() - .label(*accel) - .css_classes(["monospace", "dim-label"]) - .valign(gtk::Align::Center) - .build(); - row.add_suffix(&label); - group.add(&row); - } - - content.append(&group); + wizard_group.add_shortcut(&shortcut); } - scrolled.set_child(Some(&content)); - toolbar_view.set_content(Some(&scrolled)); - dialog.set_child(Some(&toolbar_view)); - dialog.present(Some(window)); + // File Management section + let files_group = gtk::ShortcutsGroup::builder() + .title("File Management") + .build(); + + let shortcuts_files: &[(&str, &str)] = &[ + ("o", "Add files"), + ("v", "Paste image from clipboard"), + ("a", "Select all images"), + ("a", "Deselect all images"), + ("Delete", "Remove selected images"), + ]; + + for (accel, title) in shortcuts_files { + let shortcut = gtk::ShortcutsShortcut::builder() + .accelerator(*accel) + .title(*title) + .build(); + files_group.add_shortcut(&shortcut); + } + + // Application section + let app_group = gtk::ShortcutsGroup::builder() + .title("Application") + .build(); + + let shortcuts_app: &[(&str, &str)] = &[ + ("comma", "Settings"), + ("F1", "Keyboard shortcuts"), + ("z", "Undo last batch"), + ("q", "Quit"), + ]; + + for (accel, title) in shortcuts_app { + let shortcut = gtk::ShortcutsShortcut::builder() + .accelerator(*accel) + .title(*title) + .build(); + app_group.add_shortcut(&shortcut); + } + + let section = gtk::ShortcutsSection::builder() + .title("Keyboard Shortcuts") + .build(); + #[allow(deprecated)] + { + section.add_group(&wizard_group); + section.add_group(&files_group); + section.add_group(&app_group); + + shortcuts_window.add_section(§ion); + } + shortcuts_window.present(); } fn apply_accessibility_settings() { diff --git a/pixstrip-gtk/src/steps/step_resize.rs b/pixstrip-gtk/src/steps/step_resize.rs index da7e5c9..71c0529 100644 --- a/pixstrip-gtk/src/steps/step_resize.rs +++ b/pixstrip-gtk/src/steps/step_resize.rs @@ -242,6 +242,9 @@ pub fn build_resize_page(state: &AppState) -> adw::NavigationPage { .margin_top(8) .margin_bottom(8) .build(); + drawing.update_property(&[ + gtk::accessible::Property::Label("Visual comparison of original and target image dimensions"), + ]); let pw = preview_width.clone(); let ph = preview_height.clone();