Merge branch 'master' into indicator
[situare] / src / map / mapscene.cpp
index b7b9508..7330f9f 100644 (file)
 
 #include <QDebug>
 
+#include "coordinates/scenecoordinate.h"
 #include "mapcommon.h"
-#include "mapengine.h"
 #include "maptile.h"
 
 #include "mapscene.h"
 
-const int MAP_MIN_PIXEL_Y = 0;
-const int MAP_MAX_PIXEL_Y = MAX_TILES_PER_SIDE * TILE_SIZE_Y - 1;
-
 MapScene::MapScene(QObject *parent)
     : QGraphicsScene(parent)
     , m_isRemoveStackedTilesRunning(false)
+    , m_zoomLevel(0)
     , m_tilesSceneRect(QRect(0, 0, 0, 0))
+    , m_viewTilesGrid(QRect(0, 0, 0, 0))
 {
     qDebug() << __PRETTY_FUNCTION__;
 
     setBackgroundBrush(Qt::lightGray);
-    setSceneRect(QRect(QPoint(MAP_SCENE_MIN_PIXEL_X, MAP_MIN_PIXEL_Y),
-                       QPoint(MAP_SCENE_MAX_PIXEL_X, MAP_MAX_PIXEL_Y)));
+    setSceneRect(QRect(QPoint(MAP_SCENE_MIN_PIXEL_X, OSM_MAP_MIN_PIXEL_Y),
+                       QPoint(MAP_SCENE_MAX_PIXEL_X, OSM_MAP_MAX_PIXEL_Y)));
 }
 
 void MapScene::addTile(int tileZoomLevel, QPoint tileNumber, const QPixmap &image, int viewZoomLevel)
 {
-//    qWarning() << __PRETTY_FUNCTION__ << "x:" << tileNumber.x() << "y:" << tileNumber.y();
+    qDebug() << __PRETTY_FUNCTION__;
 
     // tile might already be in the scene if expired tile was returned from the cache to be
     // temporarily shown while downloading the fresh one.
-    QString hashKey = MapEngine::tilePath(tileZoomLevel, tileNumber.x(), tileNumber.y());
+    QString hashKey = MapTile::tilePath(tileZoomLevel, tileNumber.x(), tileNumber.y());
     MapTile *oldTile = tileInScene(hashKey);
     if (oldTile)
         removeTile(oldTile);
@@ -61,7 +60,7 @@ void MapScene::addTile(int tileZoomLevel, QPoint tileNumber, const QPixmap &imag
     m_mapTilesInScene.insert(hashKey, tile);
     addItem(tile);
 
-    qWarning() << __PRETTY_FUNCTION__ << "tiles:" << m_mapTilesInScene.count();
+    qDebug() << __PRETTY_FUNCTION__ << "tiles count:" << m_mapTilesInScene.count();
 
     enqueueRemoveStackedTiles(tile);
     removeOtherLevelTiles();
@@ -78,6 +77,23 @@ void MapScene::enqueueRemoveStackedTiles(MapTile *newTile)
     }
 }
 
+qreal MapScene::horizontalResolutionAtLatitude(double latitude)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    const int SHIFT = 200;
+
+    GeoCoordinate from = GeoCoordinate(latitude, 0);
+
+    SceneCoordinate fromScene = SceneCoordinate(from);
+    SceneCoordinate toScene(fromScene.x() + SHIFT, fromScene.y());
+    GeoCoordinate to(toScene);
+
+    qreal distance = from.distanceTo(to);
+
+    return (distance / SHIFT);
+}
+
 void MapScene::moveIntersectingItemsHorizontally(QRect from, int distance)
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -114,26 +130,21 @@ void MapScene::runNextStackedTilesRemoval()
 
 void MapScene::removeOtherLevelTiles()
 {
-//    qWarning() << __PRETTY_FUNCTION__;
+    qDebug() << __PRETTY_FUNCTION__;
 
     for (int x = m_viewTilesGrid.left(); x <= m_viewTilesGrid.right(); x++) {
         for (int y = m_viewTilesGrid.top(); y <= m_viewTilesGrid.bottom(); y++) {
-//            qWarning() << __PRETTY_FUNCTION__ << "x:" << x << "y:" << y;
-            if (!m_mapTilesInScene.contains(MapEngine::tilePath(m_zoomLevel, x, y)))
+            if (!m_mapTilesInScene.contains(MapTile::tilePath(m_zoomLevel, x, y)))
                 return;
         }
     }
 
-//    qWarning() << __PRETTY_FUNCTION__ << "all current grid tiles are in the scene";
-
     foreach(MapTile *tile, m_mapTilesInScene) {
         if (tile->zoomLevel() != m_zoomLevel) {
             removeTile(tile);
-            qWarning() << __PRETTY_FUNCTION__ << "removed other level tile -------------";
+            qDebug() << __PRETTY_FUNCTION__ << "removed other level tile";
         }
     }
-
-//    qWarning() << __PRETTY_FUNCTION__ << "items in scene:" << items().count();
 }
 
 void MapScene::removeOutOfViewTiles(QRect tilesGrid, int zoomLevel)
@@ -152,9 +163,11 @@ void MapScene::removeOutOfViewTiles(QRect tilesGrid, int zoomLevel)
 
     // if view is near east limit of the map, then there is duplicate tiles also on the opposite
     // side of the world which are removed from allTiles
