summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Angelelli <paolo.angelelli@qt.io>2017-08-27 12:22:14 +0200
committerpaolo <paolo.angelelli@qt.io>2017-08-27 12:24:05 +0200
commit05703dd5271a2b25ee18dda6c136a5bee0f92629 (patch)
tree72668686841f3cc1df9384b90863e0eb175f53e6
parentb68b88373beb884c77ec9813cac1e9a79854b957 (diff)
parentd22e6d09f1607e694694d2ae5b2f447605a8782e (diff)
downloadqtlocation-05703dd5271a2b25ee18dda6c136a5bee0f92629.tar.gz
Merge remote-tracking branch 'origin/5.9' into dev
Conflicts: tests/auto/geotestplugin/qgeotiledmappingmanagerengine_test.h Change-Id: I4940db79ebe500ff7e37ded42c7d29d7ccfb6253
-rw-r--r--src/location/declarativemaps/qdeclarativegeocodemodel.cpp3
-rw-r--r--src/location/declarativemaps/qdeclarativegeomap.cpp16
-rw-r--r--src/location/declarativemaps/qdeclarativegeoserviceprovider.cpp59
-rw-r--r--src/location/declarativemaps/qdeclarativegeoserviceprovider_p.h5
-rw-r--r--tests/auto/declarative_core/tst_plugin.qml7
-rw-r--r--tests/auto/declarative_ui/tst_map.qml24
-rw-r--r--tests/auto/geotestplugin/qgeotiledmappingmanagerengine_test.h7
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);