summaryrefslogtreecommitdiff
path: root/src/graphicsview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/graphicsview.cpp')
-rw-r--r--src/graphicsview.cpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/graphicsview.cpp b/src/graphicsview.cpp
new file mode 100644
index 0000000..b81cff4
--- /dev/null
+++ b/src/graphicsview.cpp
@@ -0,0 +1,47 @@
+#include "graphicsview.h"
+
+// qt
+#include <QWheelEvent>
+
+GraphicsView::GraphicsView(QWidget* parent)
+ : QGraphicsView{parent}
+{
+ init();
+}
+
+GraphicsView::GraphicsView(QGraphicsScene* scene, QWidget* parent)
+ : QGraphicsView{scene, parent}
+{
+ init();
+}
+
+void GraphicsView::wheelEvent(QWheelEvent* event)
+{
+ setTransformationAnchor(GraphicsView::AnchorUnderMouse);
+
+ QPoint pixels = event->pixelDelta();
+ QPoint degrees = event->angleDelta();
+ const auto oldScenePos = event->scenePosition();
+ const auto oldMapped = mapToScene(event->position().toPoint());
+
+ if (pixels.isNull() && degrees.isNull())
+ return;
+
+ const double scaleMultiplier{1.1};
+ const auto steps = double(pixels.isNull() ? degrees.y() : pixels.y());
+ auto actualScale = std::abs(steps) * scaleMultiplier /
+ double(QWheelEvent::DefaultDeltasPerStep);
+
+ if (steps < 0)
+ actualScale = 1 / actualScale;
+
+ scale(actualScale, actualScale);
+
+ event->accept();
+}
+
+void GraphicsView::init()
+{
+ setDragMode(QGraphicsView::ScrollHandDrag);
+ setRenderHint(QPainter::Antialiasing, true);
+}