From ad7bcebc575922fc7c5654c118794e5758d347d2 Mon Sep 17 00:00:00 2001 From: Paolo Angelelli Date: Tue, 5 Feb 2019 19:42:22 +0100 Subject: Add departure time attribute to route queries So that it can be used to improve the route calculation based on traffic information or other time-based information (ferries etc.) Change-Id: I8bdc81046484cc4f0ebfaffbdf6f034c555d7781 Fixes: QTBUG-70503 Reviewed-by: BogDan Vatra --- src/imports/location/location.cpp | 3 +++ .../declarativemaps/qdeclarativegeoroutemodel.cpp | 25 ++++++++++++++++++++++ .../declarativemaps/qdeclarativegeoroutemodel_p.h | 5 +++++ src/location/maps/qgeorouterequest.cpp | 24 +++++++++++++++++++++ src/location/maps/qgeorouterequest.h | 4 ++++ src/location/maps/qgeorouterequest_p.h | 1 + tests/auto/declarative_core/tst_routing.qml | 13 +++++++++++ .../geotestplugin/qgeoroutingmanagerengine_test.h | 6 ++++++ .../auto/qgeorouterequest/tst_qgeorouterequest.cpp | 16 ++++++++++++++ tests/auto/qgeorouterequest/tst_qgeorouterequest.h | 2 ++ 10 files changed, 99 insertions(+) diff --git a/src/imports/location/location.cpp b/src/imports/location/location.cpp index dbedd1de..049d52c0 100644 --- a/src/imports/location/location.cpp +++ b/src/imports/location/location.cpp @@ -194,6 +194,9 @@ public: qmlRegisterType(uri, major, minor, "Route"); qmlRegisterType(uri, major, minor, "RouteLeg"); + minor = 13; + qmlRegisterType(uri, major, minor, "RouteQuery"); + // Register the latest Qt version as QML type version qmlRegisterModule(uri, QT_VERSION_MAJOR, QT_VERSION_MINOR); diff --git a/src/location/declarativemaps/qdeclarativegeoroutemodel.cpp b/src/location/declarativemaps/qdeclarativegeoroutemodel.cpp index 499f1c51..06a03791 100644 --- a/src/location/declarativemaps/qdeclarativegeoroutemodel.cpp +++ b/src/location/declarativemaps/qdeclarativegeoroutemodel.cpp @@ -1446,6 +1446,31 @@ QDeclarativeGeoRouteQuery::RouteOptimizations QDeclarativeGeoRouteQuery::routeOp return optimization; } +/*! + \qmlproperty date RouteQuery::departureTime + + The departure time to be used when querying for the route. + The default value is an invalid date, meaning no departure time will be used in the query. + + \since 5.13 +*/ +void QDeclarativeGeoRouteQuery::setDepartureTime(const QDateTime &departureTime) +{ + if (departureTime == request_.departureTime()) + return; + + request_.setDepartureTime(departureTime); + if (complete_) { + emit departureTimeChanged(); + emit queryDetailsChanged(); + } +} + +QDateTime QDeclarativeGeoRouteQuery::departureTime() const +{ + return request_.departureTime(); +} + void QDeclarativeGeoRouteQuery::setRouteOptimizations(QDeclarativeGeoRouteQuery::RouteOptimizations optimization) { QGeoRouteRequest::RouteOptimizations reqOptimizations; diff --git a/src/location/declarativemaps/qdeclarativegeoroutemodel_p.h b/src/location/declarativemaps/qdeclarativegeoroutemodel_p.h index afffc21a..39fd84d6 100644 --- a/src/location/declarativemaps/qdeclarativegeoroutemodel_p.h +++ b/src/location/declarativemaps/qdeclarativegeoroutemodel_p.h @@ -296,6 +296,7 @@ class Q_LOCATION_PRIVATE_EXPORT QDeclarativeGeoRouteQuery : public QObject, publ Q_PROPERTY(QJSValue excludedAreas READ excludedAreas WRITE setExcludedAreas NOTIFY excludedAreasChanged) Q_PROPERTY(QList featureTypes READ featureTypes NOTIFY featureTypesChanged) Q_PROPERTY(QVariantMap extraParameters READ extraParameters REVISION 11) + Q_PROPERTY(QDateTime departureTime READ departureTime WRITE setDepartureTime NOTIFY departureTimeChanged REVISION 13) Q_PROPERTY(QQmlListProperty quickChildren READ declarativeChildren DESIGNABLE false) Q_CLASSINFO("DefaultProperty", "quickChildren") Q_INTERFACES(QQmlParserStatus) @@ -409,6 +410,9 @@ public: void setRouteOptimizations(RouteOptimizations optimization); RouteOptimizations routeOptimizations() const; + void setDepartureTime(const QDateTime &departureTime); + QDateTime departureTime() const; + template QList quickChildren() const { @@ -435,6 +439,7 @@ Q_SIGNALS: void queryDetailsChanged(); Q_REVISION(11) void extraParametersChanged(); + void departureTimeChanged(); private Q_SLOTS: void excludedAreaCoordinateChanged(); diff --git a/src/location/maps/qgeorouterequest.cpp b/src/location/maps/qgeorouterequest.cpp index 57fbe207..412dc598 100644 --- a/src/location/maps/qgeorouterequest.cpp +++ b/src/location/maps/qgeorouterequest.cpp @@ -468,6 +468,30 @@ QGeoRouteRequest::ManeuverDetail QGeoRouteRequest::maneuverDetail() const return d_ptr->maneuverDetail; } +/*! + Sets the departure time for the route calculation. This information can be used by + the backend to calculate a faster route, for example by avoiding blockages present at + given points in time. + + The default value is an invalid \l QDateTime + + \since 5.13 +*/ +void QGeoRouteRequest::setDepartureTime(const QDateTime &departureTime) +{ + d_ptr->departureTime = departureTime; +} + +/*! + Returns the departure time in the request. + + \since 5.13 +*/ +QDateTime QGeoRouteRequest::departureTime() const +{ + return d_ptr->departureTime; +} + /*! Sets the extra parameters \a extraParameters for the route request. The format of the extra parameters is plugin specific, and documented per plugin. diff --git a/src/location/maps/qgeorouterequest.h b/src/location/maps/qgeorouterequest.h index 5a4bc61e..52057ce0 100644 --- a/src/location/maps/qgeorouterequest.h +++ b/src/location/maps/qgeorouterequest.h @@ -149,6 +149,10 @@ public: void setManeuverDetail(ManeuverDetail maneuverDetail); ManeuverDetail maneuverDetail() const; + // defaults to invalid datetime + void setDepartureTime(const QDateTime &departureTime); + QDateTime departureTime() const; + void setExtraParameters(const QVariantMap &extraParameters); QVariantMap extraParameters() const; diff --git a/src/location/maps/qgeorouterequest_p.h b/src/location/maps/qgeorouterequest_p.h index df0cd62c..71c8b58b 100644 --- a/src/location/maps/qgeorouterequest_p.h +++ b/src/location/maps/qgeorouterequest_p.h @@ -77,6 +77,7 @@ public: QGeoRouteRequest::RouteOptimizations routeOptimization; QGeoRouteRequest::SegmentDetail segmentDetail; QGeoRouteRequest::ManeuverDetail maneuverDetail; + QDateTime departureTime; QVariantMap extraParameters; }; diff --git a/tests/auto/declarative_core/tst_routing.qml b/tests/auto/declarative_core/tst_routing.qml index f5204f26..1d7c1e37 100644 --- a/tests/auto/declarative_core/tst_routing.qml +++ b/tests/auto/declarative_core/tst_routing.qml @@ -929,6 +929,19 @@ Item { compare (spy.count, 21) compare(model.get(0).path.length, 3); + // departure time + verify(!model.get(0).extendedAttributes["tst_departureTime"]) + var invalidDate = new Date("abc"); // to create an invalid date + var validDate = new Date("2011-02-07T11:05:00"); + + filledRouteQuery2.departureTime = validDate + tryCompare(spy, "count", 22) + compare(model.get(0).extendedAttributes["tst_departureTime"], validDate) + + filledRouteQuery2.departureTime = invalidDate + tryCompare (spy, "count", 23) + verify(!model.get(0).extendedAttributes["tst_departureTime"]) + // ReSetting filledRouteQuery.numberAlternativeRoutes = 0 filledRouteQuery2.numberAlternativeRoutes = 0 diff --git a/tests/auto/geotestplugin/qgeoroutingmanagerengine_test.h b/tests/auto/geotestplugin/qgeoroutingmanagerengine_test.h index 7a6d6cec..daf7a87d 100644 --- a/tests/auto/geotestplugin/qgeoroutingmanagerengine_test.h +++ b/tests/auto/geotestplugin/qgeoroutingmanagerengine_test.h @@ -187,6 +187,12 @@ public: } } + if (request.departureTime().isValid()) { + QVariantMap extendedAttributes = route.extendedAttributes(); + extendedAttributes["tst_departureTime"] = request.departureTime(); + route.setExtendedAttributes(extendedAttributes); + } + routes.append(route); } reply->callSetRoutes(routes); diff --git a/tests/auto/qgeorouterequest/tst_qgeorouterequest.cpp b/tests/auto/qgeorouterequest/tst_qgeorouterequest.cpp index d29e3d49..7f56689c 100644 --- a/tests/auto/qgeorouterequest/tst_qgeorouterequest.cpp +++ b/tests/auto/qgeorouterequest/tst_qgeorouterequest.cpp @@ -348,4 +348,20 @@ void tst_QGeoRouteRequest::extraParameters() QCOMPARE(qgeorouterequest->extraParameters(), emptyParams); } +void tst_QGeoRouteRequest::departureTime_data() +{ + QTest::addColumn("departureTime"); + + QTest::newRow("Invalid") << QDateTime(); + QTest::newRow("date1") << QDateTime(QDate(2012, 7, 6), QTime(23, 55, 0)); + QTest::newRow("date2") << QDateTime(QDate(2012, 7, 7), QTime(0, 5, 0)); +} + +void tst_QGeoRouteRequest::departureTime() +{ + QFETCH(QDateTime , departureTime); + qgeorouterequest->setDepartureTime(departureTime); + QCOMPARE(qgeorouterequest->departureTime(), departureTime); +} + QTEST_APPLESS_MAIN(tst_QGeoRouteRequest); diff --git a/tests/auto/qgeorouterequest/tst_qgeorouterequest.h b/tests/auto/qgeorouterequest/tst_qgeorouterequest.h index 12506cf6..ee10233d 100644 --- a/tests/auto/qgeorouterequest/tst_qgeorouterequest.h +++ b/tests/auto/qgeorouterequest/tst_qgeorouterequest.h @@ -74,6 +74,8 @@ private Q_SLOTS: void featureWeight_data(); void extraParameters(); void extraParameters_data(); + void departureTime(); + void departureTime_data(); //End Unit Test for QGeoRouteRequest private: -- cgit v1.2.1