ModelEditor: Zoom large diagrams at mouse cursor

Change-Id: I56da68cbf2175e76bbfe8c64641a366d0d38b878
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Jochen Becher
2018-08-09 14:53:40 +02:00
parent 741885a52b
commit 6db88a5927
4 changed files with 37 additions and 6 deletions

View File

@@ -101,6 +101,7 @@
#include <QUndoStack>
#include <QVBoxLayout>
#include <QMenu>
#include <QScrollBar>
#include <algorithm>
@@ -422,9 +423,9 @@ void ModelEditor::initDocument()
this, &ModelEditor::onCurrentEditorChanged, Qt::QueuedConnection);
connect(d->diagramView, &EditorDiagramView::zoomIn,
this, &ModelEditor::zoomIn);
this, &ModelEditor::zoomInAtPos);
connect(d->diagramView, &EditorDiagramView::zoomOut,
this, &ModelEditor::zoomOut);
this, &ModelEditor::zoomOutAtPos);
connect(d->modelTreeView->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &ModelEditor::onTreeViewSelectionChanged, Qt::QueuedConnection);
@@ -646,6 +647,33 @@ void ModelEditor::zoomOut()
showZoomIndicator();
}
void ModelEditor::zoomInAtPos(const QPoint &pos)
{
zoomAtPos(pos, ZOOM_FACTOR);
}
void ModelEditor::zoomOutAtPos(const QPoint &pos)
{
zoomAtPos(pos, 1.0 / ZOOM_FACTOR);
}
void ModelEditor::zoomAtPos(const QPoint &pos, double scale)
{
QPointF scenePos = d->diagramView->mapToScene(pos);
QTransform transform = d->diagramView->transform();
transform.scale(scale, scale);
d->diagramView->setTransform(transform);
QPoint scaledPos = d->diagramView->mapFromScene(scenePos);
QPoint delta = pos - scaledPos;
QScrollBar *hBar = d->diagramView->horizontalScrollBar();
if (hBar)
hBar->setValue(hBar->value() - delta.x());
QScrollBar *vBar = d->diagramView->verticalScrollBar();
if (vBar)
vBar->setValue(vBar->value() - delta.y());
showZoomIndicator();
}
void ModelEditor::resetZoom()
{
d->diagramView->setTransform(QTransform());