From 7ab442f6b5684598bbb2f4da879a29f3f7ec75b3 Mon Sep 17 00:00:00 2001 From: Rebecca Breu Date: Sat, 17 Apr 2021 13:01:15 +0200 Subject: [PATCH] Add Select All/Deselect All --- beeref/actions/actions.py | 12 ++++++++++++ beeref/actions/menu_structure.py | 4 ++++ beeref/items.py | 4 +++- beeref/scene.py | 5 +++++ beeref/view.py | 6 ++++++ tests/test_scene.py | 24 ++++++++++++++++++++++++ 6 files changed, 54 insertions(+), 1 deletion(-) diff --git a/beeref/actions/actions.py b/beeref/actions/actions.py index db58a76..3064427 100644 --- a/beeref/actions/actions.py +++ b/beeref/actions/actions.py @@ -163,4 +163,16 @@ actions = [ 'group': 'active_when_selection', 'enabled': False, }, + { + 'id': 'select_all', + 'text': '&Select All', + 'shortcuts': ['Ctrl+A'], + 'callback': 'on_action_select_all', + }, + { + 'id': 'deselect_all', + 'text': 'Deselect &All', + 'shortcuts': ['Ctrl+Shift+A'], + 'callback': 'on_action_deselect_all', + }, ] diff --git a/beeref/actions/menu_structure.py b/beeref/actions/menu_structure.py index 3949878..77b0c09 100644 --- a/beeref/actions/menu_structure.py +++ b/beeref/actions/menu_structure.py @@ -33,6 +33,10 @@ menu_structure = [ 'items': [ 'undo', 'redo', + MENU_SEPARATOR, + 'select_all', + 'deselect_all', + MENU_SEPARATOR, 'paste', 'delete', ], diff --git a/beeref/items.py b/beeref/items.py index 0a71246..911bc71 100644 --- a/beeref/items.py +++ b/beeref/items.py @@ -84,5 +84,7 @@ class BeePixmapItem(SelectableMixin, QtWidgets.QGraphicsPixmapItem): return [self] def on_selected_change(self, value): - if(value and self.scene() and not self.scene().has_selection()): + if(value and self.scene() + and not self.scene().has_selection() + and not self.scene().rubberband_active): self.bring_to_front() diff --git a/beeref/scene.py b/beeref/scene.py index aaf852f..9957b5f 100644 --- a/beeref/scene.py +++ b/beeref/scene.py @@ -95,6 +95,11 @@ class BeeGraphicsScene(QtWidgets.QGraphicsScene): self.get_selection_center(), vertical=vertical)) + def set_selected_all_items(self, value): + """Sets the selection mode of all items to ``value``.""" + for item in self.items(): + item.setSelected(value) + def has_selection(self): """Checks whether there are currently items selected.""" diff --git a/beeref/view.py b/beeref/view.py index 04d001d..be9e75b 100644 --- a/beeref/view.py +++ b/beeref/view.py @@ -151,6 +151,12 @@ class BeeGraphicsView(QtWidgets.QGraphicsView, ActionsMixin): logger.debug('Redo: %s' % self.undo_stack.redoText()) self.undo_stack.redo() + def on_action_select_all(self): + self.scene.set_selected_all_items(True) + + def on_action_deselect_all(self): + self.scene.set_selected_all_items(False) + def on_action_delete_items(self): logger.debug('Deleting items...') self.undo_stack.push( diff --git a/tests/test_scene.py b/tests/test_scene.py index 430e7fb..b7f7121 100644 --- a/tests/test_scene.py +++ b/tests/test_scene.py @@ -82,6 +82,30 @@ class BeeGraphicsSceneTestCase(BeeTestCase): assert cmd.anchor == QtCore.QPointF(60, 50) assert cmd.vertical is True + def test_set_selection_all_items_when_true(self): + item1 = BeePixmapItem(QtGui.QImage()) + self.scene.addItem(item1) + item1.setSelected(True) + item2 = BeePixmapItem(QtGui.QImage()) + self.scene.addItem(item2) + item2.setSelected(True) + + self.scene.set_selected_all_items(True) + assert item1.isSelected() is True + assert item2.isSelected() is True + + def test_set_selection_all_items_when_false(self): + item1 = BeePixmapItem(QtGui.QImage()) + self.scene.addItem(item1) + item1.setSelected(True) + item2 = BeePixmapItem(QtGui.QImage()) + self.scene.addItem(item2) + item2.setSelected(True) + + self.scene.set_selected_all_items(False) + assert item1.isSelected() is False + assert item2.isSelected() is False + def test_has_selection_when_no_selection(self): item = BeePixmapItem(QtGui.QImage()) self.scene.addItem(item)