-    if (tilesGrid.right() > (MapEngine::tileMaxIndex(zoomLevel) - tilesGridWidthHalf + GRID_PADDING)) {
+    if (tilesGrid.right() > ((MapTile::lastTileIndex(zoomLevel)
+                              - tilesGridWidthHalf
+                              + MAP_GRID_PADDING))) {
         QRect oppositeRect = m_tilesSceneRect;
-        oppositeRect.translate(-MAP_PIXELS_X, 0);
+        oppositeRect.translate(-OSM_MAP_PIXELS_X, 0);
         QList<QGraphicsItem *> oppositeItems = items(oppositeRect, Qt::IntersectsItemBoundingRect);
         foreach (QGraphicsItem *item, oppositeItems)
             allItems.removeOne(item);
@@ -162,9 +175,9 @@ void MapScene::removeOutOfViewTiles(QRect tilesGrid, int zoomLevel)
 
     // if view is near west limit of the map, then there is duplicate tiles also on the opposite
     // side of the world which are removed from allTiles
-    if (tilesGrid.left() < (tilesGridWidthHalf - GRID_PADDING)) {
+    if (tilesGrid.left() < (tilesGridWidthHalf - MAP_GRID_PADDING)) {
         QRect oppositeRect = m_tilesSceneRect;
-        oppositeRect.translate(MAP_PIXELS_X, 0);
+        oppositeRect.translate(OSM_MAP_PIXELS_X, 0);
         QList<QGraphicsItem *> oppositeItems = items(oppositeRect, Qt::IntersectsItemBoundingRect);
         foreach (QGraphicsItem *item, oppositeItems)
             allItems.removeOne(item);
@@ -176,8 +189,6 @@ void MapScene::removeOutOfViewTiles(QRect tilesGrid, int zoomLevel)
         if (tile)
             removeTile(tile);
     }
-
-//    qWarning() << __PRETTY_FUNCTION__ << "items in scene:" << items().count();
 }
 
 void MapScene::removeStackedTiles(MapTile *newTile)
@@ -199,32 +210,31 @@ void MapScene::removeStackedTiles(MapTile *newTile)
             }
         }
     }
-//    qWarning() << __PRETTY_FUNCTION__ << "items in scene:" << items().count();
 }
 
 void MapScene::removeTile(MapTile *tile)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    m_mapTilesInScene.remove(MapEngine::tilePath(tile->zoomLevel(),
-                                                 tile->tileNumber().x(),
-                                                 tile->tileNumber().y()));
+    m_mapTilesInScene.remove(MapTile::tilePath(tile->zoomLevel(),
+                                               tile->tileNumber().x(),
+                                               tile->tileNumber().y()));
     removeItem(tile);
     m_removeStackedTilesList.removeAll(tile);
     delete tile;
 
-    qWarning() << __PRETTY_FUNCTION__ << "tiles:" << m_mapTilesInScene.count();
+    qDebug() << __PRETTY_FUNCTION__ << "tiles count:" << m_mapTilesInScene.count();
 }
 
 void MapScene::setSceneVerticalOverlap(int viewHeight, int zoomLevel)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    int overlap = viewHeight / 2 * (1 << (MAX_MAP_ZOOM_LEVEL - zoomLevel));
+    int overlap = viewHeight / 2 * (1 << (OSM_MAX_ZOOM_LEVEL - zoomLevel));
 
     QRect rect = sceneRect().toRect();
-    rect.setTop(MAP_MIN_PIXEL_Y - overlap);
-    rect.setBottom(MAP_MAX_PIXEL_Y + overlap);
+    rect.setTop(OSM_MAP_MIN_PIXEL_Y - overlap);
+    rect.setBottom(OSM_MAP_MAX_PIXEL_Y + overlap);
     setSceneRect(rect);
 }
 
@@ -255,33 +265,28 @@ void MapScene::setZoomLevel(int zoomLevel)
     m_zoomLevel = zoomLevel;
 }
 
-void MapScene::spanItems(int zoomLevel, QPoint sceneCoordinate, QSize viewSize)
+void MapScene::spanItems(QRectF viewSceneRect)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
     // create rects for left and right side
     QRect leftRect = sceneRect().toRect(); // this way we get the horizontal limits of the scene
-    leftRect.setTop(MAP_MIN_PIXEL_Y);
-    leftRect.setBottom(MAP_MAX_PIXEL_Y);
+    leftRect.setTop(OSM_MAP_MIN_PIXEL_Y);
+    leftRect.setBottom(OSM_MAP_MAX_PIXEL_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 rects to include only area which really must be moved
-    leftRect.setRight(-1 - (MAP_PIXELS_X - 1 - viewSceneRight));
-    rightRect.setLeft(MAP_PIXELS_X + viewSceneLeft);
+    leftRect.setRight(-1 - (OSM_MAP_PIXELS_X - 1 - viewSceneRect.right()));
+    rightRect.setLeft(OSM_MAP_PIXELS_X + viewSceneRect.left());
 
-    Q_ASSERT_X(leftRect.right() < viewSceneLeft, "spanning rect right value", "move rect is in the view area");
-    Q_ASSERT_X(rightRect.left() > viewSceneRight, "spanning rect left value", "move rect is in the view area");
+    Q_ASSERT_X(leftRect.right() < viewSceneRect.left(), "spanning rect right value", "move rect is in the view area");
+    Q_ASSERT_X(rightRect.left() > viewSceneRect.right(), "spanning rect left value", "move rect is in the view area");
 
     // move all items which intersects the rects
     if (leftRect.left() < leftRect.right())
-        moveIntersectingItemsHorizontally(leftRect, MAP_PIXELS_X);
+        moveIntersectingItemsHorizontally(leftRect, OSM_MAP_PIXELS_X);
     if (rightRect.left() < rightRect.right())
-        moveIntersectingItemsHorizontally(rightRect, -MAP_PIXELS_X);
+        moveIntersectingItemsHorizontally(rightRect, -OSM_MAP_PIXELS_X);
 }
 
 void MapScene::tilesSceneRectUpdated(QRect tilesSceneRect)