Fixed (yet) another merge screw-up *sigh*
[situare] / src / map / mapscene.cpp
index 8889744..5c0fb59 100644 (file)
@@ -26,6 +26,8 @@
 
 MapScene::MapScene(QObject *parent)
     : QGraphicsScene(parent)
+    , m_isRemoveStackedTilesRunning(false)
+    , m_viewRect(QRect(0, 0, 0, 0))
 {
     const int maxTilesPerSide = (1 << MAX_MAP_ZOOM_LEVEL);
     const int maxPixelsX = maxTilesPerSide * TILE_SIZE_X;
@@ -39,20 +41,64 @@ void MapScene::addTile(MapTile *mapTile, QString hashKey)
     addItem(mapTile);
 }
 
+void MapScene::debugItemsCount()
+{
+#ifndef Q_WS_MAEMO_5
+    qDebug() << __PRETTY_FUNCTION__ << "ITEM ADDED:" << items().count();
+#endif // Q_WS_MAEMO_5
+}
+
+void MapScene::enqueueRemoveStackedTiles(MapTile *newTile)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    m_removeStackedTilesList << newTile;
+    if (!m_isRemoveStackedTilesRunning) {
+        m_isRemoveStackedTilesRunning = true;
+        QTimer::singleShot(0, this, SLOT(runNextStackedTilesRemoval()));
+    }
+}
+
 bool MapScene::isTileInScene(QString hashKey)
 {
     return m_mapTilesInScene.contains(hashKey);
 }
 
-void MapScene::removeOutOfViewTiles(QRect viewRect)
+void MapScene::runNextStackedTilesRemoval()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if (!m_removeStackedTilesList.isEmpty()) {
+        MapTile *tile = m_removeStackedTilesList.takeFirst();
+        removeStackedTiles(tile);
+    }
+
+    // schedule removal of the next tile if the list is not empty
+    if (!m_removeStackedTilesList.isEmpty()) {
+        QTimer::singleShot(0, this, SLOT(runNextStackedTilesRemoval()));
+    }
+    else {
+        m_isRemoveStackedTilesRunning = false;
+#ifndef Q_WS_MAEMO_5
+    qDebug() << __PRETTY_FUNCTION__ << "STACKED END:" << items().count();
+#endif // Q_WS_MAEMO_5
+    }
+}
+
+void MapScene::removeOutOfViewTiles()
 {
-//    qDebug() << __PRETTY_FUNCTION__;
+    qDebug() << __PRETTY_FUNCTION__;
 
-    QList<QGraphicsItem *> viewTiles = items(viewRect, Qt::ContainsItemBoundingRect);
+    QList<QGraphicsItem *> viewTiles = items(m_viewRect, Qt::IntersectsItemBoundingRect);
     QList<QGraphicsItem *> allTiles = items();
 
-//    qDebug() << __PRETTY_FUNCTION__ << "All tiles:" << allTiles.count();
-//    qDebug() << __PRETTY_FUNCTION__ << "Tiles in view area:" << viewTiles.count();
+#ifndef Q_WS_MAEMO_5
+    qDebug() << __PRETTY_FUNCTION__ << "OUT OF VIEW START:" << items().count();
+#endif // Q_WS_MAEMO_5
+
+
+    qDebug() << __PRETTY_FUNCTION__ << "All tiles:" << allTiles.count();
+    qDebug() << __PRETTY_FUNCTION__ << "Tiles in view area:" << viewTiles.count();
 
     //Remove tiles which are in view from allTiles
     foreach (QGraphicsItem *tile, viewTiles)
@@ -65,61 +111,49 @@ void MapScene::removeOutOfViewTiles(QRect viewRect)
         if (tileToRemove)
             removeTile(tileToRemove);
     }
+
+#ifndef Q_WS_MAEMO_5
+    qDebug() << __PRETTY_FUNCTION__ << "OUT OF VIEW END:" << items().count();
+#endif // Q_WS_MAEMO_5
+
 }
 
-void MapScene::removeStackedTiles(MapTile *newTile, QRect viewRect)
+void MapScene::removeStackedTiles(MapTile *newTile)
 {
-//    qDebug() << __PRETTY_FUNCTION__;
+    qDebug() << __PRETTY_FUNCTION__;
 
     QRectF newTileSceneRect = newTile->sceneBoundingRect();
 
     //Loop all items under new tile
-    QList<QGraphicsItem *> collidingTiles = newTile->collidingItems(Qt::IntersectsItemBoundingRect);
-//    qDebug() << __PRETTY_FUNCTION__ << "Colliding tiles before:" << collidingTiles.count();
-    foreach (QGraphicsItem *collidingTile, collidingTiles) {
-
-
-        QRectF collidingTileSceneRect = collidingTile->sceneBoundingRect();
-
-        // remove tile if it is obscured by new tile
-        if (newTileSceneRect.contains(collidingTileSceneRect)) {
-            MapTile *tile = dynamic_cast<MapTile *>(collidingTile);
-            if (tile)
-                removeTile(tile);
-        }
-        else {
-            // remove tile if it is obscured in the view area
-            QRect collidingTileViewableArea =
-                    collidingTileSceneRect.intersected(viewRect).toRect();
-            if (collidingTile->isObscured(collidingTileViewableArea)) {
-                qDebug() << __PRETTY_FUNCTION__ << "Deleting obscured item";
-                MapTile *tile = dynamic_cast<MapTile *>(collidingTile);
-                if (tile)
-                    removeTile(tile);
-            }
+    QList<QGraphicsItem *> collidingItems = newTile->collidingItems(Qt::IntersectsItemBoundingRect);
+    foreach (QGraphicsItem *collidingItem, collidingItems) {
+        MapTile *collidingTile = dynamic_cast<MapTile *>(collidingItem);
+        if (collidingTile) {
+             // remove tile if it is fully obscured by new tile
+            QRectF collidingTileSceneRect = collidingTile->sceneBoundingRect();
+            if (newTileSceneRect.contains(collidingTileSceneRect))
+                removeTile(collidingTile);
         }
     }
-//    qDebug() << __PRETTY_FUNCTION__ << "All tiles after:"
-//             << newTile->collidingItems(Qt::IntersectsItemBoundingRect).count();
 }
 
-
 void MapScene::removeTile(MapTile *tile)
 {
-//    qDebug() << __PRETTY_FUNCTION__;
+    qDebug() << __PRETTY_FUNCTION__;
 
     if (tile) {
         m_mapTilesInScene.remove(MapEngine::tilePath(tile->zoomLevel(),
                                                      tile->tileNumber().x(),
                                                      tile->tileNumber().y()));
-       removeItem(tile);
-       delete tile;
+        removeItem(tile);
+        m_removeStackedTilesList.removeAll(tile);
+        delete tile;
     }
 }
 
 void MapScene::setTilesDrawingLevels(int zoomLevel)
 {
-//    qDebug() << __PRETTY_FUNCTION__ << "m_zoomLevel:" << m_zoomLevel;
+    qDebug() << __PRETTY_FUNCTION__ << "zoomLevel:" << zoomLevel;
 
     QList<QGraphicsItem *> allItems = items();
 
@@ -129,3 +163,8 @@ void MapScene::setTilesDrawingLevels(int zoomLevel)
             item->setSceneLevel(zoomLevel);
     }
 }
+
+void MapScene::viewRectUpdated(QRect viewRect)
+{
+    m_viewRect = viewRect;
+}