Moved URL builder and parser to MapFetcher
[situare] / src / map / mapengine.cpp
index cc3fae0..1cddef3 100644 (file)
@@ -36,14 +36,15 @@ MapEngine::MapEngine(QObject *parent)
     : QObject(parent)
     , m_centerTile(QPoint(UNDEFINED, UNDEFINED))
     , m_viewSize(QSize(DEFAULT_SCREEN_WIDTH, DEFAULT_SCREEN_HEIGHT))
+    , m_zoomedIn(false)
     , m_zoomLevel(DEFAULT_ZOOM_LEVEL)
 {
     m_mapScene = new MapScene(this);
 
     m_mapFetcher = new MapFetcher(new QNetworkAccessManager(this), this);
-    connect(this, SIGNAL(fetchImage(QUrl)), m_mapFetcher, SLOT(fetchMapImage(QUrl)));
-    connect(m_mapFetcher, SIGNAL(mapImageReceived(QUrl,QPixmap)), this,
-            SLOT(mapImageReceived(QUrl, QPixmap)));
+    connect(this, SIGNAL(fetchImage(int,int,int)), m_mapFetcher, SLOT(enqueueFetchMapImage(int,int,int)));
+    connect(m_mapFetcher, SIGNAL(mapImageReceived(int,int,int,QPixmap)), this,
+            SLOT(mapImageReceived(int,int,int,QPixmap)));
 
     m_mapZoomPanel = new MapZoomPanel(NULL, MAP_ZOOM_PANEL_POSITION_X, MAP_ZOOM_PANEL_POSITION_Y);
     m_mapScene->addItem(m_mapZoomPanel);
@@ -66,50 +67,21 @@ void MapEngine::setViewLocation(QPointF latLonCoordinate)
     setLocation(convertLatLonToSceneCoordinate(latLonCoordinate));
 }
 
-QUrl MapEngine::buildURL(int zoomLevel, QPoint tileNumbers)
+void MapEngine::mapImageReceived(int zoomLevel, int x, int y, const QPixmap &image)
 {
-    QString url = QString("http://tile.openstreetmap.org/mapnik/%1/%2/%3.png")
-                  .arg(zoomLevel).arg(tileNumbers.x()).arg(tileNumbers.y());
-
-    return QUrl(url);
-}
-
-void MapEngine::parseURL(const QUrl &url, int &zoom, int &x, int &y)
-{
-    QString path = url.path();
-    QStringList pathParts = path.split("/", QString::SkipEmptyParts);
-
-    int size = pathParts.size();
-
-    if (size >= 3) {
-        zoom = (pathParts.at(size-3)).toInt();
-        x = (pathParts.at(size-2)).toInt();
-        QString yString = pathParts.at(size-1);
-        yString.chop(4);
-        y = yString.toInt();
-    }
-}
-
-void MapEngine::mapImageReceived(const QUrl &url, const QPixmap &pixmap)
-{
-    //qDebug() << __PRETTY_FUNCTION__;
-
-    int zoom = UNDEFINED;
-    int x = UNDEFINED;
-    int y = UNDEFINED;
+    qDebug() << __PRETTY_FUNCTION__;
 
-    parseURL(url, zoom, x, y);
-    QString hashKey = tilePath(zoom, x, y);
+    QString hashKey = tilePath(zoomLevel, x, y);
     if (!m_mapScene->isTileInScene(hashKey)) {
 
         MapTile *mapTile = new MapTile();
-        mapTile->setZoomLevel(zoom);
+        mapTile->setZoomLevel(zoomLevel, m_zoomLevel);
         mapTile->setTileNumber(QPoint(x, y));
-        mapTile->setPixmap(pixmap);
+        mapTile->setPixmap(image);
 
         m_mapScene->addTile(mapTile, hashKey);
 
-        m_mapScene->removeStackedTiles(mapTile, viewRect());
+        m_mapScene->enqueueRemoveStackedTiles(mapTile);
    }
 }
 
@@ -131,6 +103,8 @@ QRect MapEngine::calculateTileGrid(QPoint sceneCoordinate)
     int topLeftX = tileCoordinate.x() - (gridWidth/2);
     int topLeftY = tileCoordinate.y() - (gridHeight/2);
 
+    m_mapFetcher->setDownloadQueueSize(gridWidth * gridHeight);
+
     return QRect(topLeftX, topLeftY, gridWidth, gridHeight);
 }
 
@@ -138,19 +112,19 @@ void MapEngine::alignImmovableItems(QPoint viewTopLeft)
 {
     m_mapZoomPanel->setPos(viewTopLeft);
 
-//    qDebug() << __PRETTY_FUNCTION__ << "viewTopLeft:" << viewTopLeft;
+    qDebug() << __PRETTY_FUNCTION__ << "viewTopLeft:" << viewTopLeft;
 }
 
 void MapEngine::setLocation(QPoint sceneCoordinate)
 {
-//    qDebug() << __PRETTY_FUNCTION__;
+    qDebug() << __PRETTY_FUNCTION__;
 
     m_sceneCoordinate = sceneCoordinate;
     emit locationChanged(m_sceneCoordinate);
 
     if (isCenterTileChanged(sceneCoordinate)) {
         getTiles(sceneCoordinate);
-        m_mapScene->removeOutOfViewTiles(viewRect());
+        m_mapScene->removeOutOfViewTiles();
     }
 }
 
