diff options
author | Paolo Angelelli <paolo.angelelli@qt.io> | 2017-08-21 14:44:34 +0200 |
---|---|---|
committer | Paolo Angelelli <paolo.angelelli@qt.io> | 2017-08-23 10:43:14 +0000 |
commit | d22e6d09f1607e694694d2ae5b2f447605a8782e (patch) | |
tree | ab2348ddc950085b8511d6c3a0900d555bb5cf11 /src | |
parent | f61a0512cc56c0e86870a66fcca43e0a16e4e8e9 (diff) | |
download | qtlocation-d22e6d09f1607e694694d2ae5b2f447605a8782e.tar.gz |
Fix PluginParameter not working with script as property values
This patch introduces the undocumented
QDeclarativeGeoServiceProviderParameter::initialized signal, to signal
to the parent when a parameter becomes fully initialized, so that
the parent QDeclarativeGeoServiceProvider can attach.
Task-number: QTBUG-62075
Change-Id: Ie3615abf31d19f39587c5e54b202f8f2c4a711cc
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/location/declarativemaps/qdeclarativegeoserviceprovider.cpp | 59 | ||||
-rw-r--r-- | src/location/declarativemaps/qdeclarativegeoserviceprovider_p.h | 5 |
2 files changed, 58 insertions, 6 deletions
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); |