Fixed some review defects
authorSami Rämö <sami.ramo@ixonos.com>
Mon, 3 May 2010 10:32:07 +0000 (13:32 +0300)
committerSami Rämö <sami.ramo@ixonos.com>
Mon, 3 May 2010 10:32:07 +0000 (13:32 +0300)
 - Fixed defects found in MapFetcher & MapEngine

 - Created MapTileRequest class

 - Added missing debug messages to map related classes

src/map/mapengine.cpp
src/map/mapengine.h
src/map/mapfetcher.cpp
src/map/mapfetcher.h
src/map/mapscene.cpp
src/map/maptile.cpp
src/map/mapview.cpp
src/src.pro

index 1cddef3..2d28126 100644 (file)
@@ -39,12 +39,15 @@ MapEngine::MapEngine(QObject *parent)
     , m_zoomedIn(false)
     , m_zoomLevel(DEFAULT_ZOOM_LEVEL)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     m_mapScene = new MapScene(this);
 
     m_mapFetcher = new MapFetcher(new QNetworkAccessManager(this), this);
-    connect(this, SIGNAL(fetchImage(int,int,int)), m_mapFetcher, SLOT(enqueueFetchMapImage(int,int,int)));
-    connect(m_mapFetcher, SIGNAL(mapImageReceived(int,int,int,QPixmap)), this,
-            SLOT(mapImageReceived(int,int,int,QPixmap)));
+    connect(this, SIGNAL(fetchImage(int,int,int)),
+            m_mapFetcher, SLOT(enqueueFetchMapImage(int,int,int)));
+    connect(m_mapFetcher, SIGNAL(mapImageReceived(int,int,int,QPixmap)),
+            this, SLOT(mapImageReceived(int,int,int,QPixmap)));
 
     m_mapZoomPanel = new MapZoomPanel(NULL, MAP_ZOOM_PANEL_POSITION_X, MAP_ZOOM_PANEL_POSITION_Y);
     m_mapScene->addItem(m_mapZoomPanel);
@@ -57,6 +60,8 @@ MapEngine::MapEngine(QObject *parent)
 
 void MapEngine::init()
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     emit zoomLevelChanged(m_zoomLevel);
     setViewLocation(QPointF(DEFAULT_LONGITUDE, DEFAULT_LATITUDE));
 }
@@ -64,6 +69,7 @@ void MapEngine::init()
 void MapEngine::setViewLocation(QPointF latLonCoordinate)
 {
     qDebug() << __PRETTY_FUNCTION__;
+
     setLocation(convertLatLonToSceneCoordinate(latLonCoordinate));
 }
 
@@ -87,16 +93,22 @@ void MapEngine::mapImageReceived(int zoomLevel, int x, int y, const QPixmap &ima
 
 QGraphicsScene* MapEngine::scene()
 {
-    return dynamic_cast<QGraphicsScene *>(m_mapScene);
+    qDebug() << __PRETTY_FUNCTION__;
+
+    return m_mapScene;
 }
 
 int MapEngine::tileMaxValue(int zoomLevel)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     return (1 << zoomLevel) - 1;
 }
 
 QRect MapEngine::calculateTileGrid(QPoint sceneCoordinate)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     QPoint tileCoordinate = convertSceneCoordinateToTileNumber(m_zoomLevel, sceneCoordinate);
     int gridWidth = (m_viewSize.width()/TILE_SIZE_X + 1) + (GRID_PADDING*2);
     int gridHeight = (m_viewSize.height()/TILE_SIZE_Y + 1) + (GRID_PADDING*2);
@@ -130,6 +142,8 @@ void MapEngine::setLocation(QPoint sceneCoordinate)
 
 bool MapEngine::isCenterTileChanged(QPoint sceneCoordinate)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     QPoint centerTile = convertSceneCoordinateToTileNumber(m_zoomLevel, sceneCoordinate);
     QPoint temp = m_centerTile;
     m_centerTile = centerTile;
@@ -175,16 +189,25 @@ void MapEngine::getTiles(QPoint sceneCoordinate)
 
 void MapEngine::updateViewTilesSceneRect()
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
+    const QPoint ONE_TILE = QPoint(1, 1);
+    const QPoint ONE_PIXEL = QPoint(1, 1);
+
     QPoint topLeft = convertTileNumberToSceneCoordinate(m_zoomLevel, m_viewTilesGrid.topLeft());
+    // one tile - one pixel is added because returned coordinates are pointing to upper left corner
+    // of the last tile.
     QPoint bottomRight = convertTileNumberToSceneCoordinate(m_zoomLevel,
                                                             m_viewTilesGrid.bottomRight()
-                                                             + QPoint(1, 1)) - QPoint(1, 1);
+                                                             + ONE_TILE) - ONE_PIXEL;
 
     m_mapScene->viewRectUpdated(QRect(topLeft, bottomRight));
 }
 
 void MapEngine::viewResized(const QSize &size)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     m_viewSize = size;
     getTiles(m_sceneCoordinate);
     m_mapScene->removeOutOfViewTiles();
@@ -231,6 +254,8 @@ void MapEngine::zoomOut()
 
 QString MapEngine::tilePath(int zoomLevel, int x, int y)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     QString tilePathString(QString::number(zoomLevel) + "/");
     tilePathString.append(QString::number(x) + "/");
     tilePathString.append(QString::number(y));
@@ -240,6 +265,8 @@ QString MapEngine::tilePath(int zoomLevel, int x, int y)
 
 QPoint MapEngine::convertSceneCoordinateToTileNumber(int zoomLevel, QPoint sceneCoordinate)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     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));
@@ -249,6 +276,8 @@ QPoint MapEngine::convertSceneCoordinateToTileNumber(int zoomLevel, QPoint scene
 
 QPoint MapEngine::convertTileNumberToSceneCoordinate(int zoomLevel, QPoint tileNumber)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     int pow = 1 << (MAX_MAP_ZOOM_LEVEL - zoomLevel);
     int x = tileNumber.x() * TILE_SIZE_X * pow;
     int y = tileNumber.y() * TILE_SIZE_Y * pow;
index ba41910..6cdec05 100644 (file)
@@ -246,10 +246,10 @@ signals:
  * DATA MEMBERS
  ******************************************************************************/
 private:
+    QPoint m_centerTile; ///< Current center tile
     MapFetcher *m_mapFetcher; ///< Fetcher for map tiles
     MapScene *m_mapScene; ///< Scene for map tiles
     MapZoomPanel *m_mapZoomPanel; ///< Toolbar for zoom buttons
-    QPoint m_centerTile; ///< Current center tile
     OwnLocationItem *m_ownLocation; ///< Item to show own location
     QPoint m_sceneCoordinate; ///< Current center coordinate
     QRect m_viewTilesGrid; ///< Current grid of tiles in view (includes margin)
index cd95ffa..9a01db8 100644 (file)
 #include "mapfetcher.h"
 #include "mapcommon.h"
 
+const int MAX_PARALLEL_DOWNLOADS = 2; ///< Max simultaneous parallel downloads
+const int NOT_FOUND = -1; ///< Return value if matching request is not found from the list
+
 MapFetcher::MapFetcher(QNetworkAccessManager *manager, QObject *parent)
     : QObject(parent)
     , m_pendingRequestsSize(0)
     , m_fetchMapImagesTimerRunning(false)
     , m_manager(manager)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     QNetworkDiskCache *diskCache = new QNetworkDiskCache(this);
     diskCache->setCacheDirectory(QDesktopServices::storageLocation(
             QDesktopServices::CacheLocation));
@@ -49,10 +54,24 @@ MapFetcher::MapFetcher(QNetworkAccessManager *manager, QObject *parent)
 
 QUrl MapFetcher::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());
+    qDebug() << __PRETTY_FUNCTION__;
 
-    return QUrl(url);
+    /**
+    * @brief Map server string for building actual URL
+    *
+    * %1 zoom level
+    * %2 x index
+    * %3 y index
+    *
+    * NOTE: If the URL is changed, then the parseURL method must be changed to match
+    *       the new URL structure
+    *
+    * @var MAP_SERVER_URL
+    */
+    const QString MAP_SERVER_URL = QString("http://tile.openstreetmap.org/mapnik/%1/%2/%3.png");
+
+    return QString(MAP_SERVER_URL)
+            .arg(zoomLevel).arg(tileNumbers.x()).arg(tileNumbers.y());
 }
 
 void MapFetcher::checkNextRequestFromCache()
@@ -61,9 +80,10 @@ void MapFetcher::checkNextRequestFromCache()
 
     int i = newestRequestIndex(false);
 
-    if (i != -1) {
-        if (!m_pendingRequests[i].url.isEmpty() && m_pendingRequests[i].url.isValid()) {
-            if (loadImageFromCache(m_pendingRequests[i].url)) {
+    if (i != NOT_FOUND) {
+        QUrl url = m_pendingRequests[i].url;
+        if (!url.isEmpty() && url.isValid()) {
+            if (loadImageFromCache(url)) {
                 // was found, remove from the list
                 m_pendingRequests.removeAt(i);
             }
@@ -78,7 +98,7 @@ void MapFetcher::checkNextRequestFromCache()
     }
 
     // schedule checking of the next request if the list is not empty
-    if (newestRequestIndex(false) != -1)
+    if (newestRequestIndex(false) != NOT_FOUND)
         QTimer::singleShot(0, this, SLOT(checkNextRequestFromCache()));
     else
         m_fetchMapImagesTimerRunning = false;
@@ -98,7 +118,7 @@ void MapFetcher::downloadFinished(QNetworkReply *reply)
         int zoomLevel;
         int x;
         int y;
-        parseURL(url, zoomLevel, x, y);
+        parseURL(url, &zoomLevel, &x, &y);
 
         emit mapImageReceived(zoomLevel, x, y, QPixmap::fromImage(image));
     }
@@ -123,16 +143,12 @@ void MapFetcher::enqueueFetchMapImage(int zoomLevel, int x, int y)
         if (m_pendingRequests[i].url == url) {
             m_pendingRequests.move(i, 0);
             found = true;
-            qDebug() << __PRETTY_FUNCTION__ << "URL was already found, moved to begin";
             break;
         }
     }
     // ...or add new request to the begining of the list
     if (!found) {
-        qDebug() << __PRETTY_FUNCTION__ << "URL was added";
-        Request request;
-        request.cacheChecked = false;
-        request.url = url;
+        MapTileRequest request(url);
         m_pendingRequests.prepend(request);
     }
 
@@ -166,19 +182,17 @@ bool MapFetcher::loadImageFromCache(const QUrl &url)
         int zoomLevel;
         int x;
         int y;
-        parseURL(url, zoomLevel, x, y);
+        parseURL(url, &zoomLevel, &x, &y);
         int originalZoomLevel = zoomLevel;
 
         // try to fetch requested and upper level images until found or all levels tried
         do {
             QIODevice *cacheImage = cache->data(buildURL(zoomLevel, QPoint(x, y)));
             if (cacheImage) {
-                QImage image;
-
-                if (image.load(cacheImage, 0)) {
+                QPixmap pixmap;
+                if (pixmap.loadFromData(cacheImage->readAll())) {
                     imageFound = true;
-
-                    emit mapImageReceived(zoomLevel, x, y, QPixmap::fromImage(image));
+                    emit mapImageReceived(zoomLevel, x, y, pixmap);
                 }
 
                 delete cacheImage;
@@ -208,6 +222,8 @@ bool MapFetcher::loadImageFromCache(const QUrl &url)
 
 bool MapFetcher::translateIndexesToUpperLevel(int &zoomLevel, int &x, int &y)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     if (zoomLevel > MIN_MAP_ZOOM_LEVEL) {
         zoomLevel--;
         x /= 2;
@@ -223,30 +239,37 @@ int MapFetcher::newestRequestIndex(bool cacheChecked)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    if (!m_pendingRequests.isEmpty()) {
-        for (int i = 0; i < m_pendingRequests.size(); i++) {
-            if (m_pendingRequests[i].cacheChecked == cacheChecked) {
-                return i;
-            }
+    for (int i = 0; i < m_pendingRequests.size(); i++) {
+        if (m_pendingRequests[i].cacheChecked == cacheChecked) {
+            return i;
         }
     }
 
-    return -1;
+    return NOT_FOUND;
 }
 
-void MapFetcher::parseURL(const QUrl &url, int &zoom, int &x, int &y)
+void MapFetcher::parseURL(const QUrl &url, int *zoom, int *x, int *y)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     QString path = url.path();
     QStringList pathParts = path.split("/", QString::SkipEmptyParts);
 
     int size = pathParts.size();
 
-    if (size >= 3) {
-        zoom = (pathParts.at(size-3)).toInt();
-        x = (pathParts.at(size-2)).toInt();
-        QString yString = pathParts.at(size-1);
-        yString.chop(4);
-        y = yString.toInt();
+    // Example URL: "http://tile.openstreetmap.org/mapnik/14/9354/4263.png"
+    const int MIN_PATH_SPLITTED_PARTS = 4;
+    const int ZOOM_INDEX = size - 3;
+    const int X_INDEX = size - 2;
+    const int Y_INDEX = size - 1;
+    const int FILE_EXTENSION_LENGTH = 4;
+
+    if (size >= MIN_PATH_SPLITTED_PARTS) {
+        *zoom = (pathParts.at(ZOOM_INDEX)).toInt();
+        *x = (pathParts.at(X_INDEX)).toInt();
+        QString yString = pathParts.at(Y_INDEX);
+        yString.chop(FILE_EXTENSION_LENGTH);
+        *y = yString.toInt();
     }
 }
 
@@ -264,7 +287,7 @@ void MapFetcher::startNextDownload()
 
     int i = newestRequestIndex(true);
 
-    if (i != -1) {
+    if (i != NOT_FOUND) {
         QUrl url = m_pendingRequests.takeAt(i).url;
 
         QNetworkRequest request(url);
index 00eb5d7..9edbfb5 100644 (file)
@@ -26,6 +26,8 @@
 #include <QtCore>
 #include <QNetworkAccessManager>
 
+#include "maptilerequest.h"
+
 class QNetworkReply;
 class QUrl;
 
@@ -39,21 +41,6 @@ class MapFetcher : public QObject
 {
     Q_OBJECT
 
-    /**
-    * @brief Type for download requests
-    *
-    * @typedef Request
-    */    
-    /**
-    * @brief Struct for download requests
-    *
-    * @struct _Request
-    */
-    typedef struct _Request {
-        bool cacheChecked; ///< Is this request already checked from the cache
-        QUrl url; ///< URL
-    } Request;
-
 public:
     /**
     * @brief Constructor for MapFetcher.
@@ -136,7 +123,7 @@ private:
     * @param [out] x x variable
     * @param [out] y y variable
     */
-    void parseURL(const QUrl &url, int &zoom, int &x, int &y);
+    void parseURL(const QUrl &url, int *zoom, int *x, int *y);
 
     /**
     * @brief Translate indexes to matching upper level map tile indexes
@@ -201,13 +188,11 @@ signals:
  * DATA MEMBERS
  ******************************************************************************/
 private:
-    static const int MAX_PARALLEL_DOWNLOADS = 2; ///< Max simultaneous parallel downloads
-
     QList<QNetworkReply*> m_currentDownloads; ///< List of current downloads
     int m_pendingRequestsSize; ///< Max number of pending requests
     bool m_fetchMapImagesTimerRunning; ///< is the singleshot timer already running
     QNetworkAccessManager *m_manager; ///< Network access manager
-    QList<Request> m_pendingRequests; ///< List of map image fetching requests
+    QList<MapTileRequest> m_pendingRequests; ///< List of map image fetching requests
 };
 
 #endif
index a6597bb..3a5694c 100644 (file)
@@ -29,6 +29,8 @@ MapScene::MapScene(QObject *parent)
     , m_isRemoveStackedTilesRunning(false)
     , m_viewRect(QRect(0, 0, 0, 0))
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     const int maxTilesPerSide = (1 << MAX_MAP_ZOOM_LEVEL);
     const int maxPixelsX = maxTilesPerSide * TILE_SIZE_X;
     const int maxPixelsY = maxTilesPerSide * TILE_SIZE_Y;
@@ -37,6 +39,8 @@ MapScene::MapScene(QObject *parent)
 
 void MapScene::addTile(MapTile *mapTile, QString hashKey)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     m_mapTilesInScene.insert(hashKey, mapTile);
     addItem(mapTile);
 }
@@ -54,6 +58,8 @@ void MapScene::enqueueRemoveStackedTiles(MapTile *newTile)
 
 bool MapScene::isTileInScene(QString hashKey)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     return m_mapTilesInScene.contains(hashKey);
 }
 
@@ -153,5 +159,7 @@ void MapScene::setTilesDrawingLevels(int zoomLevel)
 
 void MapScene::viewRectUpdated(QRect viewRect)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     m_viewRect = viewRect;
 }
index 5d3128b..5697cee 100644 (file)
 MapTile::MapTile()
     : m_tileNumber(QPoint(UNDEFINED, UNDEFINED))
     , m_zoomLevel(UNDEFINED)
-{    
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
     setPos(UNDEFINED, UNDEFINED);
     setShapeMode(QGraphicsPixmapItem::BoundingRectShape);
 }
 
 int MapTile::zoomLevel()
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     return m_zoomLevel;
 }
 
 void MapTile::setZoomLevel(int tileZoomLevel, int currentViewZoomLevel)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     m_zoomLevel = tileZoomLevel;
     setPosition();
 
@@ -52,6 +58,8 @@ void MapTile::setZoomLevel(int tileZoomLevel, int currentViewZoomLevel)
 
 void MapTile::setSceneLevel(int currentZoomLevel)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     if (currentZoomLevel < m_zoomLevel) {
         qreal z = static_cast<qreal>(MIN_MAP_SCENE_NORMAL_LEVEL + currentZoomLevel
                                      - (m_zoomLevel - currentZoomLevel)) + 0.5;
@@ -59,25 +67,27 @@ void MapTile::setSceneLevel(int currentZoomLevel)
     }
     else
         setZValue(static_cast<qreal>(MIN_MAP_SCENE_NORMAL_LEVEL + m_zoomLevel));
-
-    qDebug() << __PRETTY_FUNCTION__ << "Tile:" << m_tileNumber
-                                    << "m_zoomLevel" << m_zoomLevel
-                                    << "zValue:" << zValue();
 }
 
 QPoint MapTile::tileNumber()
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     return m_tileNumber;
 }
 
 void MapTile::setTileNumber(QPoint tileNumber)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     m_tileNumber = tileNumber;
     setPosition();
 }
 
 void MapTile::setPosition()
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     const int maxTileNumber = (1 << m_zoomLevel) - 1;
 
     if ((m_zoomLevel >= MIN_MAP_ZOOM_LEVEL) && (m_zoomLevel <= MAX_MAP_ZOOM_LEVEL) &&
index 47770c1..4cee084 100644 (file)
@@ -30,6 +30,8 @@
 MapView::MapView(QWidget *parent)
     : QGraphicsView(parent)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
     setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
 
@@ -39,6 +41,8 @@ MapView::MapView(QWidget *parent)
 
 void MapView::setZoomLevel(int zoomLevel)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     m_zoomAnimation->stop();
     m_zoomAnimation->setDuration(ZOOM_TIME);
     m_zoomAnimation->setStartValue(viewScale());
@@ -49,18 +53,24 @@ void MapView::setZoomLevel(int zoomLevel)
 
 qreal MapView::currentScale()
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     QTransform currentTransform = transform();
     return currentTransform.m11();
 }
 
 qreal MapView::viewScale()
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     QTransform currentTransform = transform();
     return currentTransform.m11();
 }
 
 void MapView::setViewScale(qreal viewScale)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     QTransform transform;
     transform.scale(viewScale, viewScale);
     setTransform(transform);
@@ -71,15 +81,18 @@ void MapView::mouseMoveEvent(QMouseEvent *event)
 {
     m_scenePosition += m_mousePosition - mapToScene(event->pos()).toPoint();
 
-    emit viewScrolled(m_scenePosition);
     qDebug() << __PRETTY_FUNCTION__ << "m_scenePosition:" << m_scenePosition;
 
+    emit viewScrolled(m_scenePosition);
+
     m_mousePosition = mapToScene(event->pos()).toPoint();
     emit viewContentChanged(mapToScene(viewport()->x(), viewport()->y()).toPoint());
 }
 
 void MapView::mousePressEvent(QMouseEvent *event)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     QGraphicsView::mousePressEvent(event);
 
     m_mousePosition = mapToScene(event->pos()).toPoint();
index f988330..74d37cd 100644 (file)
@@ -31,7 +31,8 @@ SOURCES += main.cpp \
     ui/buttonitem.cpp \
     ui/situareuser.cpp \
     engine/engine.cpp \
-    ui/settingsdialog.cpp
+    ui/settingsdialog.cpp \
+    map/maptilerequest.cpp
 HEADERS += ui/mainwindow.h \
     ui/mapviewscreen.h \
     ui/listviewscreen.h \
@@ -59,18 +60,16 @@ HEADERS += ui/mainwindow.h \
     ui/situareuser.h \
     engine/engine.h \
     user/user.h \
-    ui/settingsdialog.h
+    ui/settingsdialog.h \
+    map/maptilerequest.h
 QT += network \
     webkit
-
 DEFINES += QT_NO_DEBUG_OUTPUT
-
 !maemo5 { 
     message(QJson built in)
     message(Make sure you have QJson development headers installed)
     message(install headers with: sudo apt-get install libqjson-dev)
 }
-
 maemo5 { 
     message(QJson built in)
     message(Make sure you have QJson development headers installed)