@@ -165,14 +139,15 @@ bool MapEngine::isCenterTileChanged(QPoint sceneCoordinate)
 
 void MapEngine::getTiles(QPoint sceneCoordinate)
 {
-//    qDebug() << __PRETTY_FUNCTION__;
+    qDebug() << __PRETTY_FUNCTION__;
 
-    m_viewGrid = calculateTileGrid(sceneCoordinate);
+    m_viewTilesGrid = calculateTileGrid(sceneCoordinate);
+    updateViewTilesSceneRect();
 
-    int topLeftX = m_viewGrid.topLeft().x();
-    int topLeftY = m_viewGrid.topLeft().y();
-    int bottomRightX = m_viewGrid.bottomRight().x();
-    int bottomRightY = m_viewGrid.bottomRight().y();
+    int topLeftX = m_viewTilesGrid.topLeft().x();
+    int topLeftY = m_viewTilesGrid.topLeft().y();
+    int bottomRightX = m_viewTilesGrid.bottomRight().x();
+    int bottomRightY = m_viewTilesGrid.bottomRight().y();
 
     int tileMaxVal = tileMaxValue(m_zoomLevel);
 
@@ -192,41 +167,46 @@ void MapEngine::getTiles(QPoint sceneCoordinate)
             else if (tileY > tileMaxVal)
                 tileY -= tileMaxVal;
 
-            QUrl url = buildURL(m_zoomLevel, QPoint(tileX, tileY));
-
             if (!m_mapScene->isTileInScene(tilePath(m_zoomLevel, tileX, tileY)))
-                emit fetchImage(url);
+                emit fetchImage(m_zoomLevel, tileX, tileY);
         }
     }
 }
 
-QRect MapEngine::viewRect()
+void MapEngine::updateViewTilesSceneRect()
 {
-    QPoint topLeft = convertTileNumberToSceneCoordinate(m_zoomLevel, m_viewGrid.topLeft());
-    QPoint bottomRight = convertTileNumberToSceneCoordinate(m_zoomLevel, m_viewGrid.bottomRight()
-                                                             + QPoint(1, 1));
-    return QRect(topLeft, bottomRight);
+    QPoint topLeft = convertTileNumberToSceneCoordinate(m_zoomLevel, m_viewTilesGrid.topLeft());
+    QPoint bottomRight = convertTileNumberToSceneCoordinate(m_zoomLevel,
+                                                            m_viewTilesGrid.bottomRight()
+                                                             + QPoint(1, 1)) - QPoint(1, 1);
+
+    m_mapScene->viewRectUpdated(QRect(topLeft, bottomRight));
 }
 
 void MapEngine::viewResized(const QSize &size)
 {
     m_viewSize = size;
     getTiles(m_sceneCoordinate);
-    m_mapScene->removeOutOfViewTiles(viewRect());
+    m_mapScene->removeOutOfViewTiles();
 }
 
-void MapEngine::viewZoomInFinished()
+void MapEngine::viewZoomFinished()
 {
     qDebug() << __PRETTY_FUNCTION__;
-    m_mapScene->removeOutOfViewTiles(viewRect());
+
+    if (m_zoomedIn) {
+        m_zoomedIn = false;
+        m_mapScene->removeOutOfViewTiles();
+    }
 }
 
 void MapEngine::zoomIn()
 {
-//    qDebug() << __PRETTY_FUNCTION__;
+    qDebug() << __PRETTY_FUNCTION__;
 
     if (m_zoomLevel < MAX_MAP_ZOOM_LEVEL) {
         m_zoomLevel++;
+        m_zoomedIn = true;
         emit zoomLevelChanged(m_zoomLevel);
 
         m_mapScene->setTilesDrawingLevels(m_zoomLevel);
@@ -237,9 +217,9 @@ void MapEngine::zoomIn()
 
 void MapEngine::zoomOut()
 {
-//    qDebug() << __PRETTY_FUNCTION__;
+    qDebug() << __PRETTY_FUNCTION__;
 
-    if (m_zoomLevel > MIN_MAP_ZOOM_LEVEL) {
+    if (m_zoomLevel > MIN_VIEW_ZOOM_LEVEL) {
         m_zoomLevel--;
         emit zoomLevelChanged(m_zoomLevel);
 
@@ -278,7 +258,7 @@ QPoint MapEngine::convertTileNumberToSceneCoordinate(int zoomLevel, QPoint tileN
 
 QPoint MapEngine::convertLatLonToSceneCoordinate(QPointF latLonCoordinate)
 {
-//    qDebug() << __PRETTY_FUNCTION__;
+    qDebug() << __PRETTY_FUNCTION__;
 
     qreal longitude = latLonCoordinate.x();
     qreal latitude = latLonCoordinate.y();