diff options
author | Aaron McCarthy <aaron.mccarthy@jollamobile.com> | 2014-02-07 11:57:53 +1000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-02-10 00:42:48 +0100 |
commit | ed14a2d2654d5de7ff1f8059fe576acf10f66b28 (patch) | |
tree | 83a0beefec3ddd8d48efe0be880e7555e15315b7 | |
parent | 20ee891ec034783b09c698916fbfc2127f92c803 (diff) | |
download | qtlocation-ed14a2d2654d5de7ff1f8059fe576acf10f66b28.tar.gz |
Simplify property change logic in Position type.
Removes all member variables and replaces them with a QGeoPositionInfo.
Uses the same value changed and validity changed logic for all
properties.
Change-Id: Ic0420ce7a26da2db12c3eabcad4beac83ea332fe
Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
-rw-r--r-- | src/imports/positioning/qdeclarativeposition.cpp | 320 | ||||
-rw-r--r-- | src/imports/positioning/qdeclarativeposition_p.h | 31 | ||||
-rw-r--r-- | src/imports/positioning/qdeclarativepositionsource.cpp | 13 |
3 files changed, 149 insertions, 215 deletions
diff --git a/src/imports/positioning/qdeclarativeposition.cpp b/src/imports/positioning/qdeclarativeposition.cpp index e52c4c2c..b667cbe6 100644 --- a/src/imports/positioning/qdeclarativeposition.cpp +++ b/src/imports/positioning/qdeclarativeposition.cpp @@ -1,5 +1,7 @@ /**************************************************************************** ** +** Copyright (C) 2014 Jolla Ltd. +** Contact: Aaron McCarthy <aaron.mccarthy@jollamobile.com> ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** @@ -80,14 +82,35 @@ QT_BEGIN_NAMESPACE \l{flickr}{Flickr} example application. \sa PositionSource, coordinate - */ +namespace +{ + +bool equalOrNaN(double a, double b) +{ + return a == b || (qIsNaN(a) && qIsNaN(b)); +} + +bool equalOrNaN(float a, float b) +{ + return a == b || (qIsNaN(a) && qIsNaN(b)); +} + +bool exclusiveNaN(double a, double b) +{ + return qIsNaN(a) != qIsNaN(b); +} + +bool exclusiveNaN(float a, float b) +{ + return qIsNaN(a) != qIsNaN(b); +} + +} + QDeclarativePosition::QDeclarativePosition(QObject *parent) -: QObject(parent), m_latitudeValid(false), m_longitudeValid(false), m_altitudeValid(false), - m_speed(-1), m_speedValid(false), m_direction(qQNaN()), m_verticalSpeed(qQNaN()), - m_horizontalAccuracyValid(false), m_verticalAccuracyValid(false), m_horizontalAccuracy(-1), - m_verticalAccuracy(-1) +: QObject(parent) { } @@ -95,6 +118,88 @@ QDeclarativePosition::~QDeclarativePosition() { } +void QDeclarativePosition::setPosition(const QGeoPositionInfo &info) +{ + // timestamp + const QDateTime pTimestamp = m_info.timestamp(); + const QDateTime timestamp = info.timestamp(); + bool emitTimestampChanged = pTimestamp != timestamp; + + // coordinate + const QGeoCoordinate pCoordinate = m_info.coordinate(); + const QGeoCoordinate coordinate = info.coordinate(); + bool emitCoordinateChanged = pCoordinate != coordinate; + bool emitLatitudeValidChanged = exclusiveNaN(pCoordinate.latitude(), coordinate.latitude()); + bool emitLongitudeValidChanged = exclusiveNaN(pCoordinate.longitude(), coordinate.longitude()); + bool emitAltitudeValidChanged = exclusiveNaN(pCoordinate.altitude(), coordinate.altitude()); + + // direction + const qreal pDirection = m_info.attribute(QGeoPositionInfo::Direction); + const qreal direction = info.attribute(QGeoPositionInfo::Direction); + bool emitDirectionChanged = !equalOrNaN(pDirection, direction); + bool emitDirectionValidChanged = exclusiveNaN(pDirection, direction); + + // ground speed + const qreal pSpeed = m_info.attribute(QGeoPositionInfo::GroundSpeed); + const qreal speed = info.attribute(QGeoPositionInfo::GroundSpeed); + bool emitSpeedChanged = !equalOrNaN(pSpeed, speed); + bool emitSpeedValidChanged = exclusiveNaN(pSpeed, speed); + + // vertical speed + const qreal pVerticalSpeed = m_info.attribute(QGeoPositionInfo::VerticalSpeed); + const qreal verticalSpeed = info.attribute(QGeoPositionInfo::VerticalSpeed); + bool emitVerticalSpeedChanged = !equalOrNaN(pVerticalSpeed, verticalSpeed); + bool emitVerticalSpeedValidChanged = exclusiveNaN(pVerticalSpeed, verticalSpeed); + + // magnetic variation + // not in QML API + + // horizontal accuracy + const qreal pHorizontalAccuracy = m_info.attribute(QGeoPositionInfo::HorizontalAccuracy); + const qreal horizontalAccuracy = info.attribute(QGeoPositionInfo::HorizontalAccuracy); + bool emitHorizontalAccuracyChanged = !equalOrNaN(pHorizontalAccuracy, horizontalAccuracy); + bool emitHorizontalAccuracyValidChanged = exclusiveNaN(pHorizontalAccuracy, horizontalAccuracy); + + // vertical accuracy + const qreal pVerticalAccuracy = m_info.attribute(QGeoPositionInfo::VerticalAccuracy); + const qreal verticalAccuracy = info.attribute(QGeoPositionInfo::VerticalAccuracy); + bool emitVerticalAccuracyChanged = !equalOrNaN(pVerticalAccuracy, verticalAccuracy); + bool emitVerticalAccuracyValidChanged = exclusiveNaN(pVerticalAccuracy, verticalAccuracy); + + m_info = info; + + if (emitTimestampChanged) + emit timestampChanged(); + if (emitCoordinateChanged) + emit coordinateChanged(); + if (emitLatitudeValidChanged) + emit latitudeValidChanged(); + if (emitLongitudeValidChanged) + emit longitudeValidChanged(); + if (emitAltitudeValidChanged) + emit altitudeValidChanged(); + if (emitDirectionChanged) + emit directionChanged(); + if (emitDirectionValidChanged) + emit directionValidChanged(); + if (emitSpeedChanged) + emit speedChanged(); + if (emitSpeedValidChanged) + emit speedValidChanged(); + if (emitVerticalSpeedChanged) + emit verticalSpeedChanged(); + if (emitVerticalSpeedValidChanged) + emit verticalSpeedValidChanged(); + if (emitHorizontalAccuracyChanged) + emit horizontalAccuracyChanged(); + if (emitHorizontalAccuracyValidChanged) + emit horizontalAccuracyValidChanged(); + if (emitVerticalAccuracyChanged) + emit verticalAccuracyChanged(); + if (emitVerticalAccuracyValidChanged) + emit verticalAccuracyValidChanged(); +} + /*! \qmlproperty coordinate Position::coordinate @@ -104,46 +209,9 @@ QDeclarativePosition::~QDeclarativePosition() \sa longitudeValid, latitudeValid, altitudeValid */ - -void QDeclarativePosition::setCoordinate(const QGeoCoordinate &coordinate) -{ - if (m_coordinate == coordinate) - return; - - m_coordinate = coordinate; - - if (coordinate.type() == QGeoCoordinate::Coordinate3D && !m_altitudeValid) { - m_altitudeValid = true; - emit altitudeValidChanged(); - } else if (m_altitudeValid) { - m_altitudeValid = false; - emit altitudeValidChanged(); - } - if (coordinate.isValid()) { - if (!m_longitudeValid) { - m_longitudeValid = true; - emit longitudeValidChanged(); - } - if (!m_latitudeValid) { - m_latitudeValid = true; - emit latitudeValidChanged(); - } - } else { - if (m_longitudeValid) { - m_longitudeValid = false; - emit longitudeValidChanged(); - } - if (m_latitudeValid) { - m_latitudeValid = false; - emit latitudeValidChanged(); - } - } - emit coordinateChanged(); -} - QGeoCoordinate QDeclarativePosition::coordinate() { - return m_coordinate; + return m_info.coordinate(); } /*! @@ -154,12 +222,10 @@ QGeoCoordinate QDeclarativePosition::coordinate() does not necessarily contain all data). \sa coordinate - */ - bool QDeclarativePosition::isLatitudeValid() const { - return m_latitudeValid; + return !qIsNaN(m_info.coordinate().latitude()); } @@ -171,12 +237,10 @@ bool QDeclarativePosition::isLatitudeValid() const does not necessarily contain all data). \sa coordinate - */ - bool QDeclarativePosition::isLongitudeValid() const { - return m_longitudeValid; + return !qIsNaN(m_info.coordinate().longitude()); } @@ -188,12 +252,10 @@ bool QDeclarativePosition::isLongitudeValid() const does not necessarily contain all data). \sa speed - */ - bool QDeclarativePosition::isSpeedValid() const { - return m_speedValid; + return !qIsNaN(m_info.attribute(QGeoPositionInfo::GroundSpeed)); } /*! @@ -204,12 +266,10 @@ bool QDeclarativePosition::isSpeedValid() const does not necessarily contain all data). \sa coordinate - */ - bool QDeclarativePosition::isAltitudeValid() const { - return m_altitudeValid; + return !qIsNaN(m_info.coordinate().altitude()); } /*! @@ -221,25 +281,9 @@ bool QDeclarativePosition::isAltitudeValid() const \sa speedValid, coordinate */ - -void QDeclarativePosition::setSpeed(double speed) -{ - if (speed == m_speed) - return; - m_speed = speed; - if (!m_speedValid && !qIsNaN(speed)) { - m_speedValid = true; - emit speedValidChanged(); - } else if (m_speedValid && qIsNaN(speed)) { - m_speedValid = false; - emit speedValidChanged(); - } - emit speedChanged(); -} - double QDeclarativePosition::speed() const { - return m_speed; + return m_info.attribute(QGeoPositionInfo::GroundSpeed); } /*! @@ -249,25 +293,24 @@ double QDeclarativePosition::speed() const \sa horizontalAccuracyValid, coordinate */ - void QDeclarativePosition::setHorizontalAccuracy(qreal horizontalAccuracy) { - if (horizontalAccuracy == m_horizontalAccuracy) + const qreal pHorizontalAccuracy = m_info.attribute(QGeoPositionInfo::HorizontalAccuracy); + + if (equalOrNaN(pHorizontalAccuracy, horizontalAccuracy)) return; - m_horizontalAccuracy = horizontalAccuracy; - if (!m_horizontalAccuracyValid && !qIsNaN(horizontalAccuracy)) { - m_horizontalAccuracyValid = true; - emit horizontalAccuracyValidChanged(); - } else if (m_horizontalAccuracyValid && qIsNaN(horizontalAccuracy)) { - m_horizontalAccuracyValid = false; - emit horizontalAccuracyValidChanged(); - } + + bool validChanged = exclusiveNaN(pHorizontalAccuracy, horizontalAccuracy); + + m_info.setAttribute(QGeoPositionInfo::HorizontalAccuracy, horizontalAccuracy); emit horizontalAccuracyChanged(); + if (validChanged) + emit horizontalAccuracyValidChanged(); } qreal QDeclarativePosition::horizontalAccuracy() const { - return m_horizontalAccuracy; + return m_info.attribute(QGeoPositionInfo::HorizontalAccuracy); } /*! @@ -278,12 +321,10 @@ qreal QDeclarativePosition::horizontalAccuracy() const does not necessarily contain all data). \sa horizontalAccuracy - */ - bool QDeclarativePosition::isHorizontalAccuracyValid() const { - return m_horizontalAccuracyValid; + return !qIsNaN(m_info.attribute(QGeoPositionInfo::HorizontalAccuracy)); } /*! @@ -293,25 +334,24 @@ bool QDeclarativePosition::isHorizontalAccuracyValid() const \sa verticalAccuracyValid, coordinate */ - void QDeclarativePosition::setVerticalAccuracy(qreal verticalAccuracy) { - if (verticalAccuracy == m_verticalAccuracy) + const qreal pVerticalAccuracy = m_info.attribute(QGeoPositionInfo::VerticalAccuracy); + + if (equalOrNaN(pVerticalAccuracy, verticalAccuracy)) return; - m_verticalAccuracy = verticalAccuracy; - if (!m_verticalAccuracyValid && !qIsNaN(verticalAccuracy)) { - m_verticalAccuracyValid = true; - emit verticalAccuracyValidChanged(); - } else if (m_verticalAccuracyValid && qIsNaN(verticalAccuracy)) { - m_verticalAccuracyValid = false; - emit verticalAccuracyValidChanged(); - } + + bool validChanged = exclusiveNaN(pVerticalAccuracy, verticalAccuracy); + + m_info.setAttribute(QGeoPositionInfo::VerticalAccuracy, verticalAccuracy); emit verticalAccuracyChanged(); + if (validChanged) + emit verticalAccuracyValidChanged(); } qreal QDeclarativePosition::verticalAccuracy() const { - return m_verticalAccuracy; + return m_info.attribute(QGeoPositionInfo::VerticalAccuracy); } /*! @@ -322,12 +362,10 @@ qreal QDeclarativePosition::verticalAccuracy() const does not necessarily contain all data). \sa verticalAccuracy - */ - bool QDeclarativePosition::isVerticalAccuracyValid() const { - return m_verticalAccuracyValid; + return !qIsNaN(m_info.attribute(QGeoPositionInfo::VerticalAccuracy)); } /*! @@ -338,18 +376,9 @@ bool QDeclarativePosition::isVerticalAccuracyValid() const It is a read-only property. */ - -void QDeclarativePosition::setTimestamp(const QDateTime ×tamp) -{ - if (timestamp == m_timestamp) - return; - m_timestamp = timestamp; - emit timestampChanged(); -} - QDateTime QDeclarativePosition::timestamp() const { - return m_timestamp; + return m_info.timestamp(); } /*! @@ -363,7 +392,7 @@ QDateTime QDeclarativePosition::timestamp() const */ bool QDeclarativePosition::isDirectionValid() const { - return !qIsNaN(m_direction); + return !qIsNaN(m_info.attribute(QGeoPositionInfo::Direction)); } /*! @@ -378,20 +407,7 @@ bool QDeclarativePosition::isDirectionValid() const */ double QDeclarativePosition::direction() const { - return m_direction; -} - -void QDeclarativePosition::setDirection(double direction) -{ - if (m_direction == direction || (qIsNaN(m_direction) && qIsNaN(direction))) - return; - - bool validChanged = qIsNaN(m_direction) || qIsNaN(direction); - - m_direction = direction; - emit directionChanged(); - if (validChanged) - emit directionValidChanged(); + return m_info.attribute(QGeoPositionInfo::Direction); } /*! @@ -405,7 +421,7 @@ void QDeclarativePosition::setDirection(double direction) */ bool QDeclarativePosition::isVerticalSpeedValid() const { - return !qIsNaN(m_verticalSpeed); + return !qIsNaN(m_info.attribute(QGeoPositionInfo::VerticalSpeed)); } /*! @@ -420,57 +436,7 @@ bool QDeclarativePosition::isVerticalSpeedValid() const */ double QDeclarativePosition::verticalSpeed() const { - return m_verticalSpeed; -} - -void QDeclarativePosition::setVerticalSpeed(double speed) -{ - if (m_verticalSpeed == speed || (qIsNaN(m_verticalSpeed) && qIsNaN(speed))) - return; - - bool validChanged = qIsNaN(m_verticalSpeed) || qIsNaN(speed); - - m_verticalSpeed = speed; - emit verticalSpeedChanged(); - if (validChanged) - emit verticalSpeedValidChanged(); -} - -void QDeclarativePosition::invalidate() -{ - // Invalidate all data - if (m_latitudeValid) { - m_latitudeValid = false; - emit latitudeValidChanged(); - } - if (m_longitudeValid) { - m_longitudeValid = false; - emit longitudeValidChanged(); - } - if (m_altitudeValid) { - m_altitudeValid = false; - emit altitudeValidChanged(); - } - if (m_speedValid) { - m_speedValid = false; - emit speedValidChanged(); - } - if (m_horizontalAccuracyValid) { - m_horizontalAccuracyValid = false; - emit horizontalAccuracyValidChanged(); - } - if (m_verticalAccuracyValid) { - m_verticalAccuracyValid = false; - emit verticalAccuracyValidChanged(); - } - if (!qIsNaN(m_direction)) { - m_direction = qQNaN(); - emit directionValidChanged(); - } - if (!qIsNaN(m_verticalSpeed)) { - m_verticalSpeed = qQNaN(); - emit verticalSpeedValidChanged(); - } + return m_info.attribute(QGeoPositionInfo::VerticalSpeed); } #include "moc_qdeclarativeposition_p.cpp" diff --git a/src/imports/positioning/qdeclarativeposition_p.h b/src/imports/positioning/qdeclarativeposition_p.h index f109b7a7..d9235368 100644 --- a/src/imports/positioning/qdeclarativeposition_p.h +++ b/src/imports/positioning/qdeclarativeposition_p.h @@ -1,5 +1,7 @@ /**************************************************************************** ** +** Copyright (C) 2014 Jolla Ltd. +** Contact: Aaron McCarthy <aaron.mccarthy@jollamobile.com> ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** @@ -47,18 +49,12 @@ #include <QtQml/qqml.h> #include <QtPositioning/QGeoPositionInfo> -// Define this to get qDebug messages -// #define QDECLARATIVE_POSITION_DEBUG - -#ifdef QDECLARATIVE_POSITION_DEBUG -#include <QDebug> -#endif - QT_BEGIN_NAMESPACE class QDeclarativePosition : public QObject { Q_OBJECT + Q_PROPERTY(bool latitudeValid READ isLatitudeValid NOTIFY latitudeValidChanged) Q_PROPERTY(bool longitudeValid READ isLongitudeValid NOTIFY longitudeValidChanged) Q_PROPERTY(bool altitudeValid READ isAltitudeValid NOTIFY altitudeValidChanged) @@ -77,7 +73,6 @@ class QDeclarativePosition : public QObject Q_PROPERTY(double verticalSpeed READ verticalSpeed NOTIFY verticalSpeedChanged REVISION 1) public: - explicit QDeclarativePosition(QObject *parent = 0); ~QDeclarativePosition(); @@ -85,9 +80,7 @@ public: bool isLongitudeValid() const; bool isAltitudeValid() const; QDateTime timestamp() const; - void setTimestamp(const QDateTime ×tamp); double speed() const; - void setSpeed(double speed); bool isSpeedValid() const; QGeoCoordinate coordinate(); bool isHorizontalAccuracyValid() const; @@ -105,9 +98,7 @@ public: double verticalSpeed() const; void setVerticalSpeed(double speed); - // C++ - void setCoordinate(const QGeoCoordinate &coordinate); - void invalidate(); + void setPosition(const QGeoPositionInfo &info); Q_SIGNALS: void latitudeValidChanged(); @@ -128,19 +119,7 @@ Q_SIGNALS: Q_REVISION(1) void verticalSpeedChanged(); private: - bool m_latitudeValid; - bool m_longitudeValid; - bool m_altitudeValid; - QDateTime m_timestamp; - double m_speed; - bool m_speedValid; - double m_direction; - double m_verticalSpeed; - bool m_horizontalAccuracyValid; - bool m_verticalAccuracyValid; - qreal m_horizontalAccuracy; - qreal m_verticalAccuracy; - QGeoCoordinate m_coordinate; + QGeoPositionInfo m_info; }; QT_END_NAMESPACE diff --git a/src/imports/positioning/qdeclarativepositionsource.cpp b/src/imports/positioning/qdeclarativepositionsource.cpp index 317f03c7..fe2a3e56 100644 --- a/src/imports/positioning/qdeclarativepositionsource.cpp +++ b/src/imports/positioning/qdeclarativepositionsource.cpp @@ -371,18 +371,7 @@ void QDeclarativePositionSource::socketError(QAbstractSocket::SocketError error) void QDeclarativePositionSource::setPosition(const QGeoPositionInfo &pi) { - if (pi.isValid()) { - m_position.setTimestamp(pi.timestamp()); - m_position.setCoordinate(pi.coordinate()); - m_position.setSpeed(pi.attribute(QGeoPositionInfo::GroundSpeed)); - m_position.setDirection(pi.attribute(QGeoPositionInfo::Direction)); - m_position.setVerticalSpeed(pi.attribute(QGeoPositionInfo::VerticalSpeed)); - m_position.setHorizontalAccuracy(pi.attribute(QGeoPositionInfo::HorizontalAccuracy)); - m_position.setVerticalAccuracy(pi.attribute(QGeoPositionInfo::VerticalAccuracy)); - } else { - m_position.invalidate(); - } - + m_position.setPosition(pi); emit positionChanged(); } |