mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
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>
This commit is contained in:
parent
1257adfd26
commit
c7f8ada4ff
2 changed files with 25 additions and 5 deletions
|
@ -6,6 +6,7 @@
|
||||||
#include <QGraphicsScene>
|
#include <QGraphicsScene>
|
||||||
#include <QResizeEvent>
|
#include <QResizeEvent>
|
||||||
#include <QGraphicsLineItem>
|
#include <QGraphicsLineItem>
|
||||||
|
#include <QScrollBar>
|
||||||
#include <QPen>
|
#include <QPen>
|
||||||
#include <QBrush>
|
#include <QBrush>
|
||||||
#include <QDebug>
|
#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)
|
void ProfileGraphicsView::wheelEvent(QWheelEvent* event)
|
||||||
{
|
{
|
||||||
if (!toolTip)
|
if (!toolTip)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
|
// doesn't seem to work for Qt 4.8.1
|
||||||
|
// setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
|
||||||
|
|
||||||
// Scale the view / do the zoom
|
// Scale the view / do the zoom
|
||||||
QPoint toolTipPos = mapFromScene(toolTip->pos());
|
QPoint toolTipPos = mapFromScene(toolTip->pos());
|
||||||
|
@ -86,6 +107,7 @@ void ProfileGraphicsView::wheelEvent(QWheelEvent* event)
|
||||||
scale(1.0 / scaleFactor, 1.0 / scaleFactor);
|
scale(1.0 / scaleFactor, 1.0 / scaleFactor);
|
||||||
zoomLevel--;
|
zoomLevel--;
|
||||||
}
|
}
|
||||||
|
scrollViewTo(event->pos());
|
||||||
toolTip->setPos(mapToScene(toolTipPos).x(), mapToScene(toolTipPos).y());
|
toolTip->setPos(mapToScene(toolTipPos).x(), mapToScene(toolTipPos).y());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,10 +120,7 @@ void ProfileGraphicsView::mouseMoveEvent(QMouseEvent* event)
|
||||||
|
|
||||||
QPoint toolTipPos = mapFromScene(toolTip->pos());
|
QPoint toolTipPos = mapFromScene(toolTip->pos());
|
||||||
|
|
||||||
double dx = sceneRect().x();
|
scrollViewTo(event->pos());
|
||||||
double dy = sceneRect().y();
|
|
||||||
|
|
||||||
ensureVisible(event->pos().x() + dx, event->pos().y() + dy, 1, 1);
|
|
||||||
|
|
||||||
if (zoomLevel == 0)
|
if (zoomLevel == 0)
|
||||||
QGraphicsView::mouseMoveEvent(event);
|
QGraphicsView::mouseMoveEvent(event);
|
||||||
|
|
|
@ -124,6 +124,7 @@ private:
|
||||||
void plot_depth_scale();
|
void plot_depth_scale();
|
||||||
|
|
||||||
QColor get_sac_color(int sac, int avg_sac);
|
QColor get_sac_color(int sac, int avg_sac);
|
||||||
|
void scrollViewTo(const QPoint pos);
|
||||||
|
|
||||||
QPen defaultPen;
|
QPen defaultPen;
|
||||||
QBrush defaultBrush;
|
QBrush defaultBrush;
|
||||||
|
|
Loading…
Add table
Reference in a new issue