From 9c0c32eaebd36b392612d6de87771b691199c565 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sami=20R=C3=A4m=C3=B6?= Date: Wed, 23 Jun 2010 13:27:34 +0300 Subject: [PATCH] Implemented max distance limit to kinetic scroll Reviewed by Jussi Laitinen --- src/map/mapview.cpp | 11 ++++++++++- src/map/mapview.h | 4 +++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/map/mapview.cpp b/src/map/mapview.cpp index 471e28b..abd088b 100644 --- a/src/map/mapview.cpp +++ b/src/map/mapview.cpp @@ -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()); } diff --git a/src/map/mapview.h b/src/map/mapview.h index 1322663..532bb86 100644 --- a/src/map/mapview.h +++ b/src/map/mapview.h @@ -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 -- 1.7.9.5