From: Sami Rämö Date: Tue, 8 Jun 2010 08:34:51 +0000 (+0300) Subject: Got spanning of items (friends, locations) working X-Git-Tag: v0.6~1^2~26 X-Git-Url: https://vcs.maemo.org/git/?a=commitdiff_plain;h=02cd401e0bbce9ab18173ed053628d192230fd85;p=situare Got spanning of items (friends, locations) working --- diff --git a/src/map/frienditemshandler.cpp b/src/map/frienditemshandler.cpp index 71952fe..d5fd823 100644 --- a/src/map/frienditemshandler.cpp +++ b/src/map/frienditemshandler.cpp @@ -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())) diff --git a/src/map/frienditemshandler.h b/src/map/frienditemshandler.h index 11b9c1b..2bbd059 100644 --- a/src/map/frienditemshandler.h +++ b/src/map/frienditemshandler.h @@ -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: /** diff --git a/src/map/mapengine.cpp b/src/map/mapengine.cpp index c5f566d..68f8183 100644 --- a/src/map/mapengine.cpp +++ b/src/map/mapengine.cpp @@ -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) diff --git a/src/map/mapengine.h b/src/map/mapengine.h index 029e6a7..ec75097 100644 --- a/src/map/mapengine.h +++ b/src/map/mapengine.h @@ -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 * diff --git a/src/map/mapscene.cpp b/src/map/mapscene.cpp index 6fc1cc8..2c3a945 100644 --- a/src/map/mapscene.cpp +++ b/src/map/mapscene.cpp @@ -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 spanItems = items(from, Qt::IntersectsItemBoundingRect); + foreach (QGraphicsItem *item, spanItems) { + if (dynamic_cast(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 viewTiles = items(m_tilesSceneRect, Qt::IntersectsItemBoundingRect); QList 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 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(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 spanItems = items(spanRect, Qt::IntersectsItemBoundingRect, - Qt::DescendingOrder, transform); - - foreach (QGraphicsItem *item, spanItems) { - if (dynamic_cast(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 spanItems = items(spanRect, Qt::IntersectsItemBoundingRect, +// Qt::DescendingOrder, transform); + +// foreach (QGraphicsItem *item, spanItems) { +// if (dynamic_cast(item)) +// continue; +// item->moveBy(delta, 0); +// } + +// return spanRect; } void MapScene::tilesSceneRectUpdated(QRect tilesSceneRect) diff --git a/src/map/mapscene.h b/src/map/mapscene.h index 5722d01..73431c8 100644 --- a/src/map/mapscene.h +++ b/src/map/mapscene.h @@ -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