From 97ee43c8758ed814c1413588029c0e0c73e54bea Mon Sep 17 00:00:00 2001 From: Tony <1414927+zfbx@users.noreply.github.com> Date: Sat, 5 Apr 2025 20:59:44 -0400 Subject: [PATCH] feat: add ability to invert selection (#909) * implement selection inversing * Rename Select Inverse to Invert Selection --- 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 ff6d4856..804f5098 100644 --- a/src/tagstudio/qt/ts_qt.py +++ b/src/tagstudio/qt/ts_qt.py @@ -473,6 +473,21 @@ class QtDriver(DriverMixin, QObject): 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 @@ class QtDriver(DriverMixin, QObject): 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 @@ class QtDriver(DriverMixin, QObject): 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 5b463e40..2d0b029b 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": "Invert Selection", "settings.clear_thumb_cache.title": "Clear Thumbnail Cache", "settings.filepath.label": "Filepath Visibility", "settings.filepath.option.full": "Show Full Paths",