Modified MapView viewportUpdateMode.
[situare] / src / map / mapengine.h
index c681d61..d64a6a4 100644 (file)
@@ -47,6 +47,15 @@ public:
     * @param parent Parent
     */
     MapEngine(QObject *parent = 0);
+
+    /**
+    * @brief MapEngine initializer
+    *
+    * Set initial location and zoom level for the engine. locationChanged and
+    * zoomLevelChanged signals are emitted, so init should be called after
+    * those signals are connected to MapView.
+    */
+    void init();
     
     /**
     * @brief Convert tile x & y numbers to MapScene coordinates
@@ -58,7 +67,7 @@ public:
 
     static QPoint convertTileNumberToSceneCoordinate(int zoomLevel, QPoint tileNumber)
     {
-        int pow = 1 << (MAX_ZOOM_LEVEL - zoomLevel);
+        int pow = 1 << (MAX_MAP_ZOOM_LEVEL - zoomLevel);
         int x = tileNumber.x() * TILE_SIZE_X * pow;
         int y = tileNumber.y() * TILE_SIZE_Y * pow;
 
@@ -67,9 +76,9 @@ public:
 
     static QPoint convertSceneCoordinateToTileNumber(int zoomLevel, QPointF sceneCoordinate)
     {
-        int pow = 1 << (MAX_ZOOM_LEVEL - zoomLevel);
-        int x = static_cast<int>(sceneCoordinate.x()) / (TILE_SIZE_X*pow);
-        int y = static_cast<int>(sceneCoordinate.y()) / (TILE_SIZE_Y*pow);
+        int pow = 1 << (MAX_MAP_ZOOM_LEVEL - zoomLevel);
+        int x = static_cast<int>(sceneCoordinate.x() / (TILE_SIZE_X*pow));
+        int y = static_cast<int>(sceneCoordinate.y() / (TILE_SIZE_Y*pow));
 
         return QPoint(x, y);
     }
@@ -82,7 +91,8 @@ public:
     QGraphicsScene* scene();
 
     /**
-    * @brief Set view location
+    * @brief Helper for setting view location based on latitude and longitude
+    * coordinates
     *
     * @param latLonCoordinate Latitude & longitude coordinates for location
     */
@@ -91,37 +101,41 @@ public:
     /**
     * @brief Converts latitude, longitude and zoom to tile x, y values.
     *
-    * @param zoomLevel zoom level
     * @param latLonCoordinate latitude and longitude values
     * @return QPoint tile x,y value
     */
-    static QPoint convertLatLonToTile(int zoomLevel, QPointF latLonCoordinate)
+    static QPointF convertLatLonToSceneCoordinate(QPointF latLonCoordinate)
     {
+        /// @todo CREATE TEST CASE & CHECK CALCULATION
         qDebug() << __PRETTY_FUNCTION__;
 
         qreal longitude = latLonCoordinate.x();
         qreal latitude = latLonCoordinate.y();
 
-        if ((zoomLevel > MAX_ZOOM_LEVEL) || (zoomLevel < MIN_ZOOM_LEVEL))
-            return QPoint(UNDEFINED, UNDEFINED);
         if ((longitude > MAX_LONGITUDE) || (longitude < MIN_LONGITUDE))
             return QPoint(UNDEFINED, UNDEFINED);
         if ((latitude > MAX_LATITUDE) || (latitude < MIN_LATITUDE))
             return QPoint(UNDEFINED, UNDEFINED);
 
-        qreal z = static_cast<qreal>(1 << zoomLevel);
+        qreal z = static_cast<qreal>(1 << MAX_MAP_ZOOM_LEVEL);
 
         qreal x = static_cast<qreal>((longitude + 180.0) / 360.0);
         qreal y = static_cast<qreal>((1.0 - log(tan(latitude * M_PI / 180.0) + 1.0
                                     / cos(latitude * M_PI / 180.0)) / M_PI) / 2.0);
 
-        return QPoint(qFloor(x*z), qFloor(y*z));
+        return QPointF(x*z*TILE_SIZE_X, y*z*TILE_SIZE_Y);
     }
 
-    QRect calculateGrid(QPointF sceneCenterCoordinate);
-
 public slots:
-    void setLocation(QPointF sceneCenterCoordinate);
+    /**
+    * @brief Slot for setting current view location
+    *
+    * Emits locationChanged signal.
+    * @param sceneCoordinate Scene coordinates for new position
+    */
+    void setLocation(QPointF sceneCoordinate);
+
+    void viewResized(const QSize &size);
 
 private:
     /**
@@ -144,8 +158,47 @@ private:
     */
     void parseURL(const QUrl &url, int &zoom, int &x, int &y);
 
+    /**
+    * @brief Set zValues for all tiles in the scene
+    *
+    * Drawing order of MapTiles, which has the zoom level higher than the current
+    * zoom level, is reversed and those MapTiles are mapped between lower level MapTiles.
+    * Example: If maximum zoom level is 18 and current view zoomlevel is 15, then
+    * the drawing order from top to bottom is 15, 16, 14, 17, 13, 18, 12, 11, 10, ...
+    */
+    void setZValues();
+
     int tileMaxValue(int zoomLevel);
 
+    /**
+    * @brief Calculates grid of tile coordinates from current scene coordinate.
+    *
+    * Grid size is calculated from view size and scene's current center coordinate.
+    *
+    * @param sceneCoordinate scene's current center coordinate
+    * @return QRect grid of tile coordinates
+    */
+    QRect calculateGrid(QPointF sceneCoordinate);
+
+    /**
+    * @brief Calculate new tiles to fetch.
+    *
+    * @param sceneCoordinate scene's center coordinate
+    */
+    void calculateNewTiles(QPointF sceneCoordinate);
+
+    /**
+    * @brief Removes tiles which are out of view bounds.
+    */
+    void removeOldTiles();
+
+    /**
+    * @brief Checks if center tile has changed.
+    *
+    * @param sceneCoordinate scene's center coordinate
+    * @return bool true if center tile changed, false otherwise
+    */
+    bool centerTileChanged(QPointF sceneCoordinate);
 
 private slots:
     /**
@@ -157,8 +210,27 @@ private slots:
     */
     void mapImageReceived(const QUrl &url, const QPixmap &pixmap);
 
+    /**
+    * @brief Slot for zooming in
+    *
+    */
+    void zoomIn();
+
+    /**
+    * @brief Slot for zooming out
+    *
+    */
+    void zoomOut();
+
 signals:
     /**
+    * @brief Signal for view location change
+    *
+    * @param sceneCoordinate New scene coordinates
+    */
+    void locationChanged(QPointF sceneCoordinate);
+
+    /**
     * @brief Signal for zoom level change
     *
     * @param newZoomLevel New zoom level
@@ -170,10 +242,16 @@ signals:
     void centerToSceneCoordinates(QPointF sceneCoordinate);
 
 private:
+
     MapScene *m_mapScene; ///< Scene for map tiles
     MapFetcher *m_mapFetcher; ///< Fetcher for map tiles
     int m_zoomLevel; ///< Current zoom level
     QHash<QString, MapTile *> mapTilesInScene;  ///< List of map tiles in map scene
+    QSize m_viewSize;
+    QPointF m_sceneCoordinate;
+    QQueue<QString> mapTilesInView;
+    QPoint m_centerTile;
+    QRect viewGrid;
 };
 
 #endif // MAPENGINE_H