aboutsummaryrefslogtreecommitdiff
path: root/qtmips_gui/graphicsview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qtmips_gui/graphicsview.cpp')
-rw-r--r--qtmips_gui/graphicsview.cpp46
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);
+ }
+}