Updated tests cases matching the new tabs
[situare] / src / map / maptile.cpp
index 8d31c24..f131b6d 100644 (file)
 #include <QDebug>
 #include <QTransform>
 
+#include "coordinates/scenecoordinate.h"
 #include "mapcommon.h"
-#include "mapengine.h"
+
 #include "maptile.h"
 
 MapTile::MapTile()
-    : m_tileNumber(QPoint(UNDEFINED, UNDEFINED))
-    , m_zoomLevel(UNDEFINED)
+    : m_zoomLevel(UNDEFINED)
+    , m_tileNumber(QPoint(UNDEFINED, UNDEFINED))
 {
     qDebug() << __PRETTY_FUNCTION__;
 
@@ -36,23 +37,23 @@ MapTile::MapTile()
     setShapeMode(QGraphicsPixmapItem::BoundingRectShape);
 }
 
-int MapTile::zoomLevel()
+SceneCoordinate MapTile::convertTileNumberToSceneCoordinate(int zoomLevel, QPoint tileNumber)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    return m_zoomLevel;
+    int pow = 1 << (OSM_MAX_ZOOM_LEVEL - zoomLevel);
+    int x = tileNumber.x() * OSM_TILE_SIZE_X * pow;
+    int y = tileNumber.y() * OSM_TILE_SIZE_Y * pow;
+
+    return SceneCoordinate(x, y);
 }
 
-void MapTile::setZoomLevel(int tileZoomLevel, int currentViewZoomLevel)
+int MapTile::lastTileIndex(int zoomLevel)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    m_zoomLevel = tileZoomLevel;
-
-    setSceneLevel(currentViewZoomLevel);
-
-    qreal zoomFactor = static_cast<qreal>(1 << (MAX_MAP_ZOOM_LEVEL - m_zoomLevel));
-    setScale(zoomFactor);
+    // subtract one because first tile index is zero
+    return tilesPerSide(zoomLevel) - 1;
 }
 
 void MapTile::setSceneLevel(int currentZoomLevel)
@@ -60,12 +61,56 @@ void MapTile::setSceneLevel(int currentZoomLevel)
     qDebug() << __PRETTY_FUNCTION__;
 
     if (currentZoomLevel < m_zoomLevel) {
-        qreal z = static_cast<qreal>(MIN_MAP_SCENE_NORMAL_LEVEL + currentZoomLevel
+        qreal z = static_cast<qreal>(MAP_SCENE_MIN_NORMAL_LEVEL + currentZoomLevel
                                      - (m_zoomLevel - currentZoomLevel)) + 0.5;
         setZValue(z);
     }
     else
-        setZValue(static_cast<qreal>(MIN_MAP_SCENE_NORMAL_LEVEL + m_zoomLevel));
+        setZValue(static_cast<qreal>(MAP_SCENE_MIN_NORMAL_LEVEL + m_zoomLevel));
+}
+
+void MapTile::setTileNumber(QPoint tileNumber)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    m_tileNumber = tileNumber;
+    setPosition();
+}
+
+void MapTile::setPosition()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    const int MAX_TILE_NUMBER = MapTile::lastTileIndex(m_zoomLevel);
+
+    // calculate min & max horizontal tile index numbers
+    const int INDEX_0_TILE = 1;
+    const int MIN_TILE_NUMBER_X = -tilesPerSide(m_zoomLevel)
+                                  * MAP_SCENE_VERTICAL_OVERSIZE_FACTOR;
+    const int MAX_TILE_NUMBER_X = tilesPerSide(m_zoomLevel)
+                                  * (1 + MAP_SCENE_VERTICAL_OVERSIZE_FACTOR)
+                                  - INDEX_0_TILE;
+
+    if ((m_zoomLevel >= OSM_MIN_ZOOM_LEVEL) && (m_zoomLevel <= OSM_MAX_ZOOM_LEVEL)
+        && (m_tileNumber.x() >= MIN_TILE_NUMBER_X) && (m_tileNumber.x() <= MAX_TILE_NUMBER_X)
+        && (m_tileNumber.y() >= 0) && (m_tileNumber.y() <= MAX_TILE_NUMBER)) {
+            setPos(convertTileNumberToSceneCoordinate(m_zoomLevel, m_tileNumber).toPointF());
+    } else {
+        setPos(UNDEFINED, UNDEFINED);
+    }
+}
+
+void MapTile::setZoomLevel(int tileZoomLevel, int currentViewZoomLevel)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    m_zoomLevel = tileZoomLevel;
+    setPosition();
+
+    setSceneLevel(currentViewZoomLevel);
+
+    qreal zoomFactor = static_cast<qreal>(1 << (OSM_MAX_ZOOM_LEVEL - m_zoomLevel));
+    setScale(zoomFactor);
 }
 
 QPoint MapTile::tileNumber()
@@ -75,9 +120,25 @@ QPoint MapTile::tileNumber()
     return m_tileNumber;
 }
 
-void MapTile::setTileNumber(QPoint tileNumber)
+QString MapTile::tilePath(int zoomLevel, int x, int y)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    m_tileNumber = tileNumber;
+    QString tilePathString(QString::number(zoomLevel) + "/");
+    tilePathString.append(QString::number(x) + "/");
+    tilePathString.append(QString::number(y));
+
+    return tilePathString;
+}
+
+int MapTile::tilesPerSide(int zoomLevel)
+{
+    return (1 << zoomLevel);
+}
+
+int MapTile::zoomLevel()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    return m_zoomLevel;
 }