diff options
author | Paolo Angelelli <paolo.angelelli@theqtcompany.com> | 2016-07-26 16:45:37 +0200 |
---|---|---|
committer | Paolo Angelelli <paolo.angelelli@theqtcompany.com> | 2016-07-29 14:13:39 +0000 |
commit | e7099f14c8faea4fb7c89877973b7cec75044cb3 (patch) | |
tree | 773b6ef8f73359c256c4cb442ae4391a4a3d02e8 /src/plugins/geoservices/osm | |
parent | 75dd424e11964d8755abdb1b12b27a8479353b37 (diff) | |
download | qtlocation-e7099f14c8faea4fb7c89877973b7cec75044cb3.tar.gz |
Enable dynamic addition/removal of map types by the mapping manager
Map types are currently fixed in the constructor, regardless of whether
they were available, or, now, whether they are enabled or not.
This patch makes the geomappingmanager notify (e.g., emit a signal)
when the available map types change at runtime. This is used in the
OSM mappingmanagerengine, which can now disable map types if provider
records turn out to be invalid or disabled after they have been
fetched.
Change-Id: I8e0e75504c882609f91c6d1ceb88424eee656f26
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
Diffstat (limited to 'src/plugins/geoservices/osm')
3 files changed, 48 insertions, 10 deletions
diff --git a/src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.cpp b/src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.cpp index 92982a1f..738bf9a9 100644 --- a/src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.cpp +++ b/src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.cpp @@ -80,11 +80,8 @@ QGeoTiledMappingManagerEngineOsm::QGeoTiledMappingManagerEngineOsm(const QVarian new QGeoTileProviderOsm(domain + "satellite", nm, QGeoMapType(QGeoMapType::SatelliteMapDay, tr("Satellite Map"), tr("Satellite map view in daylight mode"), false, false, 2), - QGeoTileProviderOsm::TileProvider(QStringLiteral("http://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryOnly/MapServer/tile/%z/%y/%x"), - QStringLiteral("jpg"), - QStringLiteral("<a href='http://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryOnly/MapServer'>USGS The National Map: Orthoimagery</a>"), - QStringLiteral("<a href='http://landsat.gsfc.nasa.gov/?page_id=2339'>USGS/NASA Landsat</a>") - ))); + QGeoTileProviderOsm::TileProvider() + )); m_providers.push_back( new QGeoTileProviderOsm(domain + "cycle", nm, @@ -167,15 +164,17 @@ QGeoTiledMappingManagerEngineOsm::QGeoTiledMappingManagerEngineOsm(const QVarian if (parameters.contains(QStringLiteral("osm.mapping.providersrepository.disabled"))) disableRedirection = parameters.value(QStringLiteral("osm.mapping.providersrepository.disabled")).toBool(); - QList<QGeoMapType> mapTypes; foreach (QGeoTileProviderOsm * provider, m_providers) { provider->setParent(this); if (disableRedirection) provider->disableRedirection(); - mapTypes << provider->mapType(); + + connect(provider, &QGeoTileProviderOsm::resolutionFinished, + this, &QGeoTiledMappingManagerEngineOsm::onProviderResolutionFinished); + connect(provider, &QGeoTileProviderOsm::resolutionError, + this, &QGeoTiledMappingManagerEngineOsm::onProviderResolutionError); } - // See map type implementations in QGeoTiledMapOsm and QGeoTileFetcherOsm. - setSupportedMapTypes(mapTypes); + updateMapTypes(); QGeoTileFetcherOsm *tileFetcher = new QGeoTileFetcherOsm(m_providers, nm, this); if (parameters.contains(QStringLiteral("osm.useragent"))) { @@ -214,4 +213,33 @@ QString QGeoTiledMappingManagerEngineOsm::customCopyright() const return m_customCopyright; } +void QGeoTiledMappingManagerEngineOsm::onProviderResolutionFinished(const QGeoTileProviderOsm *provider) +{ + if (!provider->isResolved()) + return; + updateMapTypes(); +} + +void QGeoTiledMappingManagerEngineOsm::onProviderResolutionError(const QGeoTileProviderOsm *provider, QNetworkReply::NetworkError error) +{ + Q_UNUSED(error) + if (!provider->isResolved()) + return; + updateMapTypes(); +} + +void QGeoTiledMappingManagerEngineOsm::updateMapTypes() +{ + QList<QGeoMapType> mapTypes; + foreach (QGeoTileProviderOsm * provider, m_providers) { + // assume provider are ok until they have been resolved invalid + if (!provider->isResolved() || provider->isValid()) + mapTypes << provider->mapType(); + } + const QList<QGeoMapType> currentlySupportedMapTypes = supportedMapTypes(); + if (currentlySupportedMapTypes != mapTypes) + // See map type implementations in QGeoTiledMapOsm and QGeoTileFetcherOsm. + setSupportedMapTypes(mapTypes); +} + QT_END_NAMESPACE diff --git a/src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.h b/src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.h index 9755b0c2..68a7a517 100644 --- a/src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.h +++ b/src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.h @@ -57,6 +57,13 @@ public: const QVector<QGeoTileProviderOsm *> &providers(); QString customCopyright() const; +protected Q_SLOTS: + void onProviderResolutionFinished(const QGeoTileProviderOsm *provider); + void onProviderResolutionError(const QGeoTileProviderOsm *provider, QNetworkReply::NetworkError error); + +protected: + void updateMapTypes(); + private: QVector<QGeoTileProviderOsm *> m_providers; QString m_customCopyright; diff --git a/src/plugins/geoservices/osm/qgeotilefetcherosm.cpp b/src/plugins/geoservices/osm/qgeotilefetcherosm.cpp index 45da7d42..f643c66e 100644 --- a/src/plugins/geoservices/osm/qgeotilefetcherosm.cpp +++ b/src/plugins/geoservices/osm/qgeotilefetcherosm.cpp @@ -109,7 +109,10 @@ QGeoTiledMapReply *QGeoTileFetcherOsm::getTileImage(const QGeoTileSpec &spec) int id = spec.mapId(); if (id < 1 || id > m_providers.size()) { qWarning("Unknown map id %d\n", spec.mapId()); - id = 0; + if (m_providers.isEmpty()) + return Q_NULLPTR; + else + id = 1; } id -= 1; // TODO: make OSM map ids start from 0. |