Added preconditions for starting the kinetic scroll effect
authorSami Rämö <sami.ramo@ixonos.com>
Thu, 17 Jun 2010 10:54:11 +0000 (13:54 +0300)
committerSami Rämö <sami.ramo@ixonos.com>
Thu, 17 Jun 2010 10:54:11 +0000 (13:54 +0300)
 - Drag length must be over minimum limit

 - Time from last mouseMoveEvent must be below maximum limit

src/map/mapview.cpp

index 85390ac..5d6fefc 100644 (file)
 
 #include "mapcommon.h"
 #include "mapscroller.h"
+
 #include "mapview.h"
 
-const int KINETIC_SCROLL_TIME_MS = 7500;
 const qreal MS_PER_S = 1000;
-const qreal SPEED_TO_DISTANCE_FACTOR = 0.15 * sqrt(KINETIC_SCROLL_TIME_MS / MS_PER_S);
+
+// const values for tuning the kinetic scroll effect
+const int KINETIC_MIN_DRAG_LENGTH = 30;
+const int KINETIC_MAX_TIME_FROM_LAST_MOUSE_EVENT_MS = 100;
+const int KINETIC_SCROLL_TIME_MS = 750;
+const qreal KINETIC_SPEED_TO_DISTANCE_FACTOR = 0.15 * sqrt(KINETIC_SCROLL_TIME_MS / MS_PER_S);
 
 MapView::MapView(QWidget *parent)
     : QGraphicsView(parent)
@@ -49,7 +54,7 @@ MapView::MapView(QWidget *parent)
 
     m_scroller = &MapScroller::getInstance();
 
-    qWarning() << __PRETTY_FUNCTION__ << "SPEED_TO_DISTANCE_FACTOR" << SPEED_TO_DISTANCE_FACTOR;
+    qWarning() << __PRETTY_FUNCTION__ << "SPEED_TO_DISTANCE_FACTOR" << KINETIC_SPEED_TO_DISTANCE_FACTOR;
 }
 
 void MapView::centerToSceneCoordinates(QPoint sceneCoordinate)
@@ -110,28 +115,40 @@ void MapView::mouseReleaseEvent(QMouseEvent *event)
 {
 //    qWarning() << __PRETTY_FUNCTION__;
 
+    int elapsed = time.elapsed();
+
     QGraphicsView::mouseReleaseEvent(event);
 
-    QPointF dragViewSpeed;
-    int values = 0;
-    for (int i = 0; i < VALUES; i++) {
-        if (m_dragTime > 0) {
-            dragViewSpeed += m_dragMovement[i] / (m_dragTime[i] / MS_PER_S);
-            values++;
+    qWarning() << __PRETTY_FUNCTION__ << "elapsed:" << elapsed;
+
+    // start kinetic scroll only if there isn't too much time elapsed from the last mouse move event
+    if (elapsed <= KINETIC_MAX_TIME_FROM_LAST_MOUSE_EVENT_MS) {
+        QPointF dragViewSpeed;
+        int dragLength = 0;
+        int values = 0;
+        for (int i = 0; i < VALUES; i++) {
+            if (m_dragTime > 0) {
+                dragViewSpeed += m_dragMovement[i] / (m_dragTime[i] / MS_PER_S);
+                dragLength += m_dragMovement[i].manhattanLength();
+                values++;
+            }
+            qWarning() << __PRETTY_FUNCTION__ << m_dragMovement[i].x() << m_dragMovement[i].y() << m_dragTime[i];
         }
-//        qWarning() << __PRETTY_FUNCTION__ << m_dragMovement[i].x() << m_dragMovement[i].y() << m_dragTime[i];
-    }
-    dragViewSpeed /= values;
-    dragViewSpeed *= SPEED_TO_DISTANCE_FACTOR;
+        dragViewSpeed /= values;
+        dragViewSpeed *= KINETIC_SPEED_TO_DISTANCE_FACTOR;
 
-//    qWarning() << __PRETTY_FUNCTION__ << dragViewSpeed.x() << dragViewSpeed.y();
+        qWarning() << __PRETTY_FUNCTION__ << dragViewSpeed.x() << dragViewSpeed.y();
+        qWarning() << __PRETTY_FUNCTION__ << "dragLength:" << dragLength;
 
-    QPointF dragSceneSpeed = dragViewSpeed * (1 << (MAX_MAP_ZOOM_LEVEL - m_zoomLevel));
+        if (dragLength >= KINETIC_MIN_DRAG_LENGTH) {
+            QPointF dragSceneSpeed = dragViewSpeed * (1 << (MAX_MAP_ZOOM_LEVEL - m_zoomLevel));
 
-    m_scroller->setDuration(KINETIC_SCROLL_TIME_MS);
-    m_scroller->setStartValue(m_scenePosition);
-    m_scroller->setEndValue(m_scenePosition + dragSceneSpeed.toPoint());
-    m_scroller->start();
+            m_scroller->setDuration(KINETIC_SCROLL_TIME_MS);
+            m_scroller->setStartValue(m_scenePosition);
+            m_scroller->setEndValue(m_scenePosition + dragSceneSpeed.toPoint());
+            m_scroller->start();
+        }
+    }
 }
 
 void MapView::resizeEvent(QResizeEvent *event)