summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron McCarthy <aaron.mccarthy@jollamobile.com>2014-01-06 13:44:16 +1000
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-07 09:24:21 +0100
commit5e8e9451d1f6c94d0242f60a48e4f154403f6ac1 (patch)
tree73dc6006e921246d214f4f52efa83b31efdfd695
parent28e6a10ca23df2f4dd5aee73c902e0bfbec2f6d6 (diff)
downloadqtlocation-5e8e9451d1f6c94d0242f60a48e4f154403f6ac1.tar.gz
Enhance measurement system support in routing manager.
It is useful to be able to set the measurement system independently of the locale used by the routing manager. Add accessor functions for the measurement system to the routing manager classes. Locale and measurement system properties are also added to the RouteModel QML type. Change-Id: I8ee9fbdb5ab94615fef7019914b0f104aebfa9c8 Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
-rw-r--r--src/imports/location/qdeclarativegeoroutemodel.cpp97
-rw-r--r--src/imports/location/qdeclarativegeoroutemodel_p.h11
-rw-r--r--src/location/maps/qgeoroutingmanager.cpp27
-rw-r--r--src/location/maps/qgeoroutingmanager.h10
-rw-r--r--src/location/maps/qgeoroutingmanagerengine.cpp30
-rw-r--r--src/location/maps/qgeoroutingmanagerengine.h10
-rw-r--r--src/location/maps/qgeoroutingmanagerengine_p.h1
-rw-r--r--src/plugins/geoservices/nokia/qgeoroutingmanagerengine_nokia.cpp6
-rw-r--r--tests/auto/qgeoroutingmanager/tst_qgeoroutingmanager.cpp18
9 files changed, 189 insertions, 21 deletions
diff --git a/src/imports/location/qdeclarativegeoroutemodel.cpp b/src/imports/location/qdeclarativegeoroutemodel.cpp
index f315cea2..2a792fe5 100644
--- a/src/imports/location/qdeclarativegeoroutemodel.cpp
+++ b/src/imports/location/qdeclarativegeoroutemodel.cpp
@@ -408,6 +408,103 @@ bool QDeclarativeGeoRouteModel::autoUpdate() const
}
/*!
+ \qmlproperty Locale QtLocation::RouteModel::locale
+
+ This property holds the locale which will be used when calculating the route. Setting this
+ property also sets the \l {QtLocation::RouteModel::measurementSystem}{measurementSystem}
+ property.
+*/
+void QDeclarativeGeoRouteModel::setLocale(const QLocale &locale)
+{
+ if (!plugin_) {
+ qmlInfo(this) << QCoreApplication::translate(CONTEXT_NAME, ROUTE_PLUGIN_NOT_SET);
+ return;
+ }
+
+ QGeoServiceProvider *serviceProvider = plugin_->sharedGeoServiceProvider();
+ if (!serviceProvider)
+ return;
+
+ QGeoRoutingManager *routingManager = serviceProvider->routingManager();
+ if (!routingManager) {
+ qmlInfo(this) << QCoreApplication::translate(CONTEXT_NAME, ROUTE_MGR_NOT_SET);
+ return;
+ }
+
+ if (routingManager->locale() == locale)
+ return;
+
+ routingManager->setLocale(locale);
+ emit localeChanged();
+}
+
+QLocale QDeclarativeGeoRouteModel::locale() const
+{
+ if (!plugin_)
+ return QLocale();
+
+ QGeoServiceProvider *serviceProvider = plugin_->sharedGeoServiceProvider();
+ if (!serviceProvider)
+ return QLocale();
+
+ QGeoRoutingManager *routingManager = serviceProvider->routingManager();
+ if (!routingManager) {
+ qmlInfo(this) << QCoreApplication::translate(CONTEXT_NAME, ROUTE_MGR_NOT_SET);
+ return QLocale();
+ }
+
+ return routingManager->locale();
+}
+
+/*!
+ \qmlproperty Locale::MeasurementSystem QtLocation::RouteModel::measurementSystem
+
+ This property holds the measurement system which will be used when calculating the route. This
+ property is changed when the \l {QtLocation::RouteModel::locale}{locale} property is changed.
+*/
+void QDeclarativeGeoRouteModel::setMeasurementSystem(QLocale::MeasurementSystem ms)
+{
+ if (!plugin_) {
+ qmlInfo(this) << QCoreApplication::translate(CONTEXT_NAME, ROUTE_PLUGIN_NOT_SET);
+ return;
+ }
+
+ QGeoServiceProvider *serviceProvider = plugin_->sharedGeoServiceProvider();
+ if (!serviceProvider)
+ return;
+
+ QGeoRoutingManager *routingManager = serviceProvider->routingManager();
+ if (!routingManager) {
+ qmlInfo(this) << QCoreApplication::translate(CONTEXT_NAME, ROUTE_MGR_NOT_SET);
+ return;
+ }
+
+ if (routingManager->measurementSystem() == ms)
+ return;
+
+ routingManager->setMeasurementSystem(ms);
+ emit measurementSystemChanged();
+}
+
+QLocale::MeasurementSystem QDeclarativeGeoRouteModel::measurementSystem() const
+{
+ if (!plugin_)
+ return QLocale().measurementSystem();
+
+ QGeoServiceProvider *serviceProvider = plugin_->sharedGeoServiceProvider();
+ if (!serviceProvider)
+ return QLocale().measurementSystem();
+
+ QGeoRoutingManager *routingManager = serviceProvider->routingManager();
+ if (!routingManager) {
+ qmlInfo(this) << QCoreApplication::translate(CONTEXT_NAME, ROUTE_MGR_NOT_SET);
+ return QLocale().measurementSystem();
+ }
+
+ return routingManager->measurementSystem();
+}
+
+/*!
\internal
*/
void QDeclarativeGeoRouteModel::setStatus(QDeclarativeGeoRouteModel::Status status)
diff --git a/src/imports/location/qdeclarativegeoroutemodel_p.h b/src/imports/location/qdeclarativegeoroutemodel_p.h
index 0d663eed..ebaf386a 100644
--- a/src/imports/location/qdeclarativegeoroutemodel_p.h
+++ b/src/imports/location/qdeclarativegeoroutemodel_p.h
@@ -77,6 +77,9 @@ class QDeclarativeGeoRouteModel : public QAbstractListModel, public QQmlParserSt
Q_PROPERTY(Status status READ status NOTIFY statusChanged)
Q_PROPERTY(QString errorString READ errorString NOTIFY errorStringChanged)
Q_PROPERTY(RouteError error READ error NOTIFY errorChanged)
+ Q_PROPERTY(QLocale locale READ locale WRITE setLocale NOTIFY localeChanged)
+ Q_PROPERTY(QLocale::MeasurementSystem measurementSystem READ measurementSystem WRITE setMeasurementSystem NOTIFY measurementSystemChanged)
+
Q_INTERFACES(QQmlParserStatus)
public:
@@ -121,6 +124,12 @@ public:
void setAutoUpdate(bool autoUpdate);
bool autoUpdate() const;
+ void setLocale(const QLocale &locale);
+ QLocale locale() const;
+
+ void setMeasurementSystem(QLocale::MeasurementSystem ms);
+ QLocale::MeasurementSystem measurementSystem() const;
+
Status status() const;
QString errorString() const;
RouteError error() const;
@@ -139,6 +148,8 @@ Q_SIGNALS:
void errorStringChanged();
void errorChanged();
void routesChanged();
+ void localeChanged();
+ void measurementSystemChanged();
public Q_SLOTS:
void update();
diff --git a/src/location/maps/qgeoroutingmanager.cpp b/src/location/maps/qgeoroutingmanager.cpp
index 5637a269..07af687b 100644
--- a/src/location/maps/qgeoroutingmanager.cpp
+++ b/src/location/maps/qgeoroutingmanager.cpp
@@ -347,6 +347,33 @@ QLocale QGeoRoutingManager::locale() const
}
/*!
+ Sets the measurement system used by this manager to \a system.
+
+ The measurement system can be set independently of the locale. Both setLocale() and this
+ function set the measurement system. The value set by the last function called will be used.
+
+ \sa measurementSystem(), locale(), setLocale()
+*/
+void QGeoRoutingManager::setMeasurementSystem(QLocale::MeasurementSystem system)
+{
+ d_ptr->engine->setMeasurementSystem(system);
+}
+
+/*!
+ Returns the measurement system used by this manager.
+
+ If setMeasurementSystem() has been called then the value returned by this function may be
+ different to that returned by locale().\l {QLocale::measurementSystem()}{measurementSystem()}.
+ In which case the value returned by this function is what will be used by the manager.
+
+ \sa setMeasurementSystem(), setLocale()
+*/
+QLocale::MeasurementSystem QGeoRoutingManager::measurementSystem() const
+{
+ return d_ptr->engine->measurementSystem();
+}
+
+/*!
\fn void QGeoRoutingManager::finished(QGeoRouteReply *reply)
This signal is emitted when \a reply has finished processing.
diff --git a/src/location/maps/qgeoroutingmanager.h b/src/location/maps/qgeoroutingmanager.h
index d9ff6816..72dfc370 100644
--- a/src/location/maps/qgeoroutingmanager.h
+++ b/src/location/maps/qgeoroutingmanager.h
@@ -42,22 +42,20 @@
#ifndef QGEOROUTINGMANAGER_H
#define QGEOROUTINGMANAGER_H
+#include <QtCore/QObject>
+#include <QtCore/QLocale>
#include <QtLocation/QGeoRouteRequest>
#include <QtLocation/QGeoRouteReply>
-#include <QObject>
-#include <QMap>
-
QT_BEGIN_NAMESPACE
-class QLocale;
-
class QGeoRoutingManagerEngine;
class QGeoRoutingManagerPrivate;
class Q_LOCATION_EXPORT QGeoRoutingManager : public QObject
{
Q_OBJECT
+
public:
~QGeoRoutingManager();
@@ -76,6 +74,8 @@ public:
void setLocale(const QLocale &locale);
QLocale locale() const;
+ void setMeasurementSystem(QLocale::MeasurementSystem system);
+ QLocale::MeasurementSystem measurementSystem() const;
Q_SIGNALS:
void finished(QGeoRouteReply *reply);
diff --git a/src/location/maps/qgeoroutingmanagerengine.cpp b/src/location/maps/qgeoroutingmanagerengine.cpp
index 8629bcb5..20a10164 100644
--- a/src/location/maps/qgeoroutingmanagerengine.cpp
+++ b/src/location/maps/qgeoroutingmanagerengine.cpp
@@ -347,6 +347,7 @@ QGeoRouteRequest::ManeuverDetails QGeoRoutingManagerEngine::supportedManeuverDet
void QGeoRoutingManagerEngine::setLocale(const QLocale &locale)
{
d_ptr->locale = locale;
+ d_ptr->measurementSystem = locale.measurementSystem();
}
/*!
@@ -359,6 +360,33 @@ QLocale QGeoRoutingManagerEngine::locale() const
}
/*!
+ Sets the measurement system used by this manager to \a system.
+
+ The measurement system can be set independently of the locale. Both setLocale() and this
+ function set the measurement system. The value set by the last function called will be used.
+
+ \sa measurementSystem(), locale(), setLocale()
+*/
+void QGeoRoutingManagerEngine::setMeasurementSystem(QLocale::MeasurementSystem system)
+{
+ d_ptr->measurementSystem = system;
+}
+
+/*!
+ Returns the measurement system used by this manager.
+
+ If setMeasurementSystem() has been called then the value returned by this function may be
+ different to that returned by locale().\l {QLocale::measurementSystem()}{measurementSystem()}.
+ In which case the value returned by this function is what will be used by the manager.
+
+ \sa setMeasurementSystem(), setLocale()
+*/
+QLocale::MeasurementSystem QGeoRoutingManagerEngine::measurementSystem() const
+{
+ return d_ptr->measurementSystem;
+}
+
+/*!
\fn void QGeoRoutingManagerEngine::finished(QGeoRouteReply *reply)
This signal is emitted when \a reply has finished processing.
@@ -391,7 +419,7 @@ Use deleteLater() instead.
*******************************************************************************/
QGeoRoutingManagerEnginePrivate::QGeoRoutingManagerEnginePrivate()
- : managerVersion(-1)
+: managerVersion(-1), measurementSystem(locale.measurementSystem())
{
}
diff --git a/src/location/maps/qgeoroutingmanagerengine.h b/src/location/maps/qgeoroutingmanagerengine.h
index fa05b984..71f3f77a 100644
--- a/src/location/maps/qgeoroutingmanagerengine.h
+++ b/src/location/maps/qgeoroutingmanagerengine.h
@@ -42,16 +42,14 @@
#ifndef QGEOROUTINGMANAGERENGINE_H
#define QGEOROUTINGMANAGERENGINE_H
+#include <QtCore/QObject>
+#include <QtCore/QMap>
+#include <QtCore/QLocale>
#include <QtLocation/QGeoRouteRequest>
#include <QtLocation/QGeoRouteReply>
-#include <QObject>
-#include <QMap>
-
QT_BEGIN_NAMESPACE
-class QLocale;
-
class QGeoRoutingManagerEnginePrivate;
class Q_LOCATION_EXPORT QGeoRoutingManagerEngine : public QObject
@@ -76,6 +74,8 @@ public:
void setLocale(const QLocale &locale);
QLocale locale() const;
+ void setMeasurementSystem(QLocale::MeasurementSystem system);
+ QLocale::MeasurementSystem measurementSystem() const;
Q_SIGNALS:
void finished(QGeoRouteReply *reply);
diff --git a/src/location/maps/qgeoroutingmanagerengine_p.h b/src/location/maps/qgeoroutingmanagerengine_p.h
index e868fad8..ad6f8660 100644
--- a/src/location/maps/qgeoroutingmanagerengine_p.h
+++ b/src/location/maps/qgeoroutingmanagerengine_p.h
@@ -77,6 +77,7 @@ public:
QGeoRouteRequest::ManeuverDetails supportedManeuverDetails;
QLocale locale;
+ QLocale::MeasurementSystem measurementSystem;
private:
Q_DISABLE_COPY(QGeoRoutingManagerEnginePrivate)
diff --git a/src/plugins/geoservices/nokia/qgeoroutingmanagerengine_nokia.cpp b/src/plugins/geoservices/nokia/qgeoroutingmanagerengine_nokia.cpp
index 9bd60155..53bdc3cd 100644
--- a/src/plugins/geoservices/nokia/qgeoroutingmanagerengine_nokia.cpp
+++ b/src/plugins/geoservices/nokia/qgeoroutingmanagerengine_nokia.cpp
@@ -442,14 +442,14 @@ QString QGeoRoutingManagerEngineNokia::routeRequestString(const QGeoRouteRequest
requestString += "&instructionformat=text";
- const QLocale loc(locale());
-
requestString += "&metricSystem=";
- if (QLocale::MetricSystem == loc.measurementSystem())
+ if (QLocale::MetricSystem == measurementSystem())
requestString += "metric";
else
requestString += "imperial";
+ const QLocale loc(locale());
+
if (QLocale::C != loc.language() && QLocale::AnyLanguage != loc.language()) {
requestString += "&language=";
requestString += loc.name();
diff --git a/tests/auto/qgeoroutingmanager/tst_qgeoroutingmanager.cpp b/tests/auto/qgeoroutingmanager/tst_qgeoroutingmanager.cpp
index cfff7bd2..f8315348 100644
--- a/tests/auto/qgeoroutingmanager/tst_qgeoroutingmanager.cpp
+++ b/tests/auto/qgeoroutingmanager/tst_qgeoroutingmanager.cpp
@@ -104,17 +104,21 @@ void tst_QGeoRoutingManager::supports()
void tst_QGeoRoutingManager::locale()
{
- QLocale *german = new QLocale(QLocale::German, QLocale::Germany);
- QLocale *english = new QLocale(QLocale::C, QLocale::AnyCountry);
+ QLocale german = QLocale(QLocale::German, QLocale::Germany);
+ QLocale english = QLocale(QLocale::C, QLocale::AnyCountry);
- qgeoroutingmanager->setLocale(*german);
+ qgeoroutingmanager->setLocale(german);
- QCOMPARE(qgeoroutingmanager->locale(), *german);
+ QCOMPARE(qgeoroutingmanager->locale(), german);
- QVERIFY(qgeoroutingmanager->locale() != *english);
+ QVERIFY(qgeoroutingmanager->locale() != english);
- delete german;
- delete english;
+ QLocale en_UK = QLocale(QLocale::English, QLocale::UnitedKingdom);
+ qgeoroutingmanager->setLocale(en_UK);
+ QCOMPARE(qgeoroutingmanager->measurementSystem(), en_UK.measurementSystem());
+ qgeoroutingmanager->setMeasurementSystem(QLocale::MetricSystem);
+ QCOMPARE(qgeoroutingmanager->measurementSystem(), QLocale::MetricSystem);
+ QVERIFY(qgeoroutingmanager->locale().measurementSystem() != qgeoroutingmanager->measurementSystem());
}
void tst_QGeoRoutingManager::name()