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;
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)
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();
item->setSceneLevel(zoomLevel);
}
}
+
+void MapScene::viewRectUpdated(QRect viewRect)
+{
+ m_viewRect = viewRect;
+}