diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index c67856c1..5a9935b6 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -974,8 +974,21 @@ class QtDriver(DriverMixin, QObject): sa.setWidgetResizable(True) sa.setWidget(self.flow_container) - def select_item(self, item_id: int, append: bool, bridge: bool): - """Select one or more items in the Thumbnail Grid.""" + def toggle_item_selection(self, item_id: int, append: bool, bridge: bool): + """Toggle the selection of an item in the Thumbnail Grid. + + If an item is not selected, this selects it. If an item is already selected, this will + deselect it as long as append and bridge are False. + + Args: + item_id(int): The ID of the item/entry to select. + append(bool): Whether or not to add this item to the previous selection + or to restart the selection with this item. + Setting to True acts like "Ctrl + Click" selecting. + bridge(bool): Whether or not to select items in the visual range of the last item + selected and this current item. + Setting to True acts like "Shift + Click" selecting. + """ logger.info("[QtDriver] Selecting Items:", item_id=item_id, append=append, bridge=bridge) if append: @@ -1175,7 +1188,7 @@ class QtDriver(DriverMixin, QObject): item_thumb.assign_badge(BadgeType.FAVORITE, entry.is_favorite) item_thumb.update_clickable( clickable=( - lambda checked=False, item_id=entry.id: self.select_item( + lambda checked=False, item_id=entry.id: self.toggle_item_selection( item_id, append=( QGuiApplication.keyboardModifiers() diff --git a/tagstudio/tests/qt/test_field_containers.py b/tagstudio/tests/qt/test_field_containers.py index fb2cd9ba..e501866d 100644 --- a/tagstudio/tests/qt/test_field_containers.py +++ b/tagstudio/tests/qt/test_field_containers.py @@ -5,8 +5,8 @@ def test_update_selection_empty(qt_driver, library): panel = PreviewPanel(library, qt_driver) # Clear the library selection (selecting 1 then unselecting 1) - qt_driver.select_item(1, append=False, bridge=False) - qt_driver.select_item(1, append=True, bridge=False) + qt_driver.toggle_item_selection(1, append=False, bridge=False) + qt_driver.toggle_item_selection(1, append=True, bridge=False) panel.update_widgets() # FieldContainer should hide all containers @@ -18,7 +18,7 @@ def test_update_selection_single(qt_driver, library, entry_full): panel = PreviewPanel(library, qt_driver) # Select the single entry - qt_driver.select_item(entry_full.id, append=False, bridge=False) + qt_driver.toggle_item_selection(entry_full.id, append=False, bridge=False) panel.update_widgets() # FieldContainer should show all applicable tags and field containers @@ -32,8 +32,8 @@ def test_update_selection_multiple(qt_driver, library): panel = PreviewPanel(library, qt_driver) # Select the multiple entries - qt_driver.select_item(1, append=False, bridge=False) - qt_driver.select_item(2, append=True, bridge=False) + qt_driver.toggle_item_selection(1, append=False, bridge=False) + qt_driver.toggle_item_selection(2, append=True, bridge=False) panel.update_widgets() # FieldContainer should show mixed field editing @@ -47,7 +47,7 @@ def test_add_tag_to_selection_single(qt_driver, library, entry_full): assert {t.id for t in entry_full.tags} == {1000} # Select the single entry - qt_driver.select_item(entry_full.id, append=False, bridge=False) + qt_driver.toggle_item_selection(entry_full.id, append=False, bridge=False) panel.update_widgets() # Add new tag @@ -64,7 +64,7 @@ def test_add_same_tag_to_selection_single(qt_driver, library, entry_full): assert {t.id for t in entry_full.tags} == {1000} # Select the single entry - qt_driver.select_item(entry_full.id, append=False, bridge=False) + qt_driver.toggle_item_selection(entry_full.id, append=False, bridge=False) panel.update_widgets() # Add an existing tag @@ -94,7 +94,7 @@ def test_add_tag_to_selection_multiple(qt_driver, library): # Select the multiple entries for i, e in enumerate(library.get_entries(with_joins=True), start=0): - qt_driver.select_item(e.id, append=(True if i == 0 else False), bridge=False) # noqa: SIM210 + qt_driver.toggle_item_selection(e.id, append=(True if i == 0 else False), bridge=False) # noqa: SIM210 panel.update_widgets() # Add new tag @@ -122,7 +122,7 @@ def test_meta_tag_category(qt_driver, library, entry_full): library.add_tags_to_entry(1, entry_full.id) # Select the single entry - qt_driver.select_item(entry_full.id, append=False, bridge=False) + qt_driver.toggle_item_selection(entry_full.id, append=False, bridge=False) panel.update_widgets() # FieldContainer should hide all containers @@ -154,7 +154,7 @@ def test_custom_tag_category(qt_driver, library, entry_full): library.add_tags_to_entry(1, entry_full.id) # Select the single entry - qt_driver.select_item(entry_full.id, append=False, bridge=False) + qt_driver.toggle_item_selection(entry_full.id, append=False, bridge=False) panel.update_widgets() # FieldContainer should hide all containers diff --git a/tagstudio/tests/qt/test_preview_panel.py b/tagstudio/tests/qt/test_preview_panel.py index 569fb80d..12b64af9 100644 --- a/tagstudio/tests/qt/test_preview_panel.py +++ b/tagstudio/tests/qt/test_preview_panel.py @@ -5,8 +5,8 @@ def test_update_selection_empty(qt_driver, library): panel = PreviewPanel(library, qt_driver) # Clear the library selection (selecting 1 then unselecting 1) - qt_driver.select_item(1, append=False, bridge=False) - qt_driver.select_item(1, append=True, bridge=False) + qt_driver.toggle_item_selection(1, append=False, bridge=False) + qt_driver.toggle_item_selection(1, append=True, bridge=False) panel.update_widgets() # Panel should disable UI that allows for entry modification @@ -18,7 +18,7 @@ def test_update_selection_single(qt_driver, library, entry_full): panel = PreviewPanel(library, qt_driver) # Select the single entry - qt_driver.select_item(entry_full.id, append=False, bridge=False) + qt_driver.toggle_item_selection(entry_full.id, append=False, bridge=False) panel.update_widgets() # Panel should enable UI that allows for entry modification @@ -30,8 +30,8 @@ def test_update_selection_multiple(qt_driver, library): panel = PreviewPanel(library, qt_driver) # Select the multiple entries - qt_driver.select_item(1, append=False, bridge=False) - qt_driver.select_item(2, append=True, bridge=False) + qt_driver.toggle_item_selection(1, append=False, bridge=False) + qt_driver.toggle_item_selection(2, append=True, bridge=False) panel.update_widgets() # Panel should enable UI that allows for entry modification diff --git a/tagstudio/tests/qt/test_qt_driver.py b/tagstudio/tests/qt/test_qt_driver.py index 0cda8151..c0545373 100644 --- a/tagstudio/tests/qt/test_qt_driver.py +++ b/tagstudio/tests/qt/test_qt_driver.py @@ -29,7 +29,7 @@ from src.qt.widgets.item_thumb import ItemThumb # assert thumb.isVisible() == (idx == 0) -# def test_select_item_bridge(qt_driver, entry_min): +# def test_toggle_item_selection_bridge(qt_driver, entry_min): # # mock some props since we're not running `start()` # qt_driver.autofill_action = Mock() # qt_driver.sort_fields_action = Mock() @@ -42,22 +42,22 @@ from src.qt.widgets.item_thumb import ItemThumb # assert len(qt_driver.item_thumbs) == 3 # # select first item -# qt_driver.select_item(0, append=False, bridge=False) +# qt_driver.toggle_item_selection(0, append=False, bridge=False) # assert qt_driver.selected == [0] # # add second item to selection -# qt_driver.select_item(1, append=False, bridge=True) +# qt_driver.toggle_item_selection(1, append=False, bridge=True) # assert qt_driver.selected == [0, 1] # # add third item to selection -# qt_driver.select_item(2, append=False, bridge=True) +# qt_driver.toggle_item_selection(2, append=False, bridge=True) # assert qt_driver.selected == [0, 1, 2] # # select third item only -# qt_driver.select_item(2, append=False, bridge=False) +# qt_driver.toggle_item_selection(2, append=False, bridge=False) # assert qt_driver.selected == [2] -# qt_driver.select_item(0, append=False, bridge=True) +# qt_driver.toggle_item_selection(0, append=False, bridge=True) # assert qt_driver.selected == [0, 1, 2]