diff options
Diffstat (limited to 'qtmips_gui/graphicsview.cpp')
-rw-r--r-- | qtmips_gui/graphicsview.cpp | 46 |
1 files changed, 42 insertions, 4 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); + } +} |