From 7288ded3d4aeb5f39cb5cd6dbe667127f4233ca8 Mon Sep 17 00:00:00 2001 From: Tony <1414927+zfbx@users.noreply.github.com> Date: Fri, 4 Apr 2025 03:54:20 -0400 Subject: [PATCH 1/2] implement selection inversing --- src/tagstudio/qt/ts_qt.py | 37 ++++++++++++++++++++ src/tagstudio/resources/translations/en.json | 1 + 2 files changed, 38 insertions(+) diff --git a/src/tagstudio/qt/ts_qt.py b/src/tagstudio/qt/ts_qt.py index ff6d48567..804f50988 100644 --- a/src/tagstudio/qt/ts_qt.py +++ b/src/tagstudio/qt/ts_qt.py @@ -473,6 +473,21 @@ def set_open_last_loaded_on_startup(checked: bool): self.select_all_action.setEnabled(False) edit_menu.addAction(self.select_all_action) + self.select_inverse_action = QAction(Translations["select.inverse"], menu_bar) + self.select_inverse_action.triggered.connect(self.select_inverse_action_callback) + self.select_inverse_action.setShortcut( + QtCore.QKeyCombination( + QtCore.Qt.KeyboardModifier( + QtCore.Qt.KeyboardModifier.ControlModifier + ^ QtCore.Qt.KeyboardModifier.ShiftModifier + ), + QtCore.Qt.Key.Key_I, + ) + ) + self.select_inverse_action.setToolTip("Ctrl+Shift+I") + self.select_inverse_action.setEnabled(False) + edit_menu.addAction(self.select_inverse_action) + self.clear_select_action = QAction(Translations["select.clear"], menu_bar) self.clear_select_action.triggered.connect(self.clear_select_action_callback) self.clear_select_action.setShortcut(QtCore.Qt.Key.Key_Escape) @@ -957,6 +972,26 @@ def select_all_action_callback(self): self.preview_panel.update_widgets(update_preview=False) + def select_inverse_action_callback(self): + """Invert the selection of all visible items.""" + new_selected = [] + + for item in self.item_thumbs: + if item.mode and not item.isHidden(): + if item.item_id in self.selected: + item.thumb_button.set_selected(False) + else: + item.thumb_button.set_selected(True) + new_selected.append(item.item_id) + + self.selected = new_selected + + self.set_macro_menu_viability() + self.set_clipboard_menu_viability() + self.set_select_actions_visibility() + + self.preview_panel.update_widgets(update_preview=False) + def clear_select_action_callback(self): self.selected.clear() self.set_select_actions_visibility() @@ -1479,8 +1514,10 @@ def set_select_actions_visibility(self): if self.frame_content: self.select_all_action.setEnabled(True) + self.select_inverse_action.setEnabled(True) else: self.select_all_action.setEnabled(False) + self.select_inverse_action.setEnabled(False) if self.selected: self.add_tag_to_selected_action.setEnabled(True) diff --git a/src/tagstudio/resources/translations/en.json b/src/tagstudio/resources/translations/en.json index 5b463e40e..aed31a4df 100644 --- a/src/tagstudio/resources/translations/en.json +++ b/src/tagstudio/resources/translations/en.json @@ -229,6 +229,7 @@ "select.add_tag_to_selected": "Add Tag to Selected", "select.all": "Select All", "select.clear": "Clear Selection", + "select.inverse": "Select Inverse", "settings.clear_thumb_cache.title": "Clear Thumbnail Cache", "settings.filepath.label": "Filepath Visibility", "settings.filepath.option.full": "Show Full Paths", From 56b61b6bba3ccf8913d5ad590569c1762fec5297 Mon Sep 17 00:00:00 2001 From: Tony <1414927+zfbx@users.noreply.github.com> Date: Sat, 5 Apr 2025 07:12:45 -0400 Subject: [PATCH 2/2] Rename Select Inverse to Invert Selection --- src/tagstudio/resources/translations/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tagstudio/resources/translations/en.json b/src/tagstudio/resources/translations/en.json index aed31a4df..2d0b029b7 100644 --- a/src/tagstudio/resources/translations/en.json +++ b/src/tagstudio/resources/translations/en.json @@ -229,7 +229,7 @@ "select.add_tag_to_selected": "Add Tag to Selected", "select.all": "Select All", "select.clear": "Clear Selection", - "select.inverse": "Select Inverse", + "select.inverse": "Invert Selection", "settings.clear_thumb_cache.title": "Clear Thumbnail Cache", "settings.filepath.label": "Filepath Visibility", "settings.filepath.option.full": "Show Full Paths",