Minor fixes for rubberband selection

Changed item shape so that it doesn't include handles during multi selection. This gives a more accurate behaviour for getting items out of the rubberband selection (except for the last remaining item, oh well).
This commit is contained in:
Rebecca Breu 2021-04-04 16:23:56 +02:00
parent 37a01f80a2
commit 476c061071
4 changed files with 26 additions and 4 deletions

View file

@ -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

View file

@ -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:

View file

@ -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)

View file

@ -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):