: QObject(parent)
, m_centerTile(QPoint(UNDEFINED, UNDEFINED))
, m_viewSize(QSize(DEFAULT_SCREEN_WIDTH, DEFAULT_SCREEN_HEIGHT))
+ , m_zoomedIn(false)
, m_zoomLevel(DEFAULT_ZOOM_LEVEL)
{
m_mapScene = new MapScene(this);
m_mapFetcher = new MapFetcher(new QNetworkAccessManager(this), this);
- connect(this, SIGNAL(fetchImage(QUrl)), m_mapFetcher, SLOT(fetchMapImage(QUrl)));
- connect(m_mapFetcher, SIGNAL(mapImageReceived(QUrl,QPixmap)), this,
- SLOT(mapImageReceived(QUrl, 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);
setLocation(convertLatLonToSceneCoordinate(latLonCoordinate));
}
-QUrl MapEngine::buildURL(int zoomLevel, QPoint tileNumbers)
+void MapEngine::mapImageReceived(int zoomLevel, int x, int y, const QPixmap &image)
{
- QString url = QString("http://tile.openstreetmap.org/mapnik/%1/%2/%3.png")
- .arg(zoomLevel).arg(tileNumbers.x()).arg(tileNumbers.y());
-
- return QUrl(url);
-}
-
-void MapEngine::parseURL(const QUrl &url, int &zoom, int &x, int &y)
-{
- 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();
- }
-}
-
-void MapEngine::mapImageReceived(const QUrl &url, const QPixmap &pixmap)
-{
- //qDebug() << __PRETTY_FUNCTION__;
-
- int zoom = UNDEFINED;
- int x = UNDEFINED;
- int y = UNDEFINED;
+ qDebug() << __PRETTY_FUNCTION__;
- parseURL(url, zoom, x, y);
- QString hashKey = tilePath(zoom, x, y);
+ QString hashKey = tilePath(zoomLevel, x, y);
if (!m_mapScene->isTileInScene(hashKey)) {
MapTile *mapTile = new MapTile();
- mapTile->setZoomLevel(zoom);
+ mapTile->setZoomLevel(zoomLevel, m_zoomLevel);
mapTile->setTileNumber(QPoint(x, y));
- mapTile->setPixmap(pixmap);
+ mapTile->setPixmap(image);
m_mapScene->addTile(mapTile, hashKey);
- m_mapScene->removeStackedTiles(mapTile, viewRect());
+ m_mapScene->enqueueRemoveStackedTiles(mapTile);
}
}
int topLeftX = tileCoordinate.x() - (gridWidth/2);
int topLeftY = tileCoordinate.y() - (gridHeight/2);
+ m_mapFetcher->setDownloadQueueSize(gridWidth * gridHeight);
+
return QRect(topLeftX, topLeftY, gridWidth, gridHeight);
}
{
m_mapZoomPanel->setPos(viewTopLeft);
-// qDebug() << __PRETTY_FUNCTION__ << "viewTopLeft:" << viewTopLeft;
+ qDebug() << __PRETTY_FUNCTION__ << "viewTopLeft:" << viewTopLeft;
}
void MapEngine::setLocation(QPoint sceneCoordinate)
{
-// qDebug() << __PRETTY_FUNCTION__;
+ qDebug() << __PRETTY_FUNCTION__;
m_sceneCoordinate = sceneCoordinate;
emit locationChanged(m_sceneCoordinate);
if (isCenterTileChanged(sceneCoordinate)) {
getTiles(sceneCoordinate);
- m_mapScene->removeOutOfViewTiles(viewRect());
+ m_mapScene->removeOutOfViewTiles();
}
}
void MapEngine::getTiles(QPoint sceneCoordinate)
{
-// qDebug() << __PRETTY_FUNCTION__;
+ qDebug() << __PRETTY_FUNCTION__;
- m_viewGrid = calculateTileGrid(sceneCoordinate);
+ m_viewTilesGrid = calculateTileGrid(sceneCoordinate);
+ updateViewTilesSceneRect();
- int topLeftX = m_viewGrid.topLeft().x();
- int topLeftY = m_viewGrid.topLeft().y();
- int bottomRightX = m_viewGrid.bottomRight().x();
- int bottomRightY = m_viewGrid.bottomRight().y();
+ int topLeftX = m_viewTilesGrid.topLeft().x();
+ int topLeftY = m_viewTilesGrid.topLeft().y();
+ int bottomRightX = m_viewTilesGrid.bottomRight().x();
+ int bottomRightY = m_viewTilesGrid.bottomRight().y();
int tileMaxVal = tileMaxValue(m_zoomLevel);
else if (tileY > tileMaxVal)
tileY -= tileMaxVal;
- QUrl url = buildURL(m_zoomLevel, QPoint(tileX, tileY));
-
if (!m_mapScene->isTileInScene(tilePath(m_zoomLevel, tileX, tileY)))
- emit fetchImage(url);
+ emit fetchImage(m_zoomLevel, tileX, tileY);
}
}
}
-QRect MapEngine::viewRect()
+void MapEngine::updateViewTilesSceneRect()
{
- QPoint topLeft = convertTileNumberToSceneCoordinate(m_zoomLevel, m_viewGrid.topLeft());
- QPoint bottomRight = convertTileNumberToSceneCoordinate(m_zoomLevel, m_viewGrid.bottomRight()
- + QPoint(1, 1));
- return QRect(topLeft, bottomRight);
+ QPoint topLeft = convertTileNumberToSceneCoordinate(m_zoomLevel, m_viewTilesGrid.topLeft());
+ QPoint bottomRight = convertTileNumberToSceneCoordinate(m_zoomLevel,
+ m_viewTilesGrid.bottomRight()
+ + QPoint(1, 1)) - QPoint(1, 1);
+
+ m_mapScene->viewRectUpdated(QRect(topLeft, bottomRight));
}
void MapEngine::viewResized(const QSize &size)
{
m_viewSize = size;
getTiles(m_sceneCoordinate);
- m_mapScene->removeOutOfViewTiles(viewRect());
+ m_mapScene->removeOutOfViewTiles();
}
-void MapEngine::viewZoomInFinished()
+void MapEngine::viewZoomFinished()
{
qDebug() << __PRETTY_FUNCTION__;
- m_mapScene->removeOutOfViewTiles(viewRect());
+
+ if (m_zoomedIn) {
+ m_zoomedIn = false;
+ m_mapScene->removeOutOfViewTiles();
+ }
}
void MapEngine::zoomIn()
{
-// qDebug() << __PRETTY_FUNCTION__;
+ qDebug() << __PRETTY_FUNCTION__;
if (m_zoomLevel < MAX_MAP_ZOOM_LEVEL) {
m_zoomLevel++;
+ m_zoomedIn = true;
emit zoomLevelChanged(m_zoomLevel);
m_mapScene->setTilesDrawingLevels(m_zoomLevel);
void MapEngine::zoomOut()
{
-// qDebug() << __PRETTY_FUNCTION__;
+ qDebug() << __PRETTY_FUNCTION__;
- if (m_zoomLevel > MIN_MAP_ZOOM_LEVEL) {
+ if (m_zoomLevel > MIN_VIEW_ZOOM_LEVEL) {
m_zoomLevel--;
emit zoomLevelChanged(m_zoomLevel);
QPoint MapEngine::convertLatLonToSceneCoordinate(QPointF latLonCoordinate)
{
-// qDebug() << __PRETTY_FUNCTION__;
+ qDebug() << __PRETTY_FUNCTION__;
qreal longitude = latLonCoordinate.x();
qreal latitude = latLonCoordinate.y();