Merge branch 'kinetic'
[situare] / src / map / mapview.cpp
index 4bde6c3..f2114f6 100644 (file)
@@ -36,6 +36,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);
 
@@ -176,7 +177,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));
 
@@ -193,6 +200,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());
 }