From e7099f14c8faea4fb7c89877973b7cec75044cb3 Mon Sep 17 00:00:00 2001 From: Paolo Angelelli Date: Tue, 26 Jul 2016 16:45:37 +0200 Subject: 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 Reviewed-by: Alex Blasche --- .../osm/qgeotiledmappingmanagerengineosm.cpp | 46 +++++++++++++++++----- .../osm/qgeotiledmappingmanagerengineosm.h | 7 ++++ src/plugins/geoservices/osm/qgeotilefetcherosm.cpp | 5 ++- 3 files changed, 48 insertions(+), 10 deletions(-) (limited to 'src/plugins/geoservices/osm') 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("USGS The National Map: Orthoimagery"), - QStringLiteral("USGS/NASA Landsat") - ))); + 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 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 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 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 &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 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. -- cgit v1.2.1