diff layer/Layer.cpp @ 1434:ec6605563544

Fix tendency of start position of measure rect to wander as you drag out the rec t (at certain zoom resolutions)
author Chris Cannam
date Thu, 21 Mar 2019 15:22:20 +0000
parents c8a6fd3f9dff
children 5554d5187494
line wrap: on
line diff
--- a/layer/Layer.cpp	Mon Feb 18 14:33:35 2019 +0000
+++ b/layer/Layer.cpp	Thu Mar 21 15:22:20 2019 +0000
@@ -373,8 +373,24 @@
 void
 Layer::measureStart(LayerGeometryProvider *v, QMouseEvent *e)
 {
-    setMeasureRectFromPixrect(v, m_draggingRect,
-                              QRect(e->x(), e->y(), 0, 0));
+    m_draggingRect.haveFrames = hasTimeXAxis();
+
+    // NB if haveFrames, then pixrect x and width will be rewritten on
+    // every paint according to the current locations of the
+    // definitive frame values. So we should set the start frame value
+    // once on measureStart, and then not modify it on drag (to avoid
+    // drift from repeated conversion back and forth).
+    
+    m_draggingRect.pixrect = QRect(e->x(), e->y(), 0, 0);
+
+    if (m_draggingRect.haveFrames) {
+        m_draggingRect.startFrame = v->getFrameForX(e->x());
+        m_draggingRect.endFrame = v->getFrameForX(e->x());
+    }
+
+    setMeasureRectYCoord(v, m_draggingRect, true, e->y());
+    setMeasureRectYCoord(v, m_draggingRect, false, e->y());
+
     m_haveDraggingRect = true;
 }
 
@@ -383,11 +399,15 @@
 {
     if (!m_haveDraggingRect) return;
 
-    setMeasureRectFromPixrect(v, m_draggingRect,
-                              QRect(m_draggingRect.pixrect.x(),
-                                    m_draggingRect.pixrect.y(),
-                                    e->x() - m_draggingRect.pixrect.x(),
-                                    e->y() - m_draggingRect.pixrect.y()));
+    m_draggingRect.pixrect.setHeight(e->y() - m_draggingRect.pixrect.y());
+
+    if (m_draggingRect.haveFrames) {
+        m_draggingRect.endFrame = v->getFrameForX(e->x());
+    } else {
+        m_draggingRect.pixrect.setWidth(e->x() - m_draggingRect.pixrect.x());
+    }
+
+    setMeasureRectYCoord(v, m_draggingRect, false, e->y());
 }
 
 void