mirror of
https://github.com/rbreu/beeref.git
synced 2026-03-11 08:54:28 +00:00
Fix fit view issues; enable zoom anchor
This commit is contained in:
parent
079c0a1829
commit
ea833d830a
2 changed files with 22 additions and 22 deletions
|
|
@ -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}')
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
Loading…
Reference in a new issue