diff options
author | Lubomir I. Ivanov <neolit123@gmail.com> | 2013-07-04 23:55:27 +0300 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2013-07-04 22:59:46 -0700 |
commit | c7f8ada4ff5e84e2ea52e387806c640eee05f45f (patch) | |
tree | 51cc2989d029f67cb3837e802bc3dcf61735fbbd /qt-ui/profilegraphics.cpp | |
parent | 1257adfd267e04b3dbe149c9c5874132dc70ec62 (diff) | |
download | subsurface-c7f8ada4ff5e84e2ea52e387806c640eee05f45f.tar.gz |
Profile: attempt on better zoom and pan logic
QGraphicsView::AnchorUnderMouse does not work for
Qt 4.8.1 on Ubuntu 12.04 and if the mouseMoveEvent
overload is disabled it practically can be seen that
the anchor point is [0, 0] instead of the mouse location.
After a suggestion found on the web this patch attempts
to use the hidden scroll bars to calculate reposition
on pan and zoom *near the mouse cursor.
On the other hand QAbstactSlider (QScrollBar) class
strangly uses negative offsets for minimum scroll
position, which makes the implementation even more
ugly.
[*near] because it's not that accurate!
Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qt-ui/profilegraphics.cpp')
-rw-r--r-- | qt-ui/profilegraphics.cpp | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/qt-ui/profilegraphics.cpp b/qt-ui/profilegraphics.cpp index cfc1cf685..1cdd2d6e0 100644 --- a/qt-ui/profilegraphics.cpp +++ b/qt-ui/profilegraphics.cpp @@ -6,6 +6,7 @@ #include <QGraphicsScene> #include <QResizeEvent> #include <QGraphicsLineItem> +#include <QScrollBar> #include <QPen> #include <QBrush> #include <QDebug> @@ -67,12 +68,32 @@ ProfileGraphicsView::ProfileGraphicsView(QWidget* parent) : QGraphicsView(parent } +/* since we cannot use translate() directly on the scene we hack on + * the scroll bars (hidden) functionality */ +void ProfileGraphicsView::scrollViewTo(const QPoint pos) +{ + if (!zoomLevel) + return; + QScrollBar *vs = verticalScrollBar(); + QScrollBar *hs = horizontalScrollBar(); + const qreal yRat = pos.y() / sceneRect().height(); + const qreal xRat = pos.x() / sceneRect().width(); + const int vMax = vs->maximum(); + const int hMax = hs->maximum(); + const int vMin = vs->minimum(); + const int hMin = hs->minimum(); + /* QScrollBar receives crazy negative values for minimum */ + vs->setValue(yRat * (vMax - vMin) + vMin * 0.9); + hs->setValue(xRat * (hMax - hMin) + hMin * 0.9); +} + void ProfileGraphicsView::wheelEvent(QWheelEvent* event) { if (!toolTip) return; - setTransformationAnchor(QGraphicsView::AnchorUnderMouse); + // doesn't seem to work for Qt 4.8.1 + // setTransformationAnchor(QGraphicsView::AnchorUnderMouse); // Scale the view / do the zoom QPoint toolTipPos = mapFromScene(toolTip->pos()); @@ -86,6 +107,7 @@ void ProfileGraphicsView::wheelEvent(QWheelEvent* event) scale(1.0 / scaleFactor, 1.0 / scaleFactor); zoomLevel--; } + scrollViewTo(event->pos()); toolTip->setPos(mapToScene(toolTipPos).x(), mapToScene(toolTipPos).y()); } @@ -98,10 +120,7 @@ void ProfileGraphicsView::mouseMoveEvent(QMouseEvent* event) QPoint toolTipPos = mapFromScene(toolTip->pos()); - double dx = sceneRect().x(); - double dy = sceneRect().y(); - - ensureVisible(event->pos().x() + dx, event->pos().y() + dy, 1, 1); + scrollViewTo(event->pos()); if (zoomLevel == 0) QGraphicsView::mouseMoveEvent(event); |