From ea833d830aa0c1f7ae29318b0ffdea98b41cd27c Mon Sep 17 00:00:00 2001 From: Rebecca Breu Date: Wed, 14 Apr 2021 21:04:40 +0200 Subject: [PATCH] Fix fit view issues; enable zoom anchor --- beeref/view.py | 23 ++++++++++++----------- tests/test_view.py | 21 ++++++++++----------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/beeref/view.py b/beeref/view.py index 75f1cfd..5106e77 100644 --- a/beeref/view.py +++ b/beeref/view.py @@ -37,6 +37,8 @@ class BeeGraphicsView(QtWidgets.QGraphicsView, ActionsMixin): super().__init__(parent) self.app = app self.setBackgroundBrush(QtGui.QBrush(QtGui.QColor(60, 60, 60))) + self.setTransformationAnchor( + QtWidgets.QGraphicsView.ViewportAnchor.AnchorUnderMouse) self.undo_stack = QtGui.QUndoStack(self) self.undo_stack.setUndoLimit(100) @@ -54,10 +56,6 @@ class BeeGraphicsView(QtWidgets.QGraphicsView, ActionsMixin): self.setFrameShape(QtWidgets.QFrame.Shape.NoFrame) self.setAcceptDrops(True) - # TBD: fix zoom anchor - why does this not work? - # self.setTransformationAnchor( - # QtWidgets.QGraphicsView.ViewportAnchor.AnchorUnderMouse) - self.previous_transform = None self.pan_active = False self.scene.changed.connect(self.on_scene_changed) @@ -120,21 +118,24 @@ class BeeGraphicsView(QtWidgets.QGraphicsView, ActionsMixin): if toggle_item and self.previous_transform: logger.debug('Fit view: Reset to previous') self.setTransform(self.previous_transform['transform']) - self.horizontalScrollBar().setValue( - self.previous_transform['hscroll']) - self.verticalScrollBar().setValue( - self.previous_transform['vscroll']) + self.centerOn(self.previous_transform['center']) self.previous_transform = None return if toggle_item: self.previous_transform = { 'toggle_item': toggle_item, 'transform': QtGui.QTransform(self.transform()), - 'hscroll': self.horizontalScrollBar().value(), - 'vscroll': self.verticalScrollBar().value(), + 'center': self.mapToScene(self.get_view_center()), } + else: + self.previous_transform = None + logger.debug(f'Fit view: {rect}') self.fitInView(rect, Qt.AspectRatioMode.KeepAspectRatio) + self.recalc_scene_rect() + # It seems to be more reliable when we fit a second time + # Sometimes a changing scene rect can mess up the fitting + self.fitInView(rect, Qt.AspectRatioMode.KeepAspectRatio) def on_action_fit_scene(self): self.fit_rect(self.scene.itemsBoundingRect()) @@ -183,7 +184,7 @@ class BeeGraphicsView(QtWidgets.QGraphicsView, ActionsMixin): ('

Problem loading file %s

' '

Not accessible or not a proper bee file

') % filename) else: - QtCore.QTimer.singleShot(10, self.on_action_fit_scene) + self.on_action_fit_scene() def open_from_file(self, filename): logger.info(f'Opening file {filename}') diff --git a/tests/test_view.py b/tests/test_view.py index 62b83dd..c7c3965 100644 --- a/tests/test_view.py +++ b/tests/test_view.py @@ -110,9 +110,10 @@ class BeeGraphicsViewTestCase(BeeTestCase): @patch('beeref.view.BeeGraphicsView.fitInView') def test_fit_rect_no_toggle(self, fit_mock): rect = QtCore.QRectF(30, 40, 100, 80) + self.view.previous_transform = {'toggle_item': MagicMock()} self.view.fit_rect(rect) - fit_mock.assert_called_once_with( - rect, Qt.AspectRatioMode.KeepAspectRatio) + fit_mock.assert_called_with(rect, Qt.AspectRatioMode.KeepAspectRatio) + assert self.view.previous_transform is None @patch('beeref.view.BeeGraphicsView.fitInView') def test_fit_rect_toggle_when_no_previous(self, fit_mock): @@ -124,29 +125,27 @@ class BeeGraphicsViewTestCase(BeeTestCase): self.view.horizontalScrollBar().setValue(-40) self.view.verticalScrollBar().setValue(-50) self.view.fit_rect(rect, toggle_item=item) - fit_mock.assert_called_once_with( - rect, Qt.AspectRatioMode.KeepAspectRatio) + fit_mock.assert_called_with(rect, Qt.AspectRatioMode.KeepAspectRatio) assert self.view.previous_transform['toggle_item'] == item assert self.view.previous_transform['transform'].m11() == 2 - assert self.view.previous_transform['hscroll'] == -40 - assert self.view.previous_transform['vscroll'] == -50 + assert isinstance(self.view.previous_transform['center'], + QtCore.QPointF) @patch('beeref.view.BeeGraphicsView.fitInView') - def test_fit_rect_toggle_when_previous(self, fit_mock): + @patch('beeref.view.BeeGraphicsView.centerOn') + def test_fit_rect_toggle_when_previous(self, center_mock, fit_mock): item = MagicMock() self.view.previous_transform = { 'toggle_item': item, 'transform': QtGui.QTransform.fromScale(2, 2), - 'hscroll': -40, - 'vscroll': -50, + 'center': QtCore.QPointF(30, 40) } self.view.setSceneRect(QtCore.QRectF(-2000, -2000, 4000, 4000)) rect = QtCore.QRectF(30, 40, 100, 80) self.view.fit_rect(rect, toggle_item=item) fit_mock.assert_not_called() + center_mock.assert_called_once_with(QtCore.QPointF(30, 40)) assert self.view.get_scale() == 2 - self.view.horizontalScrollBar().value == -40 - self.view.verticalScrollBar().value == -50 @patch('beeref.view.BeeGraphicsView.clear_scene') def test_open_from_file(self, clear_mock):