// 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)
// 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);
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
// }
// }
- 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)
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)
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)
}
}
+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__;
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();
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);
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);
}
}
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)
}
}
-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)