Sami Rämö - sami.ramo@ixonos.com
Jussi Laitinen - jussi.laitinen@ixonos.com
+ Pekka Nissinen - pekka.nissinen@ixonos.com
Situare is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
: 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(this, SIGNAL(fetchImage(QUrl)), m_mapFetcher, SLOT(enqueueFetchMapImage(QUrl)));
connect(m_mapFetcher, SIGNAL(mapImageReceived(QUrl,QPixmap)), this,
SLOT(mapImageReceived(QUrl, QPixmap)));
+
+ m_mapZoomPanel = new MapZoomPanel(NULL, MAP_ZOOM_PANEL_POSITION_X, MAP_ZOOM_PANEL_POSITION_Y);
+ m_mapScene->addItem(m_mapZoomPanel);
+ connect(m_mapZoomPanel, SIGNAL(zoomInPressed()), this, SLOT(zoomIn()));
+ connect(m_mapZoomPanel, SIGNAL(zoomOutPressed()), this, SLOT(zoomOut()));
+
+ m_ownLocation = new OwnLocationItem();
+ m_mapScene->addItem(m_ownLocation);
}
void MapEngine::init()
void MapEngine::mapImageReceived(const QUrl &url, const QPixmap &pixmap)
{
- //qDebug() << __PRETTY_FUNCTION__;
+ qDebug() << __PRETTY_FUNCTION__;
int zoom = UNDEFINED;
int x = UNDEFINED;
parseURL(url, zoom, x, y);
QString hashKey = tilePath(zoom, x, y);
- if (!m_mapTilesInScene.contains(hashKey)) {
+ if (!m_mapScene->isTileInScene(hashKey)) {
MapTile *mapTile = new MapTile();
- mapTile->setZoomLevel(zoom);
+ mapTile->setZoomLevel(zoom, m_zoomLevel);
mapTile->setTileNumber(QPoint(x, y));
mapTile->setPixmap(pixmap);
- m_mapTilesInScene.insert(hashKey, mapTile);
- m_mapScene->addMapTile(mapTile);
+ m_mapScene->addTile(mapTile, hashKey);
+
+ m_mapScene->debugItemsCount();
- removeStackedTiles(mapTile);
+ 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);
}
+void MapEngine::alignImmovableItems(QPoint viewTopLeft)
+{
+ m_mapZoomPanel->setPos(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);
- removeTilesOutOfView();
+ 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);
QUrl url = buildURL(m_zoomLevel, QPoint(tileX, tileY));
- if (!m_mapTilesInScene.contains(tilePath(m_zoomLevel, tileX, tileY)))
+ if (!m_mapScene->isTileInScene(tilePath(m_zoomLevel, tileX, tileY)))
emit fetchImage(url);
}
}
}
-void MapEngine::removeTile(MapTile *tile)
+void MapEngine::updateViewTilesSceneRect()
{
- //qDebug() << __PRETTY_FUNCTION__;
+ QPoint topLeft = convertTileNumberToSceneCoordinate(m_zoomLevel, m_viewTilesGrid.topLeft());
+ QPoint bottomRight = convertTileNumberToSceneCoordinate(m_zoomLevel,
+ m_viewTilesGrid.bottomRight()
+ + QPoint(1, 1)) - QPoint(1, 1);
- if (tile) {
- m_mapTilesInScene.remove(tilePath(tile->zoomLevel(), tile->tileNumber().x(),
- tile->tileNumber().y()));
- m_mapScene->removeItem(tile);
- delete tile;
- }
+ m_mapScene->viewRectUpdated(QRect(topLeft, bottomRight));
}
-void MapEngine::removeTilesOutOfView()
+void MapEngine::viewResized(const QSize &size)
{
- //qDebug() << __PRETTY_FUNCTION__;
-
- /// @todo Jussi: convertTi.... returns QPoint
- QPointF topLeft = convertTileNumberToSceneCoordinate(m_zoomLevel, m_viewGrid.topLeft());
- QPointF bottomRight = convertTileNumberToSceneCoordinate(m_zoomLevel, m_viewGrid.bottomRight()
- + QPoint(1, 1));
- qreal width = bottomRight.x() - topLeft.x();
- qreal height = bottomRight.y() - topLeft.y();
-
- /// @todo Jussi: insert comments
- QList<QGraphicsItem *> viewTiles = m_mapScene->items(topLeft.x(), topLeft.y(), width, height,
- Qt::ContainsItemBoundingRect);
- QList<QGraphicsItem *> allTiles = m_mapScene->items();
-
- foreach (QGraphicsItem *tile, viewTiles)
- allTiles.removeOne(tile);
-
- QHashIterator<QString, MapTile *> i(m_mapTilesInScene);
-
- /// @todo Jussi: loop through allTiles and remove from hash also
- while (i.hasNext()) {
- i.next();
- if (allTiles.contains(i.value())) {
- MapTile *tile = i.value();
- removeTile(tile);
- }
- }
+ m_viewSize = size;
+ getTiles(m_sceneCoordinate);
+ m_mapScene->removeOutOfViewTiles();
}
-void MapEngine::removeStackedTiles(MapTile *newTile)
+void MapEngine::viewZoomFinished()
{
- //qDebug() << __PRETTY_FUNCTION__;
-
- /// @todo Jussi: use sceneBoundingRect DONE
-// QRectF newTileSceneRect = newTile->mapRectToScene(newTile->boundingRect());
- QRectF newTileSceneRect = newTile->sceneBoundingRect();
- QList<QGraphicsItem *> collidingTiles = newTile->collidingItems(Qt::IntersectsItemBoundingRect);
-
- //Loop all items under new tile
- foreach (QGraphicsItem *collidingTile, collidingTiles) {
-
- QRectF collidingTileSceneRect = collidingTile->sceneBoundingRect();
-
- //If new tile covers the tile under, remove the tile
- if (newTileSceneRect.contains(collidingTileSceneRect)) {
- MapTile *tile = dynamic_cast<MapTile *>(collidingTile);
- removeTile(tile);
- }
-
- else {
- //Get tiles below removal candidate
- QList<QGraphicsItem *> stackedTiles = m_mapScene->items(collidingTileSceneRect,
- Qt::ContainsItemBoundingRect);
- QRectF combined = combineTiles(collidingTile, stackedTiles);
-
- //If combined tiles below removal candidate covers removal candidate, remove it
- if (combined.contains(collidingTileSceneRect)) {
- MapTile *tile = dynamic_cast<MapTile *>(collidingTile);
- removeTile(tile);
- }
- }
- }
-}
+ qDebug() << __PRETTY_FUNCTION__;
-QRectF MapEngine::combineTiles(QGraphicsItem *parentTile,
- const QList<QGraphicsItem*> &stackedTiles)
-{
- QRectF combined;
- int count = 0;
-
- foreach (QGraphicsItem *stackedTile, stackedTiles) {
- if (stackedTile != parentTile) {
- count++;
- QRectF stackedTileSceneRect = stackedTile->sceneBoundingRect();
- combined = combined.united(stackedTileSceneRect);
- }
+ if (m_zoomedIn) {
+ m_zoomedIn = false;
+ m_mapScene->removeOutOfViewTiles();
}
-
- if (count < 4)
- combined = QRectF();
-
- return combined;
-}
-
-void MapEngine::viewResized(const QSize &size)
-{
- m_viewSize = size;
- getTiles(m_sceneCoordinate);
- removeTilesOutOfView();
}
void MapEngine::zoomIn()
if (m_zoomLevel < MAX_MAP_ZOOM_LEVEL) {
m_zoomLevel++;
+ m_zoomedIn = true;
emit zoomLevelChanged(m_zoomLevel);
- setTilesDrawingLevels();
+ m_mapScene->setTilesDrawingLevels(m_zoomLevel);
getTiles(m_sceneCoordinate);
-
- // remove unused tiles after zooming is done
- QTimer::singleShot(ZOOM_TIME, this, SLOT(removeTilesOutOfView()));
}
- /// @todo DONE: Sami: return only to end
}
void MapEngine::zoomOut()
{
qDebug() << __PRETTY_FUNCTION__;
- if (m_zoomLevel > MIN_MAP_ZOOM_LEVEL) {
+ if (m_zoomLevel > MIN_VIEW_ZOOM_LEVEL) {
m_zoomLevel--;
emit zoomLevelChanged(m_zoomLevel);
- setTilesDrawingLevels();
+ m_mapScene->setTilesDrawingLevels(m_zoomLevel);
getTiles(m_sceneCoordinate);
}
- /// @todo DONE: Sami: return
-}
-
-void MapEngine::setTilesDrawingLevels()
-{
- //qDebug() << __PRETTY_FUNCTION__ << "m_zoomLevel:" << m_zoomLevel;
-
- QList<QGraphicsItem *> items = m_mapScene->items();
-
- for (int i = 0; i < items.size(); ++i) {
- MapTile *item = dynamic_cast<MapTile *>(items.at(i));
- if (item)
- item->setSceneLevel(m_zoomLevel);
- }
-
}
QString MapEngine::tilePath(int zoomLevel, int x, int y)
return tilePathString;
}
-void MapEngine::scalingFactorChanged(qreal scaleFactor)
-{
- qDebug() << __PRETTY_FUNCTION__;
-}
-
QPoint MapEngine::convertSceneCoordinateToTileNumber(int zoomLevel, QPoint sceneCoordinate)
{
int pow = 1 << (MAX_MAP_ZOOM_LEVEL - zoomLevel);
QPoint MapEngine::convertLatLonToSceneCoordinate(QPointF latLonCoordinate)
{
-// qDebug() << __PRETTY_FUNCTION__;
+ qDebug() << __PRETTY_FUNCTION__;
qreal longitude = latLonCoordinate.x();
qreal latitude = latLonCoordinate.y();