Fix fit view issues; enable zoom anchor

This commit is contained in:
Rebecca Breu 2021-04-14 21:04:40 +02:00
parent 079c0a1829
commit ea833d830a
2 changed files with 22 additions and 22 deletions

View file

@ -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):
('<p>Problem loading file %s</p>'
'<p>Not accessible or not a proper bee file</p>') % 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}')

View file

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