[PATCH] Ruler: fix weird behaviour near x = 0

Lubomir I. Ivanov neolit123 at gmail.com
Mon Nov 17 12:59:19 PST 2014

From: "Lubomir I. Ivanov" <neolit123 at gmail.com>

RulerNodeItem2::recalculate() does something which is
apparently not a good idea in combination with

Each time the mouse moves, setPos() is called. Then in
recalculate() the x() value is checked and if less than 0
it's changed to x = 0 (setPos(0, y());).

This last call (setPos(0, y());)
however does not work and the value remains less than zero
leaving one of the ruler points outside of the graph.

To solve the issue we add a silly explicit check if x() < 0
before calling setPos() in RulerNodeItem2::mouseMoveEvent().

The 'x() > timeAxis->posAtValue(data->sec)' strangely works
on the other hand.

Signed-off-by: Lubomir I. Ivanov <neolit123 at gmail.com>

This looks like non-sense but you can observe it yourself
with some qDebug() calls. The order of calls does not follow
what should happen. I'm guessing concurency or something else
at play?
 qt-ui/profile/ruleritem.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/qt-ui/profile/ruleritem.cpp b/qt-ui/profile/ruleritem.cpp
index 0bf97f9..c6cab22 100644
--- a/qt-ui/profile/ruleritem.cpp
+++ b/qt-ui/profile/ruleritem.cpp
@@ -61,7 +61,9 @@ void RulerNodeItem2::recalculate()
 void RulerNodeItem2::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
-	setPos(event->scenePos());
+	qreal x = event->scenePos().x();
+	if (x < 0.0) x = 0.0;
+	setPos(x, event->scenePos().y());

More information about the subsurface mailing list