From faf96c14a1bb67cf03713c52106a56ac5a7a33e1 Mon Sep 17 00:00:00 2001 From: Jochen Becher Date: Sun, 21 Apr 2024 19:44:43 +0200 Subject: ModelEditor: Improve panning Change-Id: Iacb3e2bb9006d306852f18b50bbec322abb5acdf Reviewed-by: Alessandro Portale Reviewed-by: --- .../qmt/diagram_widgets_ui/diagramview.cpp | 39 +++++++++++++++++++++- .../qmt/diagram_widgets_ui/diagramview.h | 7 ++++ 2 files changed, 45 insertions(+), 1 deletion(-) (limited to 'src/libs/modelinglib') diff --git a/src/libs/modelinglib/qmt/diagram_widgets_ui/diagramview.cpp b/src/libs/modelinglib/qmt/diagram_widgets_ui/diagramview.cpp index 5634c4eb7f4..eba246676d1 100644 --- a/src/libs/modelinglib/qmt/diagram_widgets_ui/diagramview.cpp +++ b/src/libs/modelinglib/qmt/diagram_widgets_ui/diagramview.cpp @@ -14,9 +14,14 @@ #include #include #include +#include namespace qmt { +namespace { +const qreal ADJUSTMENT = 80; +}; + DiagramView::DiagramView(QWidget *parent) : QGraphicsView(parent) { @@ -25,6 +30,9 @@ DiagramView::DiagramView(QWidget *parent) setDragMode(QGraphicsView::RubberBandDrag); setFrameShape(QFrame::NoFrame); setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); + m_panTimer.setInterval(200); + m_panTimer.setSingleShot(false); + connect(&m_panTimer, &QTimer::timeout, this, &DiagramView::onPanTimeout); } DiagramView::~DiagramView() @@ -130,12 +138,41 @@ void DiagramView::dropEvent(QDropEvent *event) } } +void DiagramView::mousePressEvent(QMouseEvent *event) +{ + m_panTimer.start(); + QGraphicsView::mousePressEvent(event); +} + +void DiagramView::mouseReleaseEvent(QMouseEvent *event) +{ + m_panTimer.stop(); + QGraphicsView::mouseReleaseEvent(event); +} + +void DiagramView::mouseMoveEvent(QMouseEvent *event) +{ + QGraphicsView::mouseMoveEvent(event); + m_lastMouse = event->pos(); +} + void DiagramView::onSceneRectChanged(const QRectF &sceneRect) { // add some adjustment to all 4 sides - static const qreal ADJUSTMENT = 80; QRectF rect = sceneRect.adjusted(-ADJUSTMENT, -ADJUSTMENT, ADJUSTMENT, ADJUSTMENT); setSceneRect(rect); } +void DiagramView::onPanTimeout() +{ + if (m_lastMouse.x() < ADJUSTMENT) + horizontalScrollBar()->triggerAction(QScrollBar::SliderSingleStepSub); + else if (m_lastMouse.x() > viewport()->size().width() - ADJUSTMENT) + horizontalScrollBar()->triggerAction(QScrollBar::SliderSingleStepAdd); + if (m_lastMouse.y() < ADJUSTMENT) + verticalScrollBar()->triggerAction(QScrollBar::SliderSingleStepSub); + else if (m_lastMouse.y() > viewport()->size().height() - ADJUSTMENT) + verticalScrollBar()->triggerAction(QScrollBar::SliderSingleStepAdd); +} + } // namespace qmt diff --git a/src/libs/modelinglib/qmt/diagram_widgets_ui/diagramview.h b/src/libs/modelinglib/qmt/diagram_widgets_ui/diagramview.h index 41386f09bdb..4eee60ff44d 100644 --- a/src/libs/modelinglib/qmt/diagram_widgets_ui/diagramview.h +++ b/src/libs/modelinglib/qmt/diagram_widgets_ui/diagramview.h @@ -7,6 +7,7 @@ #include "qmt/infrastructure/qmt_global.h" #include +#include namespace qmt { @@ -27,11 +28,17 @@ protected: void dragLeaveEvent(QDragLeaveEvent *event) override; void dragMoveEvent(QDragMoveEvent *event) override; void dropEvent(QDropEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; private: void onSceneRectChanged(const QRectF &sceneRect); + void onPanTimeout(); QPointer m_diagramSceneModel; + QPointF m_lastMouse; + QTimer m_panTimer; }; } // namespace qmt -- cgit v1.2.3