Repaired defects found in review and removed MapView dependency from MapEngine
authorSami Rämö <sami.ramo@ixonos.com>
Wed, 7 Apr 2010 12:14:15 +0000 (15:14 +0300)
committerSami Rämö <sami.ramo@ixonos.com>
Wed, 7 Apr 2010 12:14:15 +0000 (15:14 +0300)
src/common.h [new file with mode: 0644]
src/map/mapengine.cpp
src/map/mapengine.h
src/map/maptile.cpp
src/map/mapview.cpp
src/map/mapview.h
src/src.pro
src/ui/mapviewscreen.cpp

diff --git a/src/common.h b/src/common.h
new file mode 100644 (file)
index 0000000..b9c8b02
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef COMMON_H
+#define COMMON_H
+
+static const int TILE_SIZE_X = 256; ///< Tile image size in x direction
+static const int TILE_SIZE_Y = 256; ///< Tile image size in y direction
+static const int MIN_ZOOM_LEVEL = 0; ///< Minimum zoom level
+static const int MAX_ZOOM_LEVEL = 18; ///< Maximum zoom level
+
+#endif // COMMON_H
index f7c2687..3a0e3bd 100644 (file)
 #include <QtCore>
 #include <QtGlobal>
 
-MapEngine::MapEngine(MapView *mapView, QWidget *parent)
+MapEngine::MapEngine(QWidget *parent)
     : QObject(parent)
 {
-    m_mapView = mapView;
     m_mapScene = new MapScene(this);
-    mapView->setScene(m_mapScene);
     m_zoomLevel = 14;
 
     m_mapFetcher = new MapFetcher(new QNetworkAccessManager(this), this);
@@ -46,23 +44,30 @@ MapEngine::MapEngine(MapView *mapView, QWidget *parent)
 }
 
 /**
-  * @todo Create URL builder method
+  * @todo DONE Create URL builder method
   * QUrl buildURL(zoomLevel, QPoint tileNumbers)
   */
 void MapEngine::setViewLocation(QPointF latLonCoordinate)
 {
-    m_mapView->setZoomLevel(m_zoomLevel);
+    emit zoomLevelChanged(m_zoomLevel);
 
     /// Fetch some map tiles for demo purposes
     for (int x=9351; x<=9354; x++) {
         for (int y=4261; y<=4264; y++) {
-            QString url = QString("http://tile.openstreetmap.org/mapnik/%1/%2/%3.png")
-                          .arg(m_zoomLevel).arg(x).arg(y);
-            m_mapFetcher->fetchMapImage(QUrl(url));
+            QUrl url = buildURL(m_zoomLevel, QPoint(x, y));
+            m_mapFetcher->fetchMapImage(url);
         }
     }
 }
 
+QUrl MapEngine::buildURL(int zoomLevel, QPoint tileNumbers)
+{
+    QString url = QString("http://tile.openstreetmap.org/mapnik/%1/%2/%3.png")
+                  .arg(zoomLevel).arg(tileNumbers.x()).arg(tileNumbers.y());
+
+    return QUrl(url);
+}
+
 /**
 * @todo Create URL parser methor and refactor code (use pointers for returning)
 */
@@ -123,3 +128,8 @@ qreal MapEngine::tileYToLatitude(int y, int zoom)
     qreal n = M_PI - 2 * M_PI * y / zoom;
     return 180.0 / (M_PI * atan(0.5 * exp(n) - exp(-n)));
 }
+
+QGraphicsScene* MapEngine::scene()
+{
+    return dynamic_cast<QGraphicsScene *>(m_mapScene);
+}
index 2f59db9..1505db6 100644 (file)
 #ifndef MAPENGINE_H
 #define MAPENGINE_H
 
-#include <math.h>
-
 #include <QtCore>
 
+#include "common.h"
 #include "mapfetcher.h"
 #include "mapscene.h"
 #include "mapview.h"
@@ -45,11 +44,9 @@ public:
     /**
     * @brief Constructor
     *
-    * Does create and add scene to map view.
-    * @param mapView View for map
     * @param parent Parent
     */
-    MapEngine(MapView *mapView, QWidget *parent = 0);
+    MapEngine(QWidget *parent = 0);
     
     /**
     * @brief Convert tile x & y numbers to MapScene coordinates
@@ -59,17 +56,25 @@ public:
     * @return QPoint MapScene coordinate
     */
     /**
-      * @todo use bit shift instead of pow
+      * @todo DONE use bit shift instead of pow
       */
     static QPoint convertTileNumberToSceneCoordinate(int zoomLevel, QPoint tileNumber)
     {
-        int x = tileNumber.x() * TILE_SIZE_X * pow(2, MAX_ZOOM_LEVEL - zoomLevel);
-        int y = tileNumber.y() * TILE_SIZE_Y * pow(2, MAX_ZOOM_LEVEL - zoomLevel);
+        int pow = 1 << (MAX_ZOOM_LEVEL - zoomLevel);
+        int x = tileNumber.x() * TILE_SIZE_X * pow;
+        int y = tileNumber.y() * TILE_SIZE_Y * pow;
 
         return QPoint(x, y);
     }
 
     /**
+    * @brief Getter for scene
+    *
+    * @return QGraphicsScene
+    */
+    QGraphicsScene* scene();
+
+    /**
     * @brief Set view location
     *
     * @param latLonCoordinate Latitude & longitude coordinates for location
@@ -96,6 +101,16 @@ public:
     */
     qreal tileYToLatitude(int y, int zoom);
 
+private:
+    /**
+    * @brief Build URL for donwloading single map tile from OpenStreetMap tile server
+    *
+    * @param zoomLevel Zoom level
+    * @param tileNumbers Tile x & y numbers
+    * @return URL for the required tile
+    */
+    QUrl buildURL(int zoomLevel, QPoint tileNumbers);
+
 private slots:
     /**
     * @brief Slot for received map tile images
@@ -106,14 +121,15 @@ private slots:
     */
     void mapImageReceived(const QUrl &url, const QPixmap &pixmap);
 
-public:
-    static const int TILE_SIZE_X = 256; ///< Tile image size in x direction
-    static const int TILE_SIZE_Y = 256; ///< Tile image size in y direction
-    static const int MIN_ZOOM_LEVEL = 0; ///< Minimum zoom level
-    static const int MAX_ZOOM_LEVEL = 18; ///< Maximum zoom level
+signals:
+    /**
+    * @brief Signal for zoom level change
+    *
+    * @param newZoomLevel New zoom level
+    */
+    void zoomLevelChanged(int newZoomLevel);
 
 private:
-    MapView *m_mapView; ///< View for viewing map
     MapScene *m_mapScene; ///< Scene for map tiles
     MapFetcher *m_mapFetcher; ///< Fetcher for map tiles
     int m_zoomLevel; ///< Current zoom level
index 0069987..23c81e7 100644 (file)
    USA.
 */
 
-#include <math.h>
-
 #include <QDebug>
 #include <QTransform>
 
-#include "maptile.h"
+#include "common.h"
 #include "mapengine.h"
+#include "maptile.h"
 
 MapTile::MapTile()
 {
@@ -43,10 +42,10 @@ void MapTile::setZoomLevel(int zoomLevel)
 {
     m_zoomLevel = zoomLevel;
     setPosition();
-/**
-  * @todo use bit shifting
-  */
-    double zoomFactor = pow(2, (MapEngine::MAX_ZOOM_LEVEL - m_zoomLevel));
+    /**
+      * @todo DONE use bit shifting
+      */
+    qreal zoomFactor = (qreal)(1 << (MAX_ZOOM_LEVEL - m_zoomLevel));
     setScale(zoomFactor);
 }
 
@@ -64,11 +63,13 @@ void MapTile::setTileNumber(QPoint tileNumber)
 void MapTile::setPosition()
 {
     /**
-      * @todo use bit shifting
+      * @todo DONE use bit shifting
       */
-    if ((m_zoomLevel >= MapEngine::MIN_ZOOM_LEVEL) && (m_zoomLevel <= MapEngine::MAX_ZOOM_LEVEL) &&
-            (m_tileNumber.x() >= 0) && (m_tileNumber.x() <= pow(2, m_zoomLevel) -1) &&
-            (m_tileNumber.y() >= 0) && (m_tileNumber.y() <= pow(2, m_zoomLevel) -1)) {
+    const int maxTileNumber = (1 << m_zoomLevel) - 1;
+
+    if ((m_zoomLevel >= MIN_ZOOM_LEVEL) && (m_zoomLevel <= MAX_ZOOM_LEVEL) &&
+            (m_tileNumber.x() >= 0) && (m_tileNumber.x() <= maxTileNumber) &&
+            (m_tileNumber.y() >= 0) && (m_tileNumber.y() <= maxTileNumber)) {
         setPos(MapEngine::convertTileNumberToSceneCoordinate(m_zoomLevel, m_tileNumber));
         return; // done
     }
@@ -77,4 +78,3 @@ void MapTile::setPosition()
     //Q_ASSERT_X(false, __PRETTY_FUNCTION__, "m_zoomLevel and/or m_tileNumber is undefined");
 }
 
-
index 2eff41d..1301f72 100644 (file)
@@ -24,8 +24,8 @@
 #include <QDebug>
 #include <QMouseEvent>
 
+#include "common.h"
 #include "mapview.h"
-#include "mapengine.h"
 
 MapView::MapView(QWidget *parent) : QGraphicsView(parent)
 {
@@ -35,7 +35,7 @@ MapView::MapView(QWidget *parent) : QGraphicsView(parent)
 
 void MapView::setZoomLevel(int zoomLevel)
 {
-    double scaleFactor = pow(2, zoomLevel - MapEngine::MAX_ZOOM_LEVEL);
+    double scaleFactor = pow(2, zoomLevel - MAX_ZOOM_LEVEL);
     scale(scaleFactor, scaleFactor);
 }
 
index 2ab7a5b..8cbde50 100644 (file)
@@ -40,20 +40,20 @@ public:
     */
     MapView(QWidget *parent = 0);
 
+private slots:
     /**
-    * @brief Set zoom level of the view
+    * @brief Slot for mouse events
     *
-    * @param zoomLevel Zoom level
+    * @param event Mouse event
     */
-    void setZoomLevel(int zoomLevel);
+    void mousePressEvent(QMouseEvent *event);
 
-public slots:
     /**
-    * @brief Slot for mouse events
+    * @brief Set zoom level of the view
     *
-    * @param event Mouse event
+    * @param zoomLevel Zoom level
     */
-    void mousePressEvent(QMouseEvent *event);
+    void setZoomLevel(int zoomLevel);
 };
 
 #endif // MAPVIEW_H
index 551631f..3d54f80 100644 (file)
@@ -12,7 +12,6 @@ SOURCES += main.cpp \
     map/mapscene.cpp \
     map/maptile.cpp \
     map/mapfetcher.cpp
-
 HEADERS += ui/mainwindow.h \
     ui/mapviewscreen.h \
     ui/listviewscreen.h \
@@ -20,7 +19,8 @@ HEADERS += ui/mainwindow.h \
     map/mapview.h \
     map/mapscene.h \
     map/maptile.h \
-    map/mapfetcher.h
+    map/mapfetcher.h \
+    common.h
 QT += network
 
 # -----------------------------------------------------------------
index b3ebc2c..82b89dc 100644 (file)
@@ -30,6 +30,8 @@ MapViewScreen::MapViewScreen(QWidget *parent)
    MapView *mapView = new MapView(this);
    mapViewLayout->addWidget(mapView);
    setLayout(mapViewLayout);
-   MapEngine *mapEngine = new MapEngine(mapView, this);
+   MapEngine *mapEngine = new MapEngine(this);
+   mapView->setScene(mapEngine->scene());
+   connect(mapEngine, SIGNAL(zoomLevelChanged(int)), mapView, SLOT(setZoomLevel(int)));
    mapEngine->setViewLocation(QPointF(25.5000, 65.0000));
 }