Add Ctrl+A and Ctrl+Shift+A keyboard shortcuts for select/deselect all

- Register select-all-images and deselect-all-images actions
- Wire Ctrl+A to clear exclusion set, Ctrl+Shift+A to exclude all
- Both shortcuts update checkbox state and count label in images step
- Make set_all_checkboxes_in public for cross-module access
This commit is contained in:
2026-03-06 13:33:06 +02:00
parent 819ac963de
commit 137bb77faa
2 changed files with 54 additions and 4 deletions

View File

@@ -128,6 +128,8 @@ fn setup_shortcuts(app: &adw::Application) {
);
}
app.set_accels_for_action("win.add-files", &["<Control>o"]);
app.set_accels_for_action("win.select-all-images", &["<Control>a"]);
app.set_accels_for_action("win.deselect-all-images", &["<Control><Shift>a"]);
app.set_accels_for_action("app.quit", &["<Control>q"]);
app.set_accels_for_action("win.show-settings", &["<Control>comma"]);
app.set_accels_for_action("win.show-shortcuts", &["<Control>question", "F1"]);
@@ -441,6 +443,54 @@ fn setup_window_actions(window: &adw::ApplicationWindow, ui: &WizardUi) {
action_group.add_action(&action);
}
// Select all images action
{
let ui = ui.clone();
let action = gtk::gio::SimpleAction::new("select-all-images", None);
action.connect_activate(move |_, _| {
ui.state.excluded_files.borrow_mut().clear();
// Update the images step UI
if let Some(page) = ui.pages.get(1)
&& let Some(stack) = page.child().and_downcast::<gtk::Stack>()
&& let Some(loaded) = stack.child_by_name("loaded")
{
crate::steps::step_images::set_all_checkboxes_in(&loaded, true);
let files = ui.state.loaded_files.borrow();
let count = files.len();
drop(files);
update_images_count_label(&ui, count);
}
});
action_group.add_action(&action);
}
// Deselect all images action
{
let ui = ui.clone();
let action = gtk::gio::SimpleAction::new("deselect-all-images", None);
action.connect_activate(move |_, _| {
{
let files = ui.state.loaded_files.borrow();
let mut excl = ui.state.excluded_files.borrow_mut();
for f in files.iter() {
excl.insert(f.clone());
}
}
// Update the images step UI
if let Some(page) = ui.pages.get(1)
&& let Some(stack) = page.child().and_downcast::<gtk::Stack>()
&& let Some(loaded) = stack.child_by_name("loaded")
{
crate::steps::step_images::set_all_checkboxes_in(&loaded, false);
let files = ui.state.loaded_files.borrow();
let count = files.len();
drop(files);
update_images_count_label(&ui, count);
}
});
action_group.add_action(&action);
}
// Settings action - opens settings dialog
{
let window = window.clone();