Implemented max distance limit to kinetic scroll kinetic
authorSami Rämö <sami.ramo@ixonos.com>
Wed, 23 Jun 2010 10:27:34 +0000 (13:27 +0300)
committerSami Rämö <sami.ramo@ixonos.com>
Wed, 23 Jun 2010 10:27:34 +0000 (13:27 +0300)
 Reviewed by Jussi Laitinen

src/map/mapview.cpp
src/map/mapview.h

index 471e28b..abd088b 100644 (file)
@@ -35,6 +35,7 @@ const qreal MS_PER_S = 1000;
 // const values for tuning the kinetic scroll effect
 const int KINETIC_MIN_DRAG_LENGTH_VIEW_PIXELS = 30;
 const int KINETIC_MAX_TIME_FROM_LAST_MOUSE_EVENT_MS = 100;
+const qreal KINETIC_MAX_VIEW_DISTANCE_FACTOR = 0.8;
 const int KINETIC_SCROLL_TIME_MS = 750;
 const qreal KINETIC_SPEED_TO_DISTANCE_FACTOR = 0.15 * sqrt(KINETIC_SCROLL_TIME_MS / MS_PER_S);
 
@@ -126,7 +127,13 @@ void MapView::mouseReleaseEvent(QMouseEvent *event)
 
         if (dragLength >= KINETIC_MIN_DRAG_LENGTH_VIEW_PIXELS) {
             dragViewSpeed /= values;
-            QPointF effectViewDistance= dragViewSpeed * KINETIC_SPEED_TO_DISTANCE_FACTOR;
+            QPointF effectViewDistance = dragViewSpeed * KINETIC_SPEED_TO_DISTANCE_FACTOR;
+
+            // limit the scroll distance in screen pixels
+            qreal biggerDistance = qMax(abs(effectViewDistance.x()), abs(effectViewDistance.y()));
+            if (biggerDistance > m_kineticMaxViewDistance)
+                effectViewDistance /= biggerDistance / m_kineticMaxViewDistance;
+
             QPointF effectSceneDistance = effectViewDistance
                                           * (1 << (MAX_MAP_ZOOM_LEVEL - m_zoomLevel));
 
@@ -143,6 +150,8 @@ void MapView::resizeEvent(QResizeEvent *event)
 {
     qDebug() << __PRETTY_FUNCTION__ << "Resize:" << event->size();
 
+    m_kineticMaxViewDistance = qMax(width(), height()) * KINETIC_MAX_VIEW_DISTANCE_FACTOR;
+
     emit viewResized(event->size());
 }
 
index 1322663..532bb86 100644 (file)
@@ -100,7 +100,7 @@ private:
     * the limit and drag length is over the limit.
     *
     * Kinetic scroll distance is calculated based on mouse movement event values saved in
-    * mouseMoveEvent().
+    * mouseMoveEvent(). The distance is also limited so that map doesn't run too far.
     *
     * @param event Mouse event
     */
@@ -172,6 +172,8 @@ private:
     int m_index;                          ///< Index of mouse event values tables
     int m_zoomLevel;                      ///< Current zoom level
 
+    qreal m_kineticMaxViewDistance;       ///< Maximum kinetic scroll distance in view pixels
+
     QPoint m_dragMovement[VALUES];        ///< Table of mouse event distances
     QPoint m_mouseLastScenePosition;      ///< Previous mouse event position in the scene
     QPoint m_mouseLastViewPosition;       ///< Previous mouse event position in the view