diff --git a/src/plugins/modeleditor/editordiagramview.cpp b/src/plugins/modeleditor/editordiagramview.cpp index 445ed2925ed..bf15165c80f 100644 --- a/src/plugins/modeleditor/editordiagramview.cpp +++ b/src/plugins/modeleditor/editordiagramview.cpp @@ -72,9 +72,9 @@ void EditorDiagramView::wheelEvent(QWheelEvent *wheelEvent) if (wheelEvent->modifiers() == Qt::ControlModifier) { int degree = wheelEvent->angleDelta().y() / 8; if (degree > 0) - emit zoomIn(); + emit zoomIn(wheelEvent->pos()); else if (degree < 0) - emit zoomOut(); + emit zoomOut(wheelEvent->pos()); } } diff --git a/src/plugins/modeleditor/editordiagramview.h b/src/plugins/modeleditor/editordiagramview.h index 5dd43b10944..0a939ab7ff4 100644 --- a/src/plugins/modeleditor/editordiagramview.h +++ b/src/plugins/modeleditor/editordiagramview.h @@ -44,8 +44,8 @@ public: ~EditorDiagramView() override; signals: - void zoomIn(); - void zoomOut(); + void zoomIn(const QPoint &zoomOrigin); + void zoomOut(const QPoint &zoomOrigin); public: void setPxNodeController(PxNodeController *pxNodeController); diff --git a/src/plugins/modeleditor/modeleditor.cpp b/src/plugins/modeleditor/modeleditor.cpp index 6cbd513eb74..264e7c8262e 100644 --- a/src/plugins/modeleditor/modeleditor.cpp +++ b/src/plugins/modeleditor/modeleditor.cpp @@ -101,6 +101,7 @@ #include #include #include +#include #include @@ -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()); diff --git a/src/plugins/modeleditor/modeleditor.h b/src/plugins/modeleditor/modeleditor.h index 639f7fab389..a6888a3ec62 100644 --- a/src/plugins/modeleditor/modeleditor.h +++ b/src/plugins/modeleditor/modeleditor.h @@ -91,6 +91,8 @@ public: void exportSelectedElements(); void zoomIn(); void zoomOut(); + void zoomInAtPos(const QPoint &pos); + void zoomOutAtPos(const QPoint &pos); void resetZoom(); qmt::MPackage *guessSelectedPackage() const; @@ -109,6 +111,7 @@ private: QWidget *parent); bool updateButtonIconByTheme(QAbstractButton *button, const QString &name); void showZoomIndicator(); + void zoomAtPos(const QPoint &pos, double scale); void onAddPackage(); void onAddComponent();