summaryrefslogtreecommitdiff
path: root/src/graphicsview.cpp
diff options
context:
space:
mode:
authorNikita Kostovsky <nikita@kostovsky.me>2025-09-19 14:28:21 +0200
committerNikita Kostovsky <nikita@kostovsky.me>2025-09-19 21:04:04 +0200
commitad001563fda4a9061909bd09dcf51238138014d6 (patch)
tree5394cc0436d6ef811b6b791c37a233047c99247d /src/graphicsview.cpp
initial commit
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);
+}