summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@theqtcompany.com>2015-05-18 11:12:16 +0200
committerMichal Klocek <michal.klocek@theqtcompany.com>2015-06-04 14:50:51 +0000
commit374077292b4be4a03eb8ca9a6eaae41e4de6f942 (patch)
tree2f56803b02c81337660743720745abe65e923114
parent2d10f0a06c4aa99257cafb6729034f9f843fb31c (diff)
downloadqtlocation-374077292b4be4a03eb8ca9a6eaae41e4de6f942.tar.gz
Fix tile version handling
Here maps plugin checks server for tile version. When tile version is updated, update not only the current camera tiles, but also scene tiles. Task-number: QTBUG-44809 Change-Id: Iedb3add5308a2e61cc18e169e33ea4510e1a4fee Reviewed-by: Alex Blasche <alexander.blasche@theqtcompany.com>
-rw-r--r--src/location/maps/qgeocameratiles.cpp2
-rw-r--r--src/location/maps/qgeomap.cpp14
-rw-r--r--src/location/maps/qgeomap_p.h2
-rw-r--r--src/location/maps/qgeomap_p_p.h1
-rw-r--r--src/location/maps/qgeomapscene.cpp14
-rw-r--r--src/location/maps/qgeomapscene_p.h1
-rw-r--r--src/location/maps/qgeotiledmap.cpp58
-rw-r--r--src/location/maps/qgeotiledmap_p.h7
-rw-r--r--src/location/maps/qgeotiledmap_p_p.h6
-rw-r--r--src/location/maps/qgeotiledmappingmanagerengine.cpp21
-rw-r--r--src/location/maps/qgeotiledmappingmanagerengine_p.h4
-rw-r--r--src/location/maps/qgeotiledmappingmanagerengine_p_p.h1
-rw-r--r--src/plugins/geoservices/nokia/qgeotiledmap_nokia.cpp9
-rw-r--r--src/plugins/geoservices/nokia/qgeotiledmap_nokia.h1
-rw-r--r--src/plugins/geoservices/nokia/qgeotiledmappingmanagerengine_nokia.cpp4
15 files changed, 72 insertions, 73 deletions
diff --git a/src/location/maps/qgeocameratiles.cpp b/src/location/maps/qgeocameratiles.cpp
index 4a97220d..58aa1f30 100644
--- a/src/location/maps/qgeocameratiles.cpp
+++ b/src/location/maps/qgeocameratiles.cpp
@@ -216,7 +216,7 @@ void QGeoCameraTiles::setMapType(const QGeoMapType &mapType)
d_ptr->m_mapType = mapType;
}
-void QGeoCameraTiles::setMapVersion(const int mapVersion)
+void QGeoCameraTiles::setMapVersion(int mapVersion)
{
if (d_ptr->m_mapVersion == mapVersion)
return;
diff --git a/src/location/maps/qgeomap.cpp b/src/location/maps/qgeomap.cpp
index f6f8d5e2..edc64839 100644
--- a/src/location/maps/qgeomap.cpp
+++ b/src/location/maps/qgeomap.cpp
@@ -118,12 +118,6 @@ const QGeoMapType QGeoMap::activeMapType() const
return d->m_activeMapType;
}
-QString QGeoMap::pluginString()
-{
- Q_D(const QGeoMap);
- return d->m_pluginString;
-}
-
QGeoCameraCapabilities QGeoMap::cameraCapabilities()
{
Q_D(const QGeoMap);
@@ -133,11 +127,6 @@ QGeoCameraCapabilities QGeoMap::cameraCapabilities()
return QGeoCameraCapabilities();
}
-int QGeoMap::mapVersion()
-{
- return -1;
-}
-
void QGeoMap::prefetchData()
{
@@ -152,9 +141,6 @@ QGeoMapPrivate::QGeoMapPrivate(QGeoMappingManagerEngine *engine)
m_controller(0),
m_activeMapType(QGeoMapType())
{
- if (!m_engine.isNull()) {
- m_pluginString = m_engine->managerName() + QLatin1Char('_') + QString::number(m_engine->managerVersion());
- }
}
QGeoMapPrivate::~QGeoMapPrivate()
diff --git a/src/location/maps/qgeomap_p.h b/src/location/maps/qgeomap_p.h
index 9e4d5a0d..58a020dc 100644
--- a/src/location/maps/qgeomap_p.h
+++ b/src/location/maps/qgeomap_p.h
@@ -83,10 +83,8 @@ public:
virtual QGeoCoordinate itemPositionToCoordinate(const QDoubleVector2D &pos, bool clipToViewport = true) const = 0;
virtual QDoubleVector2D coordinateToItemPosition(const QGeoCoordinate &coordinate, bool clipToViewport = true) const = 0;
- virtual int mapVersion();
virtual void prefetchData();
- QString pluginString();
QGeoCameraCapabilities cameraCapabilities();
protected:
diff --git a/src/location/maps/qgeomap_p_p.h b/src/location/maps/qgeomap_p_p.h
index e7a23060..3b996ecc 100644
--- a/src/location/maps/qgeomap_p_p.h
+++ b/src/location/maps/qgeomap_p_p.h
@@ -78,7 +78,6 @@ protected:
int m_height;
double m_aspectRatio;
QPointer<QGeoMappingManagerEngine> m_engine;
- QString m_pluginString;
QGeoMapController *m_controller;
QGeoCameraData m_cameraData;
QGeoMapType m_activeMapType;
diff --git a/src/location/maps/qgeomapscene.cpp b/src/location/maps/qgeomapscene.cpp
index a448937b..4e6bb4a6 100644
--- a/src/location/maps/qgeomapscene.cpp
+++ b/src/location/maps/qgeomapscene.cpp
@@ -156,6 +156,12 @@ void QGeoMapScene::setVisibleTiles(const QSet<QGeoTileSpec> &tiles)
d->setVisibleTiles(tiles);
}
+const QSet<QGeoTileSpec> &QGeoMapScene::visibleTiles() const
+{
+ Q_D(const QGeoMapScene);
+ return d->m_visibleTiles;
+}
+
void QGeoMapScene::addTile(const QGeoTileSpec &spec, QSharedPointer<QGeoTileTexture> texture)
{
Q_D(QGeoMapScene);
@@ -325,14 +331,8 @@ void QGeoMapScenePrivate::addTile(const QGeoTileSpec &spec, QSharedPointer<QGeoT
m_textures.insert(spec, texture);
}
-// return true if new tiles introduced in [tiles]
void QGeoMapScenePrivate::setVisibleTiles(const QSet<QGeoTileSpec> &tiles)
{
- Q_Q(QGeoMapScene);
-
- // detect if new tiles introduced
- bool newTilesIntroduced = !m_visibleTiles.contains(tiles);
-
// work out the tile bounds for the new scene
setTileBounds(tiles);
@@ -344,8 +344,6 @@ void QGeoMapScenePrivate::setVisibleTiles(const QSet<QGeoTileSpec> &tiles)
removeTiles(toRemove);
m_visibleTiles = tiles;
- if (newTilesIntroduced)
- emit q->newTilesVisible(m_visibleTiles);
}
void QGeoMapScenePrivate::removeTiles(const QSet<QGeoTileSpec> &oldTiles)
diff --git a/src/location/maps/qgeomapscene_p.h b/src/location/maps/qgeomapscene_p.h
index a4a9e4e4..34d4a11f 100644
--- a/src/location/maps/qgeomapscene_p.h
+++ b/src/location/maps/qgeomapscene_p.h
@@ -73,6 +73,7 @@ public:
void setCameraData(const QGeoCameraData &cameraData);
void setVisibleTiles(const QSet<QGeoTileSpec> &tiles);
+ const QSet<QGeoTileSpec> &visibleTiles() const;
void setUseVerticalLock(bool lock);
diff --git a/src/location/maps/qgeotiledmap.cpp b/src/location/maps/qgeotiledmap.cpp
index 07d117cf..06f5a5e8 100644
--- a/src/location/maps/qgeotiledmap.cpp
+++ b/src/location/maps/qgeotiledmap.cpp
@@ -56,15 +56,8 @@ QGeoTiledMap::QGeoTiledMap(QGeoTiledMappingManagerEngine *engine, QObject *paren
d->m_tileRequests = new QGeoTileRequestManager(this, engine);
- QObject::connect(d->m_mapScene,
- SIGNAL(newTilesVisible(QSet<QGeoTileSpec>)),
- this,
- SLOT(evaluateCopyrights(QSet<QGeoTileSpec>)));
- QObject::connect(engine,
- SIGNAL(mapVersionChanged()),
- this,
- SLOT(updateMapVersion()));
- QMetaObject::invokeMethod(this, "updateMapVersion", Qt::QueuedConnection);
+ QObject::connect(engine,&QGeoTiledMappingManagerEngine::tileVersionChanged,
+ this,&QGeoTiledMap::handleTileVersionChanged);
}
QGeoTiledMap::~QGeoTiledMap()
@@ -110,10 +103,14 @@ void QGeoTiledMap::prefetchData()
d->prefetchTiles();
}
-void QGeoTiledMap::updateMapVersion()
+void QGeoTiledMap::handleTileVersionChanged()
{
Q_D(QGeoTiledMap);
- d->changeMapVersion(mapVersion());
+ if (!d->m_engine.isNull()) {
+ QGeoTiledMappingManagerEngine* engine = qobject_cast<QGeoTiledMappingManagerEngine*>(d->m_engine);
+ Q_ASSERT(engine);
+ d->changeTileVersion(engine->tileVersion());
+ }
}
void QGeoTiledMap::evaluateCopyrights(const QSet<QGeoTileSpec> &visibleTiles)
@@ -160,8 +157,7 @@ QGeoTiledMapPrivate::QGeoTiledMapPrivate(QGeoTiledMappingManagerEngine *engine)
{
m_cameraTiles->setMaximumZoomLevel(static_cast<int>(std::ceil(engine->cameraCapabilities().maximumZoomLevel())));
m_cameraTiles->setTileSize(engine->tileSize().width());
- m_cameraTiles->setPluginString(m_pluginString);
-
+ m_cameraTiles->setPluginString(engine->managerName() + QLatin1Char('_') + QString::number(engine->managerVersion()));
m_mapScene->setTileSize(engine->tileSize().width());
}
@@ -209,22 +205,31 @@ void QGeoTiledMapPrivate::changeCameraData(const QGeoCameraData &oldCameraData)
}
m_cameraTiles->setCameraData(cam);
-
m_mapScene->setCameraData(cam);
- m_mapScene->setVisibleTiles(m_cameraTiles->visibleTiles());
+ updateScene();
+}
- if (m_tileRequests) {
- // don't request tiles that are already built and textured
- QList<QSharedPointer<QGeoTileTexture> > cachedTiles =
- m_tileRequests->requestTiles(m_cameraTiles->visibleTiles() - m_mapScene->texturedTiles());
+void QGeoTiledMapPrivate::updateScene()
+{
+ Q_Q(QGeoTiledMap);
+ // detect if new tiles introduced
+ const QSet<QGeoTileSpec>& tiles = m_cameraTiles->visibleTiles();
+ bool newTilesIntroduced = !m_mapScene->visibleTiles().contains(tiles);
+ m_mapScene->setVisibleTiles(tiles);
- foreach (const QSharedPointer<QGeoTileTexture> &tex, cachedTiles) {
- m_mapScene->addTile(tex->spec, tex);
- }
+ if (newTilesIntroduced)
+ q->evaluateCopyrights(tiles);
- if (!cachedTiles.isEmpty())
- q->update();
+ // don't request tiles that are already built and textured
+ QList<QSharedPointer<QGeoTileTexture> > cachedTiles =
+ m_tileRequests->requestTiles(m_cameraTiles->visibleTiles() - m_mapScene->texturedTiles());
+
+ foreach (const QSharedPointer<QGeoTileTexture> &tex, cachedTiles) {
+ m_mapScene->addTile(tex->spec, tex);
}
+
+ if (!cachedTiles.isEmpty())
+ q->update();
}
void QGeoTiledMapPrivate::changeActiveMapType(const QGeoMapType mapType)
@@ -232,9 +237,10 @@ void QGeoTiledMapPrivate::changeActiveMapType(const QGeoMapType mapType)
m_cameraTiles->setMapType(mapType);
}
-void QGeoTiledMapPrivate::changeMapVersion(int mapVersion)
+void QGeoTiledMapPrivate::changeTileVersion(int version)
{
- m_cameraTiles->setMapVersion(mapVersion);
+ m_cameraTiles->setMapVersion(version);
+ updateScene();
}
void QGeoTiledMapPrivate::mapResized(int width, int height)
diff --git a/src/location/maps/qgeotiledmap_p.h b/src/location/maps/qgeotiledmap_p.h
index 2dbf1754..2afbc5c9 100644
--- a/src/location/maps/qgeotiledmap_p.h
+++ b/src/location/maps/qgeotiledmap_p.h
@@ -87,13 +87,12 @@ public:
QDoubleVector2D coordinateToItemPosition(const QGeoCoordinate &coordinate, bool clipToViewport = true) const Q_DECL_OVERRIDE;
void prefetchData() Q_DECL_OVERRIDE;
-
protected:
QSGNode *updateSceneGraph(QSGNode *, QQuickWindow *window) Q_DECL_OVERRIDE;
-
-protected Q_SLOTS:
virtual void evaluateCopyrights(const QSet<QGeoTileSpec> &visibleTiles);
- void updateMapVersion();
+
+private Q_SLOTS:
+ void handleTileVersionChanged();
private:
Q_DISABLE_COPY(QGeoTiledMap)
diff --git a/src/location/maps/qgeotiledmap_p_p.h b/src/location/maps/qgeotiledmap_p_p.h
index bd4b4c05..95a61a2b 100644
--- a/src/location/maps/qgeotiledmap_p_p.h
+++ b/src/location/maps/qgeotiledmap_p_p.h
@@ -74,8 +74,6 @@ public:
~QGeoTiledMapPrivate();
QSGNode *updateSceneGraph(QSGNode *node, QQuickWindow *window);
-
- void changeMapVersion(int mapVersion);
void resized(int width, int height);
QGeoCoordinate itemPositionToCoordinate(const QDoubleVector2D &pos) const;
@@ -88,6 +86,10 @@ protected:
void mapResized(int width, int height) Q_DECL_OVERRIDE;
void changeCameraData(const QGeoCameraData &oldCameraData) Q_DECL_OVERRIDE;
void changeActiveMapType(const QGeoMapType mapType) Q_DECL_OVERRIDE;
+ void changeTileVersion(int version);
+
+private:
+ void updateScene();
private:
QGeoTileCache *m_cache;
diff --git a/src/location/maps/qgeotiledmappingmanagerengine.cpp b/src/location/maps/qgeotiledmappingmanagerengine.cpp
index 6ce3faca..b9322c13 100644
--- a/src/location/maps/qgeotiledmappingmanagerengine.cpp
+++ b/src/location/maps/qgeotiledmappingmanagerengine.cpp
@@ -201,7 +201,6 @@ void QGeoTiledMappingManagerEngine::engineTileFinished(const QGeoTileSpec &spec,
}
d->tileHash_.remove(spec);
-
tileCache()->insert(spec, bytes, format, d->cacheHint_);
map = maps.constBegin();
@@ -243,12 +242,27 @@ void QGeoTiledMappingManagerEngine::setTileSize(const QSize &tileSize)
d->tileSize_ = tileSize;
}
+void QGeoTiledMappingManagerEngine::setTileVersion(int version)
+{
+ Q_D(QGeoTiledMappingManagerEngine);
+ if (d->m_tileVersion != version) {
+ d->m_tileVersion = version;
+ emit tileVersionChanged();
+ }
+}
+
QSize QGeoTiledMappingManagerEngine::tileSize() const
{
Q_D(const QGeoTiledMappingManagerEngine);
return d->tileSize_;
}
+int QGeoTiledMappingManagerEngine::tileVersion() const
+{
+ Q_D(const QGeoTiledMappingManagerEngine);
+ return d->m_tileVersion;
+}
+
QGeoTiledMappingManagerEngine::CacheAreas QGeoTiledMappingManagerEngine::cacheHint() const
{
Q_D(const QGeoTiledMappingManagerEngine);
@@ -292,7 +306,10 @@ QSharedPointer<QGeoTileTexture> QGeoTiledMappingManagerEngine::getTileTexture(co
*******************************************************************************/
QGeoTiledMappingManagerEnginePrivate::QGeoTiledMappingManagerEnginePrivate()
-: cacheHint_(QGeoTiledMappingManagerEngine::AllCaches), tileCache_(0), fetcher_(0)
+: m_tileVersion(-1),
+ cacheHint_(QGeoTiledMappingManagerEngine::AllCaches),
+ tileCache_(0),
+ fetcher_(0)
{
}
diff --git a/src/location/maps/qgeotiledmappingmanagerengine_p.h b/src/location/maps/qgeotiledmappingmanagerengine_p.h
index e9cbf725..b0078397 100644
--- a/src/location/maps/qgeotiledmappingmanagerengine_p.h
+++ b/src/location/maps/qgeotiledmappingmanagerengine_p.h
@@ -76,6 +76,7 @@ public:
void releaseMap(QGeoTiledMap *map);
QSize tileSize() const;
+ int tileVersion() const;
void updateTileRequests(QGeoTiledMap *map,
const QSet<QGeoTileSpec> &tilesAdded,
@@ -93,11 +94,12 @@ private Q_SLOTS:
Q_SIGNALS:
void tileError(const QGeoTileSpec &spec, const QString &errorString);
- void mapVersionChanged();
+ void tileVersionChanged();
protected:
void setTileFetcher(QGeoTileFetcher *fetcher);
void setTileSize(const QSize &tileSize);
+ void setTileVersion(int version);
void setCacheHint(QGeoTiledMappingManagerEngine::CacheAreas cacheHint);
QGeoTileCache *createTileCacheWithDir(const QString &cacheDirectory);
diff --git a/src/location/maps/qgeotiledmappingmanagerengine_p_p.h b/src/location/maps/qgeotiledmappingmanagerengine_p_p.h
index e679b627..7fb08e75 100644
--- a/src/location/maps/qgeotiledmappingmanagerengine_p_p.h
+++ b/src/location/maps/qgeotiledmappingmanagerengine_p_p.h
@@ -68,6 +68,7 @@ public:
~QGeoTiledMappingManagerEnginePrivate();
QSize tileSize_;
+ int m_tileVersion;
QHash<QGeoTiledMap *, QSet<QGeoTileSpec> > mapHash_;
QHash<QGeoTileSpec, QSet<QGeoTiledMap *> > tileHash_;
QGeoTiledMappingManagerEngine::CacheAreas cacheHint_;
diff --git a/src/plugins/geoservices/nokia/qgeotiledmap_nokia.cpp b/src/plugins/geoservices/nokia/qgeotiledmap_nokia.cpp
index bf58ad34..98777d09 100644
--- a/src/plugins/geoservices/nokia/qgeotiledmap_nokia.cpp
+++ b/src/plugins/geoservices/nokia/qgeotiledmap_nokia.cpp
@@ -110,13 +110,4 @@ void QGeoTiledMapNokia::evaluateCopyrights(const QSet<QGeoTileSpec> &visibleTile
emit copyrightsChanged(m_copyrightsSlab);
}
-int QGeoTiledMapNokia::mapVersion()
-{
- if (!m_engine.isNull())
- return m_engine->mapVersion();
- else
- return QGeoTiledMap::mapVersion();
-
-}
-
QT_END_NAMESPACE
diff --git a/src/plugins/geoservices/nokia/qgeotiledmap_nokia.h b/src/plugins/geoservices/nokia/qgeotiledmap_nokia.h
index d0253343..9651cc80 100644
--- a/src/plugins/geoservices/nokia/qgeotiledmap_nokia.h
+++ b/src/plugins/geoservices/nokia/qgeotiledmap_nokia.h
@@ -54,7 +54,6 @@ public:
QString getViewCopyright();
void evaluateCopyrights(const QSet<QGeoTileSpec> &visibleTiles);
- int mapVersion();
private:
QImage m_logo;
diff --git a/src/plugins/geoservices/nokia/qgeotiledmappingmanagerengine_nokia.cpp b/src/plugins/geoservices/nokia/qgeotiledmappingmanagerengine_nokia.cpp
index 02e6f12c..54bf29af 100644
--- a/src/plugins/geoservices/nokia/qgeotiledmappingmanagerengine_nokia.cpp
+++ b/src/plugins/geoservices/nokia/qgeotiledmappingmanagerengine_nokia.cpp
@@ -258,8 +258,7 @@ void QGeoTiledMappingManagerEngineNokia::updateVersion(const QJsonObject &newVer
m_mapVersion.setVersion(m_mapVersion.version() + 1);
saveMapVersion();
-
- emit mapVersionChanged();
+ setTileVersion(m_mapVersion.version());
}
}
@@ -297,6 +296,7 @@ void QGeoTiledMappingManagerEngineNokia::loadMapVersion()
m_mapVersion.setVersion(object[QStringLiteral("version")].toInt());
m_mapVersion.setVersionData(object[QStringLiteral("data")].toObject());
+ setTileVersion(m_mapVersion.version());
}
QString QGeoTiledMappingManagerEngineNokia::evaluateCopyrightsText(const QGeoMapType mapType,