// 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);
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));
{
qDebug() << __PRETTY_FUNCTION__ << "Resize:" << event->size();
+ m_kineticMaxViewDistance = qMax(width(), height()) * KINETIC_MAX_VIEW_DISTANCE_FACTOR;
+
emit viewResized(event->size());
}
* 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
*/
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