summaryrefslogtreecommitdiffstats
path: root/qt-ui/profilegraphics.cpp
diff options
context:
space:
mode:
authorGravatar Lubomir I. Ivanov <neolit123@gmail.com>2013-07-04 23:55:27 +0300
committerGravatar Dirk Hohndel <dirk@hohndel.org>2013-07-04 22:59:46 -0700
commitc7f8ada4ff5e84e2ea52e387806c640eee05f45f (patch)
tree51cc2989d029f67cb3837e802bc3dcf61735fbbd /qt-ui/profilegraphics.cpp
parent1257adfd267e04b3dbe149c9c5874132dc70ec62 (diff)
downloadsubsurface-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.cpp29
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);