aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavel Pisa <pisa@cmp.felk.cvut.cz>2019-04-05 17:36:11 +0200
committerPavel Pisa <pisa@cmp.felk.cvut.cz>2019-04-05 17:36:11 +0200
commit7becab88ae5287846299f22d291ccd44740fddbc (patch)
tree7df4760ec28bd30c9586204c8955e809437a2d10
parent476af4ac713b88597e628ff8415ae2890757d574 (diff)
downloadqtmips-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.cpp46
-rw-r--r--qtmips_gui/graphicsview.h11
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