Implemented smooth centering feature
[situare] / src / map / mapengine.cpp
index ca6d33e..6df3d06 100644 (file)
@@ -45,6 +45,8 @@
 
 #include "mapengine.h"
 
+const int SMOOTH_CENTERING_TIME_MS = 1000;
+
 MapEngine::MapEngine(QObject *parent)
     : QObject(parent),
       m_autoCenteringEnabled(false),
@@ -90,7 +92,7 @@ MapEngine::MapEngine(QObject *parent)
     m_scroller = &MapScroller::getInstance();
 
     connect(m_scroller, SIGNAL(coordinateUpdated(QPoint)),
-            this, SLOT(setLocation(QPoint)));
+            this, SLOT(setCenterPosition(QPoint)));
 }
 
 MapEngine::~MapEngine()
@@ -123,6 +125,17 @@ QPointF MapEngine::centerGeoCoordinate()
     return convertSceneCoordinateToLatLon(m_zoomLevel, m_sceneCoordinate);
 }
 
+void MapEngine::centerToCoordinates(QPointF latLonCoordinate)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    QPoint scenePosition = convertLatLonToSceneCoordinate(latLonCoordinate);
+
+    m_lastManualPosition = scenePosition;
+
+    scrollToPosition(scenePosition);
+}
+
 QPoint MapEngine::convertLatLonToSceneCoordinate(QPointF latLonCoordinate)
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -244,7 +257,7 @@ void MapEngine::gpsPositionUpdate(QPointF position, qreal accuracy)
     m_mapScene->spanItems(m_zoomLevel, m_sceneCoordinate, m_viewSize);
 
     if (m_autoCenteringEnabled)
-        setViewLocation(position);
+        centerToCoordinates(position);
 }
 
 qreal MapEngine::greatCircleDistance(QPointF firstLocation, QPointF secondLocation)
@@ -282,7 +295,7 @@ void MapEngine::init()
     }
 
     emit zoomLevelChanged(m_zoomLevel);
-    setViewLocation(QPointF(startLocation.x(), startLocation.y()));
+    centerToCoordinates(QPointF(startLocation.x(), startLocation.y()));
 }
 
 bool MapEngine::isAutoCenteringEnabled()
@@ -380,6 +393,16 @@ QGraphicsScene* MapEngine::scene()
     return m_mapScene;
 }
 
+void MapEngine::scrollToPosition(QPoint scenePosition)
+{
+    m_scroller->stop();
+    m_scroller->setEasingCurve(QEasingCurve::InOutQuart);
+    m_scroller->setDuration(SMOOTH_CENTERING_TIME_MS);
+    m_scroller->setStartValue(m_sceneCoordinate);
+    m_scroller->setEndValue(scenePosition);
+    m_scroller->start();
+}
+
 void MapEngine::setAutoCentering(bool enabled)
 {
     m_autoCenteringEnabled = enabled;
@@ -390,24 +413,24 @@ void MapEngine::setGPSEnabled(bool enabled)
     m_gpsLocationItem->setEnabled(enabled);
 }
 
-void MapEngine::setLocation(QPoint sceneCoordinate)
+void MapEngine::setCenterPosition(QPoint scenePosition)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
     // jump to opposite side of the world if world horizontal limit is exceeded
-    sceneCoordinate.setX(normalize(sceneCoordinate.x(), MAP_MIN_PIXEL_X, MAP_MAX_PIXEL_X));
+    scenePosition.setX(normalize(scenePosition.x(), MAP_MIN_PIXEL_X, MAP_MAX_PIXEL_X));
 
     // don't allow vertical scene coordinates go out of the map
-    sceneCoordinate.setY(qBound(MAP_MIN_PIXEL_Y, sceneCoordinate.y(), MAP_MAX_PIXEL_Y));
+    scenePosition.setY(qBound(MAP_MIN_PIXEL_Y, scenePosition.y(), MAP_MAX_PIXEL_Y));
 
-    if (disableAutoCentering(sceneCoordinate))
+    if (disableAutoCentering(scenePosition))
         emit mapScrolledManually();
 
-    m_sceneCoordinate = sceneCoordinate;
+    m_sceneCoordinate = scenePosition;
     emit locationChanged(m_sceneCoordinate);
 
-    if (isCenterTileChanged(sceneCoordinate)) {
-        getTiles(sceneCoordinate);
+    if (isCenterTileChanged(scenePosition)) {
+        getTiles(scenePosition);
         m_mapScene->removeOutOfViewTiles(m_viewTilesGrid, m_zoomLevel);
     }
 
@@ -445,17 +468,6 @@ void MapEngine::setTilesGridSize(const QSize &viewSize)
     m_tilesGridSize.setWidth(gridWidth);
 }
 
-void MapEngine::setViewLocation(QPointF latLonCoordinate)
-{
-    qDebug() << __PRETTY_FUNCTION__;
-
-    QPoint sceneCoordinate = convertLatLonToSceneCoordinate(latLonCoordinate);
-
-    m_lastManualPosition = sceneCoordinate;
-
-    setLocation(sceneCoordinate);
-}
-
 int MapEngine::tileMaxIndex(int zoomLevel)
 {
     qDebug() << __PRETTY_FUNCTION__;