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:
@@ -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.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("app.quit", &["<Control>q"]);
|
||||||
app.set_accels_for_action("win.show-settings", &["<Control>comma"]);
|
app.set_accels_for_action("win.show-settings", &["<Control>comma"]);
|
||||||
app.set_accels_for_action("win.show-shortcuts", &["<Control>question", "F1"]);
|
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);
|
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
|
// Settings action - opens settings dialog
|
||||||
{
|
{
|
||||||
let window = window.clone();
|
let window = window.clone();
|
||||||
|
|||||||
@@ -437,7 +437,7 @@ fn build_loaded_state(state: &AppState) -> gtk::Box {
|
|||||||
&& let Some(stack) = parent.downcast_ref::<gtk::Stack>()
|
&& let Some(stack) = parent.downcast_ref::<gtk::Stack>()
|
||||||
&& let Some(loaded_widget) = stack.child_by_name("loaded")
|
&& let Some(loaded_widget) = stack.child_by_name("loaded")
|
||||||
{
|
{
|
||||||
set_all_checkboxes(&loaded_widget, true);
|
set_all_checkboxes_in(&loaded_widget, true);
|
||||||
update_count_label(&loaded_widget, &loaded, &excl);
|
update_count_label(&loaded_widget, &loaded, &excl);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -459,7 +459,7 @@ fn build_loaded_state(state: &AppState) -> gtk::Box {
|
|||||||
&& let Some(stack) = parent.downcast_ref::<gtk::Stack>()
|
&& let Some(stack) = parent.downcast_ref::<gtk::Stack>()
|
||||||
&& let Some(loaded_widget) = stack.child_by_name("loaded")
|
&& let Some(loaded_widget) = stack.child_by_name("loaded")
|
||||||
{
|
{
|
||||||
set_all_checkboxes(&loaded_widget, false);
|
set_all_checkboxes_in(&loaded_widget, false);
|
||||||
update_count_label(&loaded_widget, &loaded, &excl);
|
update_count_label(&loaded_widget, &loaded, &excl);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -498,14 +498,14 @@ fn build_loaded_state(state: &AppState) -> gtk::Box {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Set all CheckButton widgets within a container to a given state
|
/// Set all CheckButton widgets within a container to a given state
|
||||||
fn set_all_checkboxes(widget: >k::Widget, active: bool) {
|
pub fn set_all_checkboxes_in(widget: >k::Widget, active: bool) {
|
||||||
if let Some(check) = widget.downcast_ref::<gtk::CheckButton>() {
|
if let Some(check) = widget.downcast_ref::<gtk::CheckButton>() {
|
||||||
check.set_active(active);
|
check.set_active(active);
|
||||||
return; // Don't recurse into CheckButton children
|
return; // Don't recurse into CheckButton children
|
||||||
}
|
}
|
||||||
let mut child = widget.first_child();
|
let mut child = widget.first_child();
|
||||||
while let Some(c) = child {
|
while let Some(c) = child {
|
||||||
set_all_checkboxes(&c, active);
|
set_all_checkboxes_in(&c, active);
|
||||||
child = c.next_sibling();
|
child = c.next_sibling();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user