Got spanning of items (friends, locations) working
authorSami Rämö <sami.ramo@ixonos.com>
Tue, 8 Jun 2010 08:34:51 +0000 (11:34 +0300)
committerSami Rämö <sami.ramo@ixonos.com>
Tue, 8 Jun 2010 08:34:51 +0000 (11:34 +0300)
src/map/frienditemshandler.cpp
src/map/frienditemshandler.h
src/map/mapengine.cpp
src/map/mapengine.h
src/map/mapscene.cpp
src/map/mapscene.h

index 71952fe..d5fd823 100644 (file)
@@ -259,13 +259,13 @@ void FriendItemsHandler::refactorFriendItems(int zoomLevel)
     checkAllFriendsForCollidingFriends();
 }
 
-void FriendItemsHandler::spanHiddenFriendLocationItems(ScrollDirection direction, QRect spanRect)
+void FriendItemsHandler::spanHiddenFriendLocationItems(ScrollDirection direction, QRect spanRect, QPoint sceneCoordinate)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    int delta = WORLD_PIXELS_X;
-    if (direction == SCROLL_WEST)
-        delta = -WORLD_PIXELS_X;
+    int delta = -WORLD_PIXELS_X;
+    if (sceneCoordinate.x() > spanRect.right())
+        delta = WORLD_PIXELS_X;
 
     foreach (FriendLocationItem *item, m_friendItems) {
         if (!item->isVisible() && spanRect.contains(item->pos().toPoint()))
index 11b9c1b..2bbd059 100644 (file)
@@ -58,7 +58,7 @@ public:
  * MEMBER FUNCTIONS AND SLOTS
  ******************************************************************************/
 public:
-    void spanHiddenFriendLocationItems(ScrollDirection direction, QRect spanRect);
+    void spanHiddenFriendLocationItems(ScrollDirection direction, QRect spanRect, QPoint sceneCoordinate);
 
 public slots:
     /**
index c5f566d..68f8183 100644 (file)
@@ -218,17 +218,19 @@ void MapEngine::getTiles(QPoint sceneCoordinate)
 //                tileX -= tileMaxVal + 1;
 
             // map doesn't span in vertical direction
-            if (tileY < 0 || tileY > tileMaxVal) /// @todo replace variable with method
+            if (tileY < 0 || tileY > tileMaxVal)
                 continue;
 
             if (!m_mapScene->tileInScene(tilePath(m_zoomLevel, tileX, tileY)))
-                emit fetchImage(m_zoomLevel, normalizeTileNumberX(tileX), tileY);
+                emit fetchImage(m_zoomLevel, normalize(tileX, 0, tileMaxVal), tileY);
         }
     }
 
-    QRect spanRect = m_mapScene->spanItems(m_scrollDirection, m_zoomLevel);
-    m_friendItemsHandler->spanHiddenFriendLocationItems(m_scrollDirection, spanRect);
-    m_friendItemsHandler->refactorFriendItems(m_zoomLevel);
+//    QRect spanRect = m_mapScene->spanItems(m_scrollDirection, m_zoomLevel, m_sceneCoordinate, m_viewSize);
+//    m_friendItemsHandler->spanHiddenFriendLocationItems(m_scrollDirection, spanRect, m_sceneCoordinate);
+//    m_friendItemsHandler->refactorFriendItems(m_zoomLevel);
+
+
 }
 
 void MapEngine::gpsPositionUpdate(QPointF position, qreal accuracy)
@@ -285,7 +287,7 @@ void MapEngine::mapImageReceived(int zoomLevel, int x, int y, const QPixmap &ima
 //    if (y != 3)
 //        return;
 
-    qWarning() << __PRETTY_FUNCTION__ << "x:" << x << "y:" << y;
+    qDebug() << __PRETTY_FUNCTION__; // << "x:" << x << "y:" << y;
 
     // add normal tile
     QPoint tileNumber(x, y);
@@ -297,14 +299,14 @@ void MapEngine::mapImageReceived(int zoomLevel, int x, int y, const QPixmap &ima
     if (tileNumber.x() < (tilesGridWidthHalf - GRID_PADDING)) {
         QPoint adjustedTileNumber(tileNumber.x() + tileMaxValue(zoomLevel) + 1, tileNumber.y());
         m_mapScene->addTile(zoomLevel, adjustedTileNumber, image, m_zoomLevel);
-        qWarning() << __PRETTY_FUNCTION__ << "duplicate tile to east, x:" << x << "->" << adjustedTileNumber.x() << "y:" << adjustedTileNumber.y();
+//        qWarning() << __PRETTY_FUNCTION__ << "duplicate tile to east, x:" << x << "->" << adjustedTileNumber.x() << "y:" << adjustedTileNumber.y();
     }
 
     // expand to west side? (don't need to expand over padding)
     if (tileNumber.x() > (tileMaxValue(zoomLevel) - tilesGridWidthHalf + GRID_PADDING)) {
         QPoint adjustedTileNumber(tileNumber.x() - tileMaxValue(zoomLevel) - 1, tileNumber.y());
         m_mapScene->addTile(zoomLevel, adjustedTileNumber, image, m_zoomLevel);
-        qWarning() << __PRETTY_FUNCTION__ << "duplicate tile to west, x:" << x << "->" << adjustedTileNumber.x() << "y:" << adjustedTileNumber.y();
+//        qWarning() << __PRETTY_FUNCTION__ << "duplicate tile to west, x:" << x << "->" << adjustedTileNumber.x() << "y:" << adjustedTileNumber.y();
     }
 
 //    // expanding is only done if received tile zoom level is same as current zoom level
@@ -351,20 +353,21 @@ void MapEngine::mapImageReceived(int zoomLevel, int x, int y, const QPixmap &ima
 //        }
 //    }
 
-    m_mapScene->spanItems(m_scrollDirection, m_zoomLevel);
+//    m_mapScene->spanItems(m_scrollDirection, m_zoomLevel);
 }
 
-int MapEngine::normalizeTileNumberX(int tileX)
+int MapEngine::normalize(int value, int min, int max)
 {
-    int tileMaxVal = tileMaxValue(m_zoomLevel);
+    qDebug() << __PRETTY_FUNCTION__; // << "value:" << value << "min:" << min << "max:" << max;
+    Q_ASSERT_X(max >= min, "parameters", "max can't be smaller than min");
 
-    while (tileX < 0)
-        tileX += tileMaxVal + 1;
+    while (value < min)
+        value += max - min + 1;
 
-    while (tileX > tileMaxVal)
-        tileX -= tileMaxVal + 1;
+    while (value > max)
+        value -= max - min + 1;
 
-    return tileX;
+    return value;
 }
 
 void MapEngine::receiveOwnLocation(User *user)
@@ -427,6 +430,8 @@ void MapEngine::setLocation(QPoint sceneCoordinate)
         getTiles(sceneCoordinate);
         m_mapScene->removeOutOfViewTiles(m_viewTilesGrid, m_zoomLevel);
     }
+
+    m_mapScene->spanItems(m_scrollDirection, m_zoomLevel, m_sceneCoordinate, m_viewSize);
 }
 
 void MapEngine::setZoomLevel(int newZoomLevel)
@@ -458,8 +463,8 @@ void MapEngine::setTilesGridSize(const QSize &viewSize)
     m_tilesGridSize.setHeight(gridHeight);
     m_tilesGridSize.setWidth(gridWidth);
 
-    qWarning() << __PRETTY_FUNCTION__ << "tiles grid:" << m_tilesGridSize.width()
-                                      << "*" << m_tilesGridSize.height();
+//    qWarning() << __PRETTY_FUNCTION__ << "tiles grid:" << m_tilesGridSize.width()
+//                                      << "*" << m_tilesGridSize.height();
 }
 
 void MapEngine::setViewLocation(QPointF latLonCoordinate)
index 029e6a7..ec75097 100644 (file)
@@ -122,6 +122,8 @@ public:
     */
     void init();
 
+    static int normalize(int value, int min, int max);
+
     /**
     * @brief Getter for scene
     *
@@ -244,8 +246,6 @@ private:
     */
     bool isCenterTileChanged(QPoint sceneCoordinate);
 
-    int normalizeTileNumberX(int tileX);
-
     /**
       * @brief Set size of tiles grid based on view size
       *
index 6fc1cc8..2c3a945 100644 (file)
@@ -77,6 +77,21 @@ void MapScene::enqueueRemoveStackedTiles(MapTile *newTile)
     }
 }
 
+void MapScene::moveIntersectingItemsHorizontally(QRect from, int distance)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    qWarning() << __PRETTY_FUNCTION__ << "left:" << from.left() << "right:" << from.right() << "distance:" << distance;
+
+    QList<QGraphicsItem *> spanItems = items(from, Qt::IntersectsItemBoundingRect);
+    foreach (QGraphicsItem *item, spanItems) {
+        if (dynamic_cast<MapTile *>(item))
+            continue;
+        qWarning() << __PRETTY_FUNCTION__ << "moving item...";
+        item->moveBy(distance, 0);
+    }
+}
+
 MapTile* MapScene::tileInScene(QString hashKey)
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -102,9 +117,9 @@ void MapScene::runNextStackedTilesRemoval()
 
 void MapScene::removeOutOfViewTiles(QRect tilesGrid, int zoomLevel)
 {
-    qWarning() << __PRETTY_FUNCTION__;
+    qDebug() << __PRETTY_FUNCTION__;
 
-    qWarning() << __PRETTY_FUNCTION__ << "m_tilesSceneRect:" << m_tilesSceneRect.left() << m_tilesSceneRect.top() << "/" << m_tilesSceneRect.right() << m_tilesSceneRect.bottom();
+//    qWarning() << __PRETTY_FUNCTION__ << "m_tilesSceneRect:" << m_tilesSceneRect.left() << m_tilesSceneRect.top() << "/" << m_tilesSceneRect.right() << m_tilesSceneRect.bottom();
 
     QList<QGraphicsItem *> viewTiles = items(m_tilesSceneRect, Qt::IntersectsItemBoundingRect);
     QList<QGraphicsItem *> allTiles = items();
@@ -114,12 +129,12 @@ void MapScene::removeOutOfViewTiles(QRect tilesGrid, int zoomLevel)
         allTiles.removeOne(tile);
 
     int tilesGridWidthHalf = (tilesGrid.width() + 1) / 2;
-    qWarning() << __PRETTY_FUNCTION__ << "half:" << tilesGridWidthHalf;
+//    qWarning() << __PRETTY_FUNCTION__ << "half:" << tilesGridWidthHalf;
 
     if (tilesGrid.right() > (MapEngine::tileMaxValue(zoomLevel) - tilesGridWidthHalf + GRID_PADDING)) { /// @todo must be mirrored also when near the world limit
         QRect oppositeRect = m_tilesSceneRect;
         oppositeRect.translate(-WORLD_PIXELS_X, 0);
-        qWarning() << __PRETTY_FUNCTION__ << "oppositeRect:" << oppositeRect.left() << oppositeRect.top() << "/" << oppositeRect.right() << oppositeRect.bottom();
+//        qWarning() << __PRETTY_FUNCTION__ << "oppositeRect:" << oppositeRect.left() << oppositeRect.top() << "/" << oppositeRect.right() << oppositeRect.bottom();
         QList<QGraphicsItem *> oppositeTiles = items(oppositeRect, Qt::IntersectsItemBoundingRect);
         foreach (QGraphicsItem *tile, oppositeTiles)
             allTiles.removeOne(tile);
@@ -137,7 +152,7 @@ void MapScene::removeOutOfViewTiles(QRect tilesGrid, int zoomLevel)
     foreach (QGraphicsItem *tile, allTiles) {
         MapTile *tileToRemove = dynamic_cast<MapTile *>(tile);
         if (tileToRemove) {
-            qWarning() << __PRETTY_FUNCTION__ << "removing tile, x:" << tileToRemove->tileNumber().x() << "y:" << tileToRemove->tileNumber().y() << "pos:" << tileToRemove->pos().x() << tileToRemove->pos().y();
+//            qWarning() << __PRETTY_FUNCTION__ << "removing tile, x:" << tileToRemove->tileNumber().x() << "y:" << tileToRemove->tileNumber().y() << "pos:" << tileToRemove->pos().x() << tileToRemove->pos().y();
             removeTile(tileToRemove);
         }
     }
@@ -187,7 +202,7 @@ void MapScene::setSceneVerticalOverlap(int viewHeight, int zoomLevel)
     rect.setBottom(WORLD_PIXELS_Y + overlap - 1);
     setSceneRect(rect);
 
-    qWarning() << __PRETTY_FUNCTION__ << "scene rect:" << rect.left() << rect.top() << rect.right() << rect.bottom();
+//    qWarning() << __PRETTY_FUNCTION__ << "scene rect:" << rect.left() << rect.top() << rect.right() << rect.bottom();
 }
 
 void MapScene::setTilesDrawingLevels(int zoomLevel)
@@ -203,41 +218,75 @@ void MapScene::setTilesDrawingLevels(int zoomLevel)
     }
 }
 
-QRect MapScene::spanItems(ScrollDirection direction, int zoomLevel)
+void MapScene::spanItems(ScrollDirection direction, int zoomLevel, QPoint sceneCoordinate, QSize viewSize)
 {
-    qDebug() << __PRETTY_FUNCTION__;
-
-    QRect spanRect; // = m_viewRect;
-    spanRect.setTop(0);
-    spanRect.setBottom(WORLD_PIXELS_Y);
-    int delta;
-
-    if (direction == SCROLL_WEST) {
-        //spanRect.translate(WORLD_PIXELS_X, 0);
-        spanRect.setLeft(m_tilesSceneRect.right());
-        spanRect.setRight(sceneRect().right());
-        delta = -WORLD_PIXELS_X;
-    }
-    else {
-        //spanRect.translate(-WORLD_PIXELS_X, 0);
-        spanRect.setRight(m_tilesSceneRect.left());
-        spanRect.setLeft(sceneRect().left());
-        delta = WORLD_PIXELS_X;
-    }
-
-    QTransform transform;
-    qreal scale = pow(2, zoomLevel - MAX_MAP_ZOOM_LEVEL);
-    transform.scale(scale, scale);
-    QList<QGraphicsItem *> spanItems = items(spanRect, Qt::IntersectsItemBoundingRect,
-                                             Qt::DescendingOrder, transform);
-
-    foreach (QGraphicsItem *item, spanItems) {
-        if (dynamic_cast<MapTile *>(item))
-            continue;
-        item->moveBy(delta, 0);
-    }
+    qWarning() << __PRETTY_FUNCTION__;
 
-    return spanRect;
+    // create rects for left and right side
+    QRect leftRect = sceneRect().toRect(); // this way we get the horizontal limits of the scene
+    leftRect.setTop(0);
+    leftRect.setBottom(WORLD_PIXELS_Y);
+    QRect rightRect = leftRect;
+
+    // calculate current horizontal area shown on the view
+    int viewSceneWidth = (1 << (MAX_MAP_ZOOM_LEVEL - zoomLevel)) * viewSize.width();
+    int viewSceneLeft = sceneCoordinate.x() - viewSceneWidth / 2;
+    int viewSceneRight = sceneCoordinate.x() + viewSceneWidth / 2;
+
+    // limit rect widths to be out of the current view
+    leftRect.setRight(viewSceneLeft);
+    rightRect.setLeft(viewSceneRight);
+
+    // move all items which intersects the rects
+    if (leftRect.width() > 0)
+        moveIntersectingItemsHorizontally(leftRect, WORLD_PIXELS_X);
+    if (rightRect.width() > 0)
+        moveIntersectingItemsHorizontally(rightRect, -WORLD_PIXELS_X);
+
+    /// @todo get small rects from boths sides of the view
+
+    /// @todo get all intersecting items, check which end of the view is nearer and move there
+
+
+//    QRect spanRect; // = m_viewRect;
+//    spanRect.setTop(0);
+//    spanRect.setBottom(WORLD_PIXELS_Y);
+//    int delta;
+
+//    int viewSceneWidth = (1 << (MAX_MAP_ZOOM_LEVEL - zoomLevel)) * viewSize.width();
+//    int gap = WORLD_PIXELS_X - viewSceneWidth;
+//    if (gap < 0)
+//        qCritical() << __PRETTY_FUNCTION__ << "viewSceneWidth > WORLD_PIXELS_X";
+
+//    int limiterUnNormalized = sceneCoordinate.x() + ((viewSceneWidth + gap) / 2);
+//    int limiter = MapEngine::normalize(limiterUnNormalized, 0, WORLD_PIXELS_X -1);
+
+//    if (sceneCoordinate.x() > limiter) {
+//        spanRect.setRight(limiter);
+//        spanRect.setLeft(sceneRect().left());
+//        delta = WORLD_PIXELS_X;
+//        qWarning() << __PRETTY_FUNCTION__ << "-->";
+//    }
+//    else {
+//        spanRect.setLeft(limiter);
+//        spanRect.setRight(sceneRect().right());
+//        delta = -WORLD_PIXELS_X;
+//        qWarning() << __PRETTY_FUNCTION__ << "<--";
+//    }
+
+//    QTransform transform;
+//    qreal scale = pow(2, zoomLevel - MAX_MAP_ZOOM_LEVEL);
+//    transform.scale(scale, scale);
+//    QList<QGraphicsItem *> spanItems = items(spanRect, Qt::IntersectsItemBoundingRect,
+//                                             Qt::DescendingOrder, transform);
+
+//    foreach (QGraphicsItem *item, spanItems) {
+//        if (dynamic_cast<MapTile *>(item))
+//            continue;
+//        item->moveBy(delta, 0);
+//    }
+
+//    return spanRect;
 }
 
 void MapScene::tilesSceneRectUpdated(QRect tilesSceneRect)
index 5722d01..73431c8 100644 (file)
@@ -115,7 +115,7 @@ public:
     */
     void setTilesDrawingLevels(int zoomLevel);
 
-    QRect spanItems(ScrollDirection direction, int zoomLevel);
+    void spanItems(ScrollDirection direction, int zoomLevel, QPoint sceneCoordinate, QSize viewSize);
 
     /**
     * @brief Save new tiles scene rect
@@ -129,6 +129,9 @@ public:
     */
     void tilesSceneRectUpdated(QRect tilesSceneRect);
 
+private:
+    void moveIntersectingItemsHorizontally(QRect from, int distance);
+
 private slots:
     /**
     * @brief Slot for running next queued removal of stacked tiles