Fix rotate and scale pushing undo command when no movement

This commit is contained in:
Rebecca Breu 2021-05-16 15:56:07 +02:00
parent 5fde9f35a7
commit 1de1e2eec9
2 changed files with 40 additions and 12 deletions

View file

@ -474,23 +474,25 @@ class SelectableMixin(BaseItemMixin):
just_selected = self.just_selected
self.just_selected = False
if self.scale_active:
self.scene().undo_stack.push(
commands.ScaleItemsBy(
self.selection_action_items(),
self.get_scale_factor(event),
self.event_anchor,
ignore_first_redo=True))
if self.get_scale_factor(event) != 1:
self.scene().undo_stack.push(
commands.ScaleItemsBy(
self.selection_action_items(),
self.get_scale_factor(event),
self.event_anchor,
ignore_first_redo=True))
event.accept()
self.reset_actions()
return
elif self.rotate_active:
self.scene().on_selection_change()
self.scene().undo_stack.push(
commands.RotateItemsBy(
self.selection_action_items(),
self.get_rotate_delta(event.scenePos()),
self.event_anchor,
ignore_first_redo=True))
if self.get_rotate_delta(event.scenePos()) != 0:
self.scene().undo_stack.push(
commands.RotateItemsBy(
self.selection_action_items(),
self.get_rotate_delta(event.scenePos()),
self.event_anchor,
ignore_first_redo=True))
event.accept()
self.reset_actions()
return

View file

@ -827,6 +827,19 @@ class SelectableMixinMouseEventsTestCase(SelectableMixinBaseTestCase):
assert cmd.ignore_first_redo is True
assert self.item.scale_active is False
def test_mouse_release_event_when_scale_action_zero(self):
self.event.scenePos = MagicMock(return_value=QtCore.QPointF(20, 90))
self.item.scale_active = True
self.item.event_direction = QtCore.QPointF(1, 1) / math.sqrt(2)
self.item.event_anchor = QtCore.QPointF(100, 80)
self.item.event_start = QtCore.QPointF(20, 90)
self.item.scale_orig_factor = 1
self.scene.undo_stack = MagicMock(push=MagicMock())
self.item.mouseReleaseEvent(self.event)
self.scene.undo_stack.push.assert_not_called()
assert self.item.scale_active is False
def test_mouse_release_event_when_rotate_action(self):
self.event.scenePos = MagicMock(return_value=QtCore.QPointF(15, 25))
self.item.rotate_active = True
@ -836,6 +849,7 @@ class SelectableMixinMouseEventsTestCase(SelectableMixinBaseTestCase):
self.scene.undo_stack = MagicMock(push=MagicMock())
self.item.mouseReleaseEvent(self.event)
self.scene.undo_stack.push.assert_called_once()
args = self.scene.undo_stack.push.call_args_list[0][0]
cmd = args[0]
isinstance(cmd, commands.RotateItemsBy)
@ -845,6 +859,18 @@ class SelectableMixinMouseEventsTestCase(SelectableMixinBaseTestCase):
assert cmd.ignore_first_redo is True
assert self.item.rotate_active is False
def test_mouse_release_event_when_rotate_action_zero(self):
self.event.scenePos = MagicMock(return_value=QtCore.QPointF(15, 25))
self.item.rotate_active = True
self.item.rotate_orig_degrees = 0
self.item.rotate_start_angle = -45
self.item.event_anchor = QtCore.QPointF(10, 20)
self.scene.undo_stack = MagicMock(push=MagicMock())
self.item.mouseReleaseEvent(self.event)
self.scene.undo_stack.push.assert_not_called()
assert self.item.rotate_active is False
def test_mouse_release_event_when_flip_action(self):
self.event.pos = MagicMock(return_value=QtCore.QPointF(0, 40))
self.item.flip_active = True