diff --git a/beeref/scene.py b/beeref/scene.py index 37aa061..09d86c9 100644 --- a/beeref/scene.py +++ b/beeref/scene.py @@ -127,7 +127,9 @@ class BeeGraphicsScene(QtWidgets.QGraphicsScene): def mouseReleaseEvent(self, event): if self.rubberband_active: - self.removeItem(self.rubberband_item) + if self.rubberband_item.scene(): + logger.debug('Ending rubberband selection') + self.removeItem(self.rubberband_item) self.rubberband_active = False if self.move_active and self.has_selection(): delta = event.scenePos() - self.event_start diff --git a/beeref/selection.py b/beeref/selection.py index eeeb5b0..1fa23ee 100644 --- a/beeref/selection.py +++ b/beeref/selection.py @@ -164,7 +164,7 @@ class SelectableMixin(BaseItemMixin): def shape(self): shape_ = super().shape() - if self.has_selection_outline(): + if self.has_selection_handles(): # Add extra space for scale and rotate interactive areas path = QtGui.QPainterPath() for corner in self.corners: diff --git a/tests/test_scene.py b/tests/test_scene.py index e4f4bc9..6a86c53 100644 --- a/tests/test_scene.py +++ b/tests/test_scene.py @@ -11,7 +11,7 @@ from beeref.scene import BeeGraphicsScene from .base import BeeTestCase -class BeeGraphicsSceneNormalizeTestCase(BeeTestCase): +class BeeGraphicsSceneTestCase(BeeTestCase): def setUp(self): self.undo_stack = QtGui.QUndoStack() @@ -230,6 +230,7 @@ class BeeGraphicsSceneNormalizeTestCase(BeeTestCase): def test_mouse_release_event_when_rubberband_active(self, mouse_mock): event = MagicMock() self.scene.rubberband_active = True + self.scene.addItem(self.scene.rubberband_item) self.scene.removeItem = MagicMock() self.scene.mouseReleaseEvent(event) diff --git a/tests/test_selection.py b/tests/test_selection.py index 7218241..c4023be 100644 --- a/tests/test_selection.py +++ b/tests/test_selection.py @@ -244,7 +244,7 @@ class SelectableMixinTestCase(SelectableMixinBaseTestCase): assert shape.bottomRight().x() == 100 assert shape.bottomRight().y() == 80 - def test_shape_when_selected(self): + def test_shape_when_selected_single(self): self.item.SELECT_RESIZE_SIZE = 10 self.item.SELECT_ROTATE_SIZE = 10 self.view.get_scale = MagicMock(return_value=1) @@ -260,6 +260,25 @@ class SelectableMixinTestCase(SelectableMixinBaseTestCase): assert shape.bottomRight().x() == 115 assert shape.bottomRight().y() == 95 + def test_shape_when_selected_multi(self): + item2 = BeePixmapItem(QtGui.QImage()) + self.scene.addItem(item2) + item2.setSelected(True) + self.item.SELECT_RESIZE_SIZE = 10 + self.item.SELECT_ROTATE_SIZE = 10 + self.view.get_scale = MagicMock(return_value=1) + self.item.setSelected(True) + path = QtGui.QPainterPath() + path.addRect(QtCore.QRectF(0, 0, 100, 80)) + + with patch('PyQt6.QtWidgets.QGraphicsPixmapItem.shape', + return_value=path): + shape = self.item.shape().boundingRect() + assert shape.topLeft().x() == 0 + assert shape.topLeft().y() == 0 + assert shape.bottomRight().x() == 100 + assert shape.bottomRight().y() == 80 + class SelectableMixinScalingTestCase(SelectableMixinBaseTestCase):