#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)
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)
{
// 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)