diff options
author | Paolo Angelelli <paolo.angelelli@qt.io> | 2017-05-30 15:26:45 +0200 |
---|---|---|
committer | Paolo Angelelli <paolo.angelelli@qt.io> | 2017-06-05 13:43:14 +0000 |
commit | 4417378dbb3a5b83c5c7a9563880b83ca0b52542 (patch) | |
tree | 36e9c3a81ba01cdf3041f5cd5778a6347339c150 | |
parent | 5c957221d0cca19a27abc9781c20c24f1c32030b (diff) | |
download | qtlocation-4417378dbb3a5b83c5c7a9563880b83ca0b52542.tar.gz |
Add mean to create qgeopath in locationsingleton
As currently there is no way to create a pre-filled qgeopath,
this patch adds an overload to QtPositioning.geopath() to pass
parameters to the constructor.
Change-Id: I05af4dbef07bd62e9e2eace7105b5255e8a392fa
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
-rw-r--r-- | src/imports/positioning/locationsingleton.cpp | 42 | ||||
-rw-r--r-- | src/imports/positioning/locationsingleton.h | 2 | ||||
-rw-r--r-- | tests/auto/declarative_geoshape/tst_locationsingleton.qml | 29 |
3 files changed, 73 insertions, 0 deletions
diff --git a/src/imports/positioning/locationsingleton.cpp b/src/imports/positioning/locationsingleton.cpp index a48c1a96..19b05761 100644 --- a/src/imports/positioning/locationsingleton.cpp +++ b/src/imports/positioning/locationsingleton.cpp @@ -39,6 +39,26 @@ #include "locationsingleton.h" +static QGeoCoordinate parseCoordinate(const QJSValue &value, bool *ok) +{ + QGeoCoordinate c; + + if (value.isObject()) { + if (value.hasProperty(QStringLiteral("latitude"))) + c.setLatitude(value.property(QStringLiteral("latitude")).toNumber()); + if (value.hasProperty(QStringLiteral("longitude"))) + c.setLongitude(value.property(QStringLiteral("longitude")).toNumber()); + if (value.hasProperty(QStringLiteral("altitude"))) + c.setAltitude(value.property(QStringLiteral("altitude")).toNumber()); + + if (ok) + *ok = true; + } + + return c; +} + + /*! \qmltype QtPositioning \instantiates LocationSingleton @@ -191,6 +211,28 @@ QGeoPath LocationSingleton::path() const return QGeoPath(); } +QGeoPath LocationSingleton::path(const QJSValue &value, qreal width) const +{ + QList<QGeoCoordinate> pathList; + + if (value.isArray()) { + quint32 length = value.property(QStringLiteral("length")).toUInt(); + for (quint32 i = 0; i < length; ++i) { + bool ok; + QGeoCoordinate c = parseCoordinate(value.property(i), &ok); + + if (!ok || !c.isValid()) { + pathList.clear(); // aborting + break; + } + + pathList.append(c); + } + } + + return QGeoPath(pathList, width); +} + /*! \qmlmethod geocircle QtPositioning::shapeToCircle(geoshape shape) const diff --git a/src/imports/positioning/locationsingleton.h b/src/imports/positioning/locationsingleton.h index 9a5320e0..4faf2738 100644 --- a/src/imports/positioning/locationsingleton.h +++ b/src/imports/positioning/locationsingleton.h @@ -47,6 +47,7 @@ #include <QtPositioning/QGeoRectangle> #include <QtPositioning/QGeoCircle> #include <QtPositioning/QGeoPath> +#include <QtQml/QJSValue> #include <QVariant> class LocationSingleton : public QObject @@ -73,6 +74,7 @@ public: Q_INVOKABLE QGeoCircle circle(const QGeoCoordinate ¢er, qreal radius = -1.0) const; Q_INVOKABLE QGeoPath path() const; + Q_INVOKABLE QGeoPath path(const QJSValue &value, qreal width = 0.0) const; Q_INVOKABLE QGeoCircle shapeToCircle(const QGeoShape &shape) const; Q_INVOKABLE QGeoRectangle shapeToRectangle(const QGeoShape &shape) const; diff --git a/tests/auto/declarative_geoshape/tst_locationsingleton.qml b/tests/auto/declarative_geoshape/tst_locationsingleton.qml index e38e4ec7..6ebee62a 100644 --- a/tests/auto/declarative_geoshape/tst_locationsingleton.qml +++ b/tests/auto/declarative_geoshape/tst_locationsingleton.qml @@ -71,6 +71,13 @@ Item { } } + property variant trace1 : [ QtPositioning.coordinate(43.773175, 11.255386), + QtPositioning.coordinate(43.773546 , 11.255372) ] + property variant trace2 : [ QtPositioning.coordinate(43.773175, 11.255386), + QtPositioning.coordinate(43.773546 , 11.255372), + QtPositioning.coordinate(43.77453 , 11.255734)] + + // coordinate unit square property variant bl: QtPositioning.coordinate(0, 0) property variant tl: QtPositioning.coordinate(1, 0) @@ -186,6 +193,28 @@ Item { rectangle = QtPositioning.shapeToRectangle(listBox) verify(rectangle.isValid) } + + function test_shape_path_conversions() { + var path = QtPositioning.shapeToPath(QtPositioning.shape()) + verify(!path.isValid) + path = QtPositioning.shapeToPath(QtPositioning.circle()) + verify(!path.isValid) + path = QtPositioning.shapeToPath(QtPositioning.circle(tl, 10000)) + verify(!path.isValid) + path = QtPositioning.shapeToPath(QtPositioning.rectangle()) + verify(!path.isValid) + path = QtPositioning.shapeToPath(QtPositioning.rectangle(tl, br)) + verify(!path.isValid) + + path = QtPositioning.shapeToPath(QtPositioning.path()) + verify(!path.isValid) + path = QtPositioning.shapeToPath(QtPositioning.path(trace1, 1)) + verify(path.isValid) + path = QtPositioning.shapeToPath(QtPositioning.path(trace2, 2)) + verify(path.isValid) + verify(path !== QtPositioning.shapeToPath(QtPositioning.path(trace1, 1))) + compare(path, QtPositioning.shapeToPath(QtPositioning.path(trace2, 2))) + } } |