summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Angelelli <paolo.angelelli@qt.io>2019-04-23 16:31:49 +0200
committerpaolo <paolo.angelelli@qt.io>2019-07-18 14:54:47 +0200
commit436d103654ec3382669625128fc6d074b10f03ff (patch)
treea6729e94e27afc3415cdc0f661b1f3d1efff08ba
parentadb172a7aa342774b76b78618659926281516e11 (diff)
downloadqtlocation-436d103654ec3382669625128fc6d074b10f03ff.tar.gz
Accept and honor PluginParameters in PositionSource elements
This patch implements the support for PluginParameters inside PositionSources. Task-number: QTBUG-66304 Change-Id: Ia28e1c620b6f6abc462a0e4c68a0ff517a40cfa9 Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
-rw-r--r--src/positioningquick/qdeclarativepositionsource.cpp193
-rw-r--r--src/positioningquick/qdeclarativepositionsource_p.h19
2 files changed, 165 insertions, 47 deletions
diff --git a/src/positioningquick/qdeclarativepositionsource.cpp b/src/positioningquick/qdeclarativepositionsource.cpp
index c9fd2c8e..3bf39081 100644
--- a/src/positioningquick/qdeclarativepositionsource.cpp
+++ b/src/positioningquick/qdeclarativepositionsource.cpp
@@ -43,7 +43,8 @@
#include <QtCore/QCoreApplication>
#include <QtQml/qqmlinfo.h>
#include <QtQml/qqml.h>
-#include <qnmeapositioninfosource.h>
+#include <QtPositioning/qnmeapositioninfosource.h>
+#include <qdeclarativepluginparameter_p.h>
#include <QFile>
#include <QtNetwork/QTcpSocket>
#include <QTimer>
@@ -109,7 +110,7 @@ QT_BEGIN_NAMESPACE
a PositionSource in your application to retrieve local data for users
from a REST web service.
- \sa {QtPositioning::Position}, {QGeoPositionInfoSource}
+ \sa {QtPositioning::Position}, {QGeoPositionInfoSource}, {PluginParameter}
*/
@@ -164,7 +165,7 @@ QString QDeclarativePositionSource::name() const
if (m_positionSource)
return m_positionSource->sourceName();
else
- return QString();
+ return m_providerName;
}
void QDeclarativePositionSource::setName(const QString &newName)
@@ -172,15 +173,41 @@ void QDeclarativePositionSource::setName(const QString &newName)
if (m_positionSource && m_positionSource->sourceName() == newName)
return;
+ if (m_providerName == newName && m_providerName.isEmpty())
+ return; // previously attached to a default source, now requesting the same.
+
const QString previousName = name();
+ m_providerName = newName;
+
+ if (!m_componentComplete || !m_parametersInitialized) {
+ if (previousName != name())
+ emit nameChanged();
+ return;
+ }
+
+ tryAttach(newName, false);
+}
+
+/*!
+ \internal
+*/
+void QDeclarativePositionSource::tryAttach(const QString &newName, bool useFallback)
+{
+ const QString previousName = name();
+ const bool sourceExisted = m_positionSource;
+ m_providerName = newName;
+
int previousUpdateInterval = updateInterval();
PositioningMethods previousPositioningMethods = supportedPositioningMethods();
PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods();
- if (newName.isEmpty())
- setSource(QGeoPositionInfoSource::createDefaultSource(this));
- else
- setSource(QGeoPositionInfoSource::createSource(newName, this));
+ if (newName.isEmpty()) {
+ setSource(QGeoPositionInfoSource::createDefaultSource(parameterMap(), this));
+ } else {
+ setSource(QGeoPositionInfoSource::createSource(newName, parameterMap(), this));
+ if (!m_positionSource && useFallback)
+ setSource(QGeoPositionInfoSource::createDefaultSource(parameterMap(), this));
+ }
if (m_positionSource) {
connect(m_positionSource, SIGNAL(positionUpdated(QGeoPositionInfo)),
@@ -194,7 +221,12 @@ void QDeclarativePositionSource::setName(const QString &newName)
m_positionSource->setPreferredPositioningMethods(
static_cast<QGeoPositionInfoSource::PositioningMethods>(int(m_preferredPositioningMethods)));
- setPosition(m_positionSource->lastKnownPosition());
+ const QGeoPositionInfo &lastKnown = m_positionSource->lastKnownPosition();
+ if (lastKnown.isValid())
+ setPosition(lastKnown);
+ } else if (m_active) {
+ m_active = false;
+ emit activeChanged();
}
if (previousUpdateInterval != updateInterval())
@@ -208,9 +240,13 @@ void QDeclarativePositionSource::setName(const QString &newName)
emit validityChanged();
- if (m_active) {
- m_active = false;
- emit activeChanged();
+ if (m_active) { // implies m_positionSource
+ if (!sourceExisted) {
+ QTimer::singleShot(0, this, SLOT(start())); // delay ensures all properties have been set
+ } else {
+ m_active = false;
+ emit activeChanged();
+ }
}
if (previousName != name())
@@ -232,9 +268,6 @@ bool QDeclarativePositionSource::isValid() const
return (m_positionSource != 0);
}
-/*!
- \internal
-*/
void QDeclarativePositionSource::setNmeaSource(const QUrl &nmeaSource)
{
if (nmeaSource.scheme() == QLatin1String("socket")) {
@@ -411,6 +444,24 @@ void QDeclarativePositionSource::updateTimeoutReceived()
emit updateTimeout();
}
+/*!
+ \internal
+*/
+void QDeclarativePositionSource::onParameterInitialized()
+{
+ m_parametersInitialized = true;
+ for (QDeclarativePluginParameter *p: qAsConst(m_parameters)) {
+ if (!p->isInitialized()) {
+ m_parametersInitialized = false;
+ break;
+ }
+ }
+
+ // If here, componentComplete has been called.
+ if (m_parametersInitialized)
+ tryAttach(m_providerName);
+}
+
void QDeclarativePositionSource::setPosition(const QGeoPositionInfo &pi)
{
m_position.setPosition(pi);
@@ -431,6 +482,30 @@ void QDeclarativePositionSource::setSource(QGeoPositionInfoSource *source)
}
}
+bool QDeclarativePositionSource::parametersReady()
+{
+ for (const QDeclarativePluginParameter *p: qAsConst(m_parameters)) {
+ if (!p->isInitialized())
+ return false;
+ }
+ return true;
+}
+
+/*!
+ \internal
+*/
+QVariantMap QDeclarativePositionSource::parameterMap() const
+{
+ QVariantMap map;
+
+ for (int i = 0; i < m_parameters.size(); ++i) {
+ QDeclarativePluginParameter *parameter = m_parameters.at(i);
+ map.insert(parameter->name(), parameter->value());
+ }
+
+ return map;
+}
+
/*!
\internal
*/
@@ -717,47 +792,73 @@ QGeoPositionInfoSource *QDeclarativePositionSource::positionSource() const
return m_positionSource;
}
-void QDeclarativePositionSource::componentComplete()
-{
- if (!m_positionSource) {
- int previousUpdateInterval = updateInterval();
- PositioningMethods previousPositioningMethods = supportedPositioningMethods();
- PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods();
+/*!
+ \qmlproperty list<PluginParameter> PositionSource::parameters
+ \default
- setSource(QGeoPositionInfoSource::createDefaultSource(this));
- if (m_positionSource) {
- connect(m_positionSource, SIGNAL(positionUpdated(QGeoPositionInfo)),
- this, SLOT(positionUpdateReceived(QGeoPositionInfo)));
- connect(m_positionSource, SIGNAL(error(QGeoPositionInfoSource::Error)),
- this, SLOT(sourceErrorReceived(QGeoPositionInfoSource::Error)));
- connect(m_positionSource, SIGNAL(updateTimeout()),
- this, SLOT(updateTimeoutReceived()));
+ This property holds the list of plugin parameters.
- m_positionSource->setUpdateInterval(m_updateInterval);
- m_positionSource->setPreferredPositioningMethods(
- static_cast<QGeoPositionInfoSource::PositioningMethods>(int(m_preferredPositioningMethods)));
+ \since QtPositioning 5.14
+*/
+QQmlListProperty<QDeclarativePluginParameter> QDeclarativePositionSource::parameters()
+{
+ return QQmlListProperty<QDeclarativePluginParameter>(this,
+ 0,
+ parameter_append,
+ parameter_count,
+ parameter_at,
+ parameter_clear);
+}
- setPosition(m_positionSource->lastKnownPosition());
+/*!
+ \internal
+*/
+void QDeclarativePositionSource::parameter_append(QQmlListProperty<QDeclarativePluginParameter> *prop, QDeclarativePluginParameter *parameter)
+{
+ QDeclarativePositionSource *p = static_cast<QDeclarativePositionSource *>(prop->object);
+ p->m_parameters.append(parameter);
+}
- if (m_active)
- QTimer::singleShot(0, this, SLOT(start())); // delay ensures all properties have been set
- } else if (m_active) {
- m_active = false;
- emit activeChanged();
- }
+/*!
+ \internal
+*/
+int QDeclarativePositionSource::parameter_count(QQmlListProperty<QDeclarativePluginParameter> *prop)
+{
+ return static_cast<QDeclarativePositionSource *>(prop->object)->m_parameters.count();
+}
- if (previousUpdateInterval != updateInterval())
- emit updateIntervalChanged();
+/*!
+ \internal
+*/
+QDeclarativePluginParameter *QDeclarativePositionSource::parameter_at(QQmlListProperty<QDeclarativePluginParameter> *prop, int index)
+{
+ return static_cast<QDeclarativePositionSource *>(prop->object)->m_parameters[index];
+}
- if (previousPreferredPositioningMethods != preferredPositioningMethods())
- emit preferredPositioningMethodsChanged();
+/*!
+ \internal
+*/
+void QDeclarativePositionSource::parameter_clear(QQmlListProperty<QDeclarativePluginParameter> *prop)
+{
+ QDeclarativePositionSource *p = static_cast<QDeclarativePositionSource *>(prop->object);
+ p->m_parameters.clear();
+}
- if (previousPositioningMethods != supportedPositioningMethods())
- emit supportedPositioningMethodsChanged();
- emit validityChanged();
- emit nameChanged();
+void QDeclarativePositionSource::componentComplete()
+{
+ m_componentComplete = true;
+ m_parametersInitialized = true;
+ for (QDeclarativePluginParameter *p: qAsConst(m_parameters)) {
+ if (!p->isInitialized()) {
+ m_parametersInitialized = false;
+ connect(p, &QDeclarativePluginParameter::initialized,
+ this, &QDeclarativePositionSource::onParameterInitialized);
+ }
}
+
+ if (m_parametersInitialized)
+ tryAttach(m_providerName);
}
/*!
diff --git a/src/positioningquick/qdeclarativepositionsource_p.h b/src/positioningquick/qdeclarativepositionsource_p.h
index c6daaae5..7e389b85 100644
--- a/src/positioningquick/qdeclarativepositionsource_p.h
+++ b/src/positioningquick/qdeclarativepositionsource_p.h
@@ -56,7 +56,8 @@
#include <QtCore/QObject>
#include <QtNetwork/QAbstractSocket>
#include <QtQml/QQmlParserStatus>
-#include <QtPositioning/QGeoPositionInfoSource>
+#include <QtPositioning/qgeopositioninfosource.h>
+#include <QtPositioningQuick/private/qdeclarativepluginparameter_p.h>
QT_BEGIN_NAMESPACE
@@ -76,8 +77,10 @@ class Q_POSITIONINGQUICK_PRIVATE_EXPORT QDeclarativePositionSource : public QObj
Q_PROPERTY(PositioningMethods preferredPositioningMethods READ preferredPositioningMethods WRITE setPreferredPositioningMethods NOTIFY preferredPositioningMethodsChanged)
Q_PROPERTY(SourceError sourceError READ sourceError NOTIFY sourceErrorChanged)
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
+ Q_PROPERTY(QQmlListProperty<QDeclarativePluginParameter> parameters READ parameters REVISION 14)
Q_ENUMS(PositioningMethod)
+ Q_CLASSINFO("DefaultProperty", "parameters")
Q_INTERFACES(QQmlParserStatus)
public:
@@ -121,6 +124,8 @@ public:
PositioningMethods preferredPositioningMethods() const;
SourceError sourceError() const;
QGeoPositionInfoSource *positionSource() const;
+ QQmlListProperty<QDeclarativePluginParameter> parameters();
+ QVariantMap parameterMap() const;
// Virtuals from QQmlParserStatus
void classBegin() { }
@@ -149,10 +154,18 @@ private Q_SLOTS:
void socketConnected();
void socketError(QAbstractSocket::SocketError error);
void updateTimeoutReceived();
+ void onParameterInitialized();
private:
void setPosition(const QGeoPositionInfo &pi);
void setSource(QGeoPositionInfoSource *source);
+ bool parametersReady();
+ void tryAttach(const QString &name, bool useFallback = true);
+
+ static void parameter_append(QQmlListProperty<QDeclarativePluginParameter> *prop, QDeclarativePluginParameter *mapObject);
+ static int parameter_count(QQmlListProperty<QDeclarativePluginParameter> *prop);
+ static QDeclarativePluginParameter *parameter_at(QQmlListProperty<QDeclarativePluginParameter> *prop, int index);
+ static void parameter_clear(QQmlListProperty<QDeclarativePluginParameter> *prop);
QGeoPositionInfoSource *m_positionSource;
QDeclarativePosition m_position;
@@ -161,10 +174,14 @@ private:
QTcpSocket *m_nmeaSocket;
QString m_nmeaFileName;
QUrl m_nmeaSource;
+ QString m_providerName;
bool m_active;
bool m_singleUpdate;
int m_updateInterval;
SourceError m_sourceError;
+ QList<QDeclarativePluginParameter *> m_parameters;
+ bool m_componentComplete = false;
+ bool m_parametersInitialized = false;
};
QT_END_NAMESPACE