Remove other level tiles after delay
authorSami Rämö <sami.ramo@ixonos.com>
Thu, 10 Jun 2010 09:50:53 +0000 (12:50 +0300)
committerSami Rämö <sami.ramo@ixonos.com>
Thu, 10 Jun 2010 09:50:53 +0000 (12:50 +0300)
src/map/mapengine.cpp
src/map/mapscene.cpp
src/map/mapscene.h

index 47d5ef1..e83b280 100644 (file)
@@ -485,6 +485,8 @@ void MapEngine::viewZoomFinished()
         emit maxZoomLevelReached();
     else if (m_zoomLevel == MIN_VIEW_ZOOM_LEVEL)
         emit minZoomLevelReached();
+
+    m_mapScene->setZoomLevel(m_zoomLevel);
 }
 
 void MapEngine::zoomed()
index d1bb80c..69745d3 100644 (file)
@@ -113,16 +113,32 @@ void MapScene::runNextStackedTilesRemoval()
         m_isRemoveStackedTilesRunning = false;
 }
 
+void MapScene::removeOtherLevelTiles()
+{
+    qWarning() << __PRETTY_FUNCTION__;
+
+    QList<QGraphicsItem *> allItems = items();
+    foreach(QGraphicsItem *item, allItems) {
+        MapTile *tile = dynamic_cast<MapTile *>(item);
+        if (tile && tile->zoomLevel() != m_zoomLevel) {
+            removeTile(tile);
+            qWarning() << __PRETTY_FUNCTION__ << "removed other level tile";
+        }
+    }
+
+    qWarning() << __PRETTY_FUNCTION__ << "items in scene:" << items().count();
+}
+
 void MapScene::removeOutOfViewTiles(QRect tilesGrid, int zoomLevel)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    QList<QGraphicsItem *> viewTiles = items(m_tilesSceneRect, Qt::IntersectsItemBoundingRect);
-    QList<QGraphicsItem *> allTiles = items();
+    QList<QGraphicsItem *> viewItems = items(m_tilesSceneRect, Qt::IntersectsItemBoundingRect);
+    QList<QGraphicsItem *> allItems = items();
 
     //Remove tiles which are in view from allTiles
-    foreach (QGraphicsItem *tile, viewTiles)
-        allTiles.removeOne(tile);
+    foreach (QGraphicsItem *item, viewItems)
+        allItems.removeOne(item);
 
     // note: add 1 so odd values are rounded up
     int tilesGridWidthHalf = (tilesGrid.width() + 1) / 2;
@@ -130,24 +146,24 @@ void MapScene::removeOutOfViewTiles(QRect tilesGrid, int zoomLevel)
     if (tilesGrid.right() > (MapEngine::tileMaxValue(zoomLevel) - tilesGridWidthHalf + GRID_PADDING)) {
         QRect oppositeRect = m_tilesSceneRect;
         oppositeRect.translate(-MAP_PIXELS_X, 0);
-        QList<QGraphicsItem *> oppositeTiles = items(oppositeRect, Qt::IntersectsItemBoundingRect);
-        foreach (QGraphicsItem *tile, oppositeTiles)
-            allTiles.removeOne(tile);
+        QList<QGraphicsItem *> oppositeItems = items(oppositeRect, Qt::IntersectsItemBoundingRect);
+        foreach (QGraphicsItem *item, oppositeItems)
+            allItems.removeOne(item);
     }
 
     if (tilesGrid.left() < (tilesGridWidthHalf - GRID_PADDING)) {
         QRect oppositeRect = m_tilesSceneRect;
         oppositeRect.translate(MAP_PIXELS_X, 0);
-        QList<QGraphicsItem *> oppositeTiles = items(oppositeRect, Qt::IntersectsItemBoundingRect);
-        foreach (QGraphicsItem *tile, oppositeTiles)
-            allTiles.removeOne(tile);
+        QList<QGraphicsItem *> oppositeItems = items(oppositeRect, Qt::IntersectsItemBoundingRect);
+        foreach (QGraphicsItem *item, oppositeItems)
+            allItems.removeOne(item);
     }
 
     //Remove tiles out of view
-    foreach (QGraphicsItem *tile, allTiles) {
-        MapTile *tileToRemove = dynamic_cast<MapTile *>(tile);
-        if (tileToRemove)
-            removeTile(tileToRemove);
+    foreach (QGraphicsItem *item, allItems) {
+        MapTile *tile = dynamic_cast<MapTile *>(item);
+        if (tile)
+            removeTile(tile);
     }
 
     qWarning() << __PRETTY_FUNCTION__ << "items in scene:" << items().count();
@@ -212,6 +228,12 @@ void MapScene::setTilesDrawingLevels(int zoomLevel)
     }
 }
 
+void MapScene::setZoomLevel(int zoomLevel)
+{
+    m_zoomLevel = zoomLevel;
+    QTimer::singleShot(10000, this, SLOT(removeOtherLevelTiles()));
+}
+
 void MapScene::spanItems(int zoomLevel, QPoint sceneCoordinate, QSize viewSize)
 {
     qDebug() << __PRETTY_FUNCTION__;
index ed84153..e924471 100644 (file)
@@ -124,6 +124,8 @@ public:
     */
     void setTilesDrawingLevels(int zoomLevel);
 
+    void setZoomLevel(int zoomLevel);
+
     void spanItems(int zoomLevel, QPoint sceneCoordinate, QSize viewSize);
 
     /**
@@ -152,6 +154,8 @@ private:
     void moveIntersectingItemsHorizontally(QRect from, int distance);
 
 private slots:
+    void removeOtherLevelTiles();
+
     /**
     * @brief Slot for running next queued removal of stacked tiles
     *
@@ -163,6 +167,7 @@ private slots:
  ******************************************************************************/
 private:
     bool m_isRemoveStackedTilesRunning; ///< Is singleshot timer already running
+    int m_zoomLevel;
     QHash<QString, MapTile *> m_mapTilesInScene;  ///< List of map tiles in map scene
     QList<MapTile *> m_removeStackedTilesList; ///< "Queue" for stacked tiles removal requests
     QRect m_tilesSceneRect; ///< Current viewable area