From 7becab88ae5287846299f22d291ccd44740fddbc Mon Sep 17 00:00:00 2001 From: Pavel Pisa Date: Fri, 5 Apr 2019 17:36:11 +0200 Subject: Implement standard zoom handling by mouse wheel and keys. Suggested by Ales Kapica. Signed-off-by: Pavel Pisa --- qtmips_gui/graphicsview.cpp | 46 +++++++++++++++++++++++++++++++++++++++++---- qtmips_gui/graphicsview.h | 11 ++++++++++- 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/qtmips_gui/graphicsview.cpp b/qtmips_gui/graphicsview.cpp index 6dc679d..88a8c6e 100644 --- a/qtmips_gui/graphicsview.cpp +++ b/qtmips_gui/graphicsview.cpp @@ -35,18 +35,21 @@ #include "graphicsview.h" -GraphicsView::GraphicsView(QWidget *parent) : QGraphicsView(parent) { +GraphicsView::GraphicsView(QWidget *parent) : Super(parent) { + prev_height = 0; + prev_width = 0; setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); } void GraphicsView::setScene(QGraphicsScene *scene) { - QGraphicsView::setScene(scene); + Super::setScene(scene); update_scale(); } void GraphicsView::resizeEvent(QResizeEvent *event) { - QGraphicsView::resizeEvent(event); - update_scale(); + Super::resizeEvent(event); + if ((width() != prev_height) || (height() != prev_width)) + update_scale(); } void GraphicsView::update_scale() { @@ -56,6 +59,8 @@ void GraphicsView::update_scale() { // Note: there is somehow three pixels error when viewing so we have to always compensate const int w = scene()->width() + 3; const int h = scene()->height() + 3; + prev_height = width(); + prev_width = height(); qreal scale = 1; if (height() > h && width() > w) { @@ -69,3 +74,36 @@ void GraphicsView::update_scale() { t.scale(scale, scale); setTransform(t, false); } + +void GraphicsView::wheelEvent(QWheelEvent *event) { + if (event->modifiers() & Qt::ControlModifier) { + // zoom + const ViewportAnchor anchor = transformationAnchor(); + setTransformationAnchor(QGraphicsView::AnchorUnderMouse); + int angle = event->angleDelta().y(); + qreal factor; + if (angle > 0) { + factor = 1.1; + } else { + factor = 0.9; + } + scale(factor, factor); + setTransformationAnchor(anchor); + } else { + Super::wheelEvent(event); + } +} + +void GraphicsView::keyPressEvent(QKeyEvent *event) { + qreal factor = 1.1; + if (event->matches(QKeySequence::ZoomIn) || + (event->key() == Qt::Key_Equal) || + (event->key() == Qt::Key_Plus)) { + scale(factor, factor); + } else if (event->matches(QKeySequence::ZoomOut) || + (event->key() == Qt::Key_Minus)) { + scale(1 / factor, 1 / factor); + } else { + Super::keyPressEvent(event); + } +} diff --git a/qtmips_gui/graphicsview.h b/qtmips_gui/graphicsview.h index 8b47611..b970e86 100644 --- a/qtmips_gui/graphicsview.h +++ b/qtmips_gui/graphicsview.h @@ -38,18 +38,27 @@ #include #include +#include +#include +#include class GraphicsView : public QGraphicsView { + Q_OBJECT + using Super = QGraphicsView; + public: GraphicsView(QWidget *parent); - void setScene(QGraphicsScene *scene); protected: void resizeEvent(QResizeEvent *event); + void wheelEvent(QWheelEvent *event) override; + void keyPressEvent(QKeyEvent *event) override; private: void update_scale(); + int prev_height; + int prev_width; }; #endif // GRAPHICSVIEW_H -- cgit v1.2.3