diff options
author | Pavel Pisa <pisa@cmp.felk.cvut.cz> | 2019-04-05 17:36:11 +0200 |
---|---|---|
committer | Pavel Pisa <pisa@cmp.felk.cvut.cz> | 2019-04-05 17:36:11 +0200 |
commit | 7becab88ae5287846299f22d291ccd44740fddbc (patch) | |
tree | 7df4760ec28bd30c9586204c8955e809437a2d10 | |
parent | 476af4ac713b88597e628ff8415ae2890757d574 (diff) | |
download | qtmips-7becab88ae5287846299f22d291ccd44740fddbc.tar.gz qtmips-7becab88ae5287846299f22d291ccd44740fddbc.tar.bz2 qtmips-7becab88ae5287846299f22d291ccd44740fddbc.zip |
Implement standard zoom handling by mouse wheel and keys.
Suggested by Ales Kapica.
Signed-off-by: Pavel Pisa <pisa@cmp.felk.cvut.cz>
-rw-r--r-- | qtmips_gui/graphicsview.cpp | 46 | ||||
-rw-r--r-- | 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 <QGraphicsView> #include <QGraphicsScene> +#include <QWheelEvent> +#include <QResizeEvent> +#include <QKeyEvent> 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 |