diff options
author | Frederik Gladhorn <frederik.gladhorn@qt.io> | 2017-09-02 10:27:54 +0200 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@qt.io> | 2017-09-02 10:27:54 +0200 |
commit | 222ba4b733f67a51758708e27b7c76cdaaa3e228 (patch) | |
tree | f898fd85858db0aace28c0d075feeea9506d4a61 | |
parent | 0d0b221ce6428549bcbd1cde055530b52e15c098 (diff) | |
parent | 05703dd5271a2b25ee18dda6c136a5bee0f92629 (diff) | |
download | qtlocation-222ba4b733f67a51758708e27b7c76cdaaa3e228.tar.gz |
Merge dev into 5.10
Change-Id: I36d66c69ac72fe44a5161f7a45803d47d97f8e6e
7 files changed, 106 insertions, 15 deletions
diff --git a/src/location/declarativemaps/qdeclarativegeocodemodel.cpp b/src/location/declarativemaps/qdeclarativegeocodemodel.cpp index ee435a5a..3e2a1aea 100644 --- a/src/location/declarativemaps/qdeclarativegeocodemodel.cpp +++ b/src/location/declarativemaps/qdeclarativegeocodemodel.cpp @@ -319,6 +319,9 @@ void QDeclarativeGeocodeModel::pluginReady() this, SLOT(geocodeFinished(QGeoCodeReply*))); connect(geocodingManager, SIGNAL(error(QGeoCodeReply*,QGeoCodeReply::Error,QString)), this, SLOT(geocodeError(QGeoCodeReply*,QGeoCodeReply::Error,QString))); + + if (complete_ && autoUpdate_) + update(); } /*! diff --git a/src/location/declarativemaps/qdeclarativegeomap.cpp b/src/location/declarativemaps/qdeclarativegeomap.cpp index 37cfc303..9b19a0ac 100644 --- a/src/location/declarativemaps/qdeclarativegeomap.cpp +++ b/src/location/declarativemaps/qdeclarativegeomap.cpp @@ -553,26 +553,26 @@ QQuickGeoMapGestureArea *QDeclarativeGeoMap::gesture() */ void QDeclarativeGeoMap::populateMap() { - QObjectList kids = children(); - QList<QQuickItem *> quickKids = childItems(); - for (int i=0; i < quickKids.count(); ++i) - kids.append(quickKids.at(i)); + QSet<QObject *> kids = children().toSet(); + const QList<QQuickItem *> quickKids = childItems(); + for (QQuickItem *ite: quickKids) + kids.insert(ite); - for (int i = 0; i < kids.size(); ++i) { + for (QObject *k : qAsConst(kids)) { // dispatch items appropriately - QDeclarativeGeoMapItemView *mapView = qobject_cast<QDeclarativeGeoMapItemView *>(kids.at(i)); + QDeclarativeGeoMapItemView *mapView = qobject_cast<QDeclarativeGeoMapItemView *>(k); if (mapView) { m_mapViews.append(mapView); setupMapView(mapView); continue; } - QDeclarativeGeoMapItemBase *mapItem = qobject_cast<QDeclarativeGeoMapItemBase *>(kids.at(i)); + QDeclarativeGeoMapItemBase *mapItem = qobject_cast<QDeclarativeGeoMapItemBase *>(k); if (mapItem) { addMapItem(mapItem); continue; } // Allow to add to the map Map items contained inside a parent QQuickItem, but only those at one level of nesting. - QDeclarativeGeoMapItemGroup *itemGroup = qobject_cast<QDeclarativeGeoMapItemGroup *>(kids.at(i)); + QDeclarativeGeoMapItemGroup *itemGroup = qobject_cast<QDeclarativeGeoMapItemGroup *>(k); if (itemGroup) { addMapItemGroup(itemGroup); continue; diff --git a/src/location/declarativemaps/qdeclarativegeoserviceprovider.cpp b/src/location/declarativemaps/qdeclarativegeoserviceprovider.cpp index 4b8b2d7c..9e4fee8a 100644 --- a/src/location/declarativemaps/qdeclarativegeoserviceprovider.cpp +++ b/src/location/declarativemaps/qdeclarativegeoserviceprovider.cpp @@ -113,12 +113,42 @@ void QDeclarativeGeoServiceProvider::setName(const QString &name) return; name_ = name; + + if (complete_) + tryAttach(); + + emit nameChanged(name_); +} + +/*! + \internal +*/ +bool QDeclarativeGeoServiceProvider::parametersReady() { + for (const QDeclarativeGeoServiceProviderParameter *p: qAsConst(parameters_)) { + if (!p->isInitialized()) + return false; + } + return true; +} + +/*! + \internal +*/ +void QDeclarativeGeoServiceProvider::tryAttach() +{ + if (!parametersReady()) + return; + delete sharedProvider_; + sharedProvider_ = nullptr; + + if (name_.isEmpty()) + return; + sharedProvider_ = new QGeoServiceProvider(name_, parameterMap()); sharedProvider_->setLocale(locales_.at(0)); sharedProvider_->setAllowExperimental(experimental_); - emit nameChanged(name_); emit attached(); } @@ -147,11 +177,17 @@ QStringList QDeclarativeGeoServiceProvider::availableServiceProviders() void QDeclarativeGeoServiceProvider::componentComplete() { complete_ = true; - if (!name_.isEmpty()) { - return; + + for (QDeclarativeGeoServiceProviderParameter *p: qAsConst(parameters_)) { + if (!p->isInitialized()) { + connect(p, &QDeclarativeGeoServiceProviderParameter::initialized, + this, &QDeclarativeGeoServiceProvider::tryAttach); + } } - if (!prefer_.isEmpty() + if (!name_.isEmpty()) { + tryAttach(); + } else if (!prefer_.isEmpty() || required_->mappingRequirements() != NoMappingFeatures || required_->routingRequirements() != NoRoutingFeatures || required_->geocodingRequirements() != NoGeocodingFeatures @@ -796,15 +832,18 @@ QDeclarativeGeoServiceProviderParameter::~QDeclarativeGeoServiceProviderParamete \qmlproperty string PluginParameter::name This property holds the name of the plugin parameter as a single formatted string. + This property is a write-once property. */ void QDeclarativeGeoServiceProviderParameter::setName(const QString &name) { - if (name_ == name) + if (!name_.isEmpty() || name.isEmpty()) return; name_ = name; emit nameChanged(name_); + if (value_.isValid()) + emit initialized(); } QString QDeclarativeGeoServiceProviderParameter::name() const @@ -816,15 +855,18 @@ QString QDeclarativeGeoServiceProviderParameter::name() const \qmlproperty QVariant PluginParameter::value This property holds the value of the plugin parameter which support different types of values (variant). + This property is a write-once property. */ void QDeclarativeGeoServiceProviderParameter::setValue(const QVariant &value) { - if (value_ == value) + if (value_.isValid() || !value.isValid() || value.isNull()) return; value_ = value; emit valueChanged(value_); + if (!name_.isEmpty()) + emit initialized(); } QVariant QDeclarativeGeoServiceProviderParameter::value() const @@ -832,6 +874,11 @@ QVariant QDeclarativeGeoServiceProviderParameter::value() const return value_; } +bool QDeclarativeGeoServiceProviderParameter::isInitialized() const +{ + return !name_.isEmpty() && value_.isValid(); +} + /******************************************************************************* *******************************************************************************/ diff --git a/src/location/declarativemaps/qdeclarativegeoserviceprovider_p.h b/src/location/declarativemaps/qdeclarativegeoserviceprovider_p.h index 426c6b4d..c1ad4987 100644 --- a/src/location/declarativemaps/qdeclarativegeoserviceprovider_p.h +++ b/src/location/declarativemaps/qdeclarativegeoserviceprovider_p.h @@ -78,9 +78,12 @@ public: void setValue(const QVariant &value); QVariant value() const; + bool isInitialized() const; + Q_SIGNALS: void nameChanged(const QString &name); void valueChanged(const QVariant &value); + void initialized(); private: QString name_; @@ -210,6 +213,8 @@ Q_SIGNALS: void allowExperimentalChanged(bool allow); private: + bool parametersReady(); + void tryAttach(); static void parameter_append(QQmlListProperty<QDeclarativeGeoServiceProviderParameter> *prop, QDeclarativeGeoServiceProviderParameter *mapObject); static int parameter_count(QQmlListProperty<QDeclarativeGeoServiceProviderParameter> *prop); static QDeclarativeGeoServiceProviderParameter *parameter_at(QQmlListProperty<QDeclarativeGeoServiceProviderParameter> *prop, int index); diff --git a/tests/auto/declarative_core/tst_plugin.qml b/tests/auto/declarative_core/tst_plugin.qml index 3dabba07..7b880f1d 100644 --- a/tests/auto/declarative_core/tst_plugin.qml +++ b/tests/auto/declarative_core/tst_plugin.qml @@ -99,9 +99,14 @@ Item { verify(invalidPlugin.supportsRouting()) verify(invalidPlugin.supportsPlaces()) - invalidPlugin.name = '' + invalidPlugin.name = 'here' compare(invalidAttachedSpy.count, 2) + verify(invalidPlugin.supportsMapping(Plugin.OnlineMappingFeature)) + verify(invalidPlugin.supportsGeocoding(Plugin.OnlineGeocodingFeature)) + verify(invalidPlugin.supportsRouting(Plugin.OnlineRoutingFeature)) + invalidPlugin.name = '' + compare(invalidAttachedSpy.count, 2) verify(!invalidPlugin.supportsMapping()) verify(!invalidPlugin.supportsGeocoding()) verify(!invalidPlugin.supportsRouting()) diff --git a/tests/auto/declarative_ui/tst_map.qml b/tests/auto/declarative_ui/tst_map.qml index a6c10c22..52dcac11 100644 --- a/tests/auto/declarative_ui/tst_map.qml +++ b/tests/auto/declarative_ui/tst_map.qml @@ -50,6 +50,20 @@ Item { } ] } + Plugin { + id: testPluginLazyParameter; + name: "qmlgeo.test.plugin" + allowExperimental: true + property string extraTypeName : undefined + PluginParameter { name: "supported"; value: true} + PluginParameter { name: "finishRequestImmediately"; value: true} + PluginParameter { name: "validateWellKnownValues"; value: true} + PluginParameter { name: "extraMapTypeName"; value: testPluginLazyParameter.extraTypeName} + + Component.onCompleted: { + extraTypeName = "SomeString" + } + } property variant coordinate1: QtPositioning.coordinate(10, 11) property variant coordinate2: QtPositioning.coordinate(12, 13) @@ -106,6 +120,11 @@ Item { Map {id: mapTiltBearingHere; plugin: herePlugin; center: coordinate1; width: 1000; height: 1000; zoomLevel: 4; bearing: 45.0; tilt: 25.0 } + Map { + id: mapWithLazyPlugin + plugin: testPluginLazyParameter + } + MapParameter { id: testParameter type: "cameraCenter_test" @@ -129,6 +148,11 @@ Item { mapCenterSpy.clear(); } + function test_lazy_parameter() { + compare(mapWithLazyPlugin.supportedMapTypes.length, 5) + compare(mapWithLazyPlugin.supportedMapTypes[4].name, "SomeString") + } + function test_map_center() { // coordinate is set at map element declaration compare(map.center.latitude, 10) diff --git a/tests/auto/geotestplugin/qgeotiledmappingmanagerengine_test.h b/tests/auto/geotestplugin/qgeotiledmappingmanagerengine_test.h index 0a7624ee..297be0d5 100644 --- a/tests/auto/geotestplugin/qgeotiledmappingmanagerengine_test.h +++ b/tests/auto/geotestplugin/qgeotiledmappingmanagerengine_test.h @@ -64,6 +64,7 @@ public: const QByteArray pluginName = "qmlgeo.test.plugin"; QList<QGeoMapType> mapTypes; + mapTypes << QGeoMapType(QGeoMapType::StreetMap, tr("StreetMap"), tr("StreetMap"), false, false, 1, pluginName, capabilities); mapTypes << QGeoMapType(QGeoMapType::SatelliteMapDay, tr("SatelliteMapDay"), tr("SatelliteMapDay"), false, false, 2, pluginName, capabilities); mapTypes << QGeoMapType(QGeoMapType::CycleMap, tr("CycleMap"), tr("CycleMap"), false, false, 3, pluginName, capabilities); @@ -80,6 +81,12 @@ public: QVariantMap meta; meta["foo"] = 42; mapTypes << QGeoMapType(QGeoMapType::CustomMap, tr("AlternateCameraCapabilities"), tr("AlternateCameraCapabilities"), false, false, 4, pluginName, capabilities4, meta); + + if (parameters.contains(QStringLiteral("extraMapTypeName"))) { + QString extraMapTypeName = parameters.value(QStringLiteral("extraMapTypeName")).toString(); + mapTypes << QGeoMapType(QGeoMapType::CustomMap, extraMapTypeName, extraMapTypeName, false, false, 5, pluginName, capabilities); + } + setSupportedMapTypes(mapTypes); QGeoTileFetcherTest *fetcher = new QGeoTileFetcherTest(this); |