From eb3143f22ca1642056d821b73af493cdab59dd85 Mon Sep 17 00:00:00 2001 From: Paolo Angelelli Date: Thu, 25 Oct 2018 11:49:34 +0200 Subject: Move qquickcoordinateanimation to positioningquick So plugins can use it, also stand alone ones, and no ugly "import ../" anymore. Change-Id: I4e53815e041e13d495026d60a826a31bccaef2b4 Reviewed-by: Alex Blasche Reviewed-by: Bramastyo Harimukti Santoso --- src/imports/positioning/positioning.cpp | 2 +- .../positioning/qquickgeocoordinateanimation.cpp | 297 --------------------- .../positioning/qquickgeocoordinateanimation_p.h | 99 ------- .../positioning/qquickgeocoordinateanimation_p_p.h | 69 ----- src/location/declarativemaps/declarativemaps.pri | 8 +- .../declarativemaps/qquickgeomapgesturearea.cpp | 2 +- .../qquickgeocoordinateanimation.cpp | 297 +++++++++++++++++++++ .../qquickgeocoordinateanimation_p.h | 100 +++++++ .../qquickgeocoordinateanimation_p_p.h | 69 +++++ 9 files changed, 471 insertions(+), 472 deletions(-) delete mode 100644 src/imports/positioning/qquickgeocoordinateanimation.cpp delete mode 100644 src/imports/positioning/qquickgeocoordinateanimation_p.h delete mode 100644 src/imports/positioning/qquickgeocoordinateanimation_p_p.h create mode 100644 src/positioningquick/qquickgeocoordinateanimation.cpp create mode 100644 src/positioningquick/qquickgeocoordinateanimation_p.h create mode 100644 src/positioningquick/qquickgeocoordinateanimation_p_p.h diff --git a/src/imports/positioning/positioning.cpp b/src/imports/positioning/positioning.cpp index 08ce384b..a3cb98fa 100644 --- a/src/imports/positioning/positioning.cpp +++ b/src/imports/positioning/positioning.cpp @@ -45,7 +45,7 @@ #include #include -#include "qquickgeocoordinateanimation_p.h" +#include #include "locationsingleton.h" #include diff --git a/src/imports/positioning/qquickgeocoordinateanimation.cpp b/src/imports/positioning/qquickgeocoordinateanimation.cpp deleted file mode 100644 index b00f187d..00000000 --- a/src/imports/positioning/qquickgeocoordinateanimation.cpp +++ /dev/null @@ -1,297 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtPositioning module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qquickgeocoordinateanimation_p.h" -#include "qquickgeocoordinateanimation_p_p.h" -#include -#include -#include -#include - -QT_BEGIN_NAMESPACE - -/*! - \qmltype CoordinateAnimation - \instantiates QQuickGeoCoordinateAnimation - \inherits PropertyAnimation - \inqmlmodule QtPositioning - \since 5.3 - - \brief A PropertyAnimation for geo coordinate properties. - - A specialized \l{PropertyAnimation} that defines an animation - between two \l{coordinate}{coordinates}. - - By default, a \l{latitude} of the \l{coordinate} is animated in the direction of shortest - (geodesic) distance between those coordinates. Since CoordinateAnimation uses Mercator - map projection, the \l{latitude} animation is always between -90 and 90 degrees. - The \l{longitude} animation path is not limited and can go over 180 degrees - in both west and east directions. - - The \l{direction} property can be set to specify the direction in which the \l{longitude} - animation should occur. - - \sa {Animation and Transitions in Qt Quick} -*/ - -QVariant q_coordinateInterpolator(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress) -{ - if (from == to) { - if (progress < 0.5) { - return QVariant::fromValue(from); - } else { - return QVariant::fromValue(to); - } - } - - QGeoCoordinate result = QWebMercator::coordinateInterpolation(from, to, progress); - - return QVariant::fromValue(result); -} - -QVariant q_coordinateShortestInterpolator(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress) -{ - const QGeoMercatorCoordinatePrivate* fromMercator = - static_cast(QGeoCoordinatePrivate::get(&from)); - const QGeoMercatorCoordinatePrivate* toMercator = - static_cast(QGeoCoordinatePrivate::get(&to)); - - double toX = toMercator->m_mercatorX; - double toY = toMercator->m_mercatorY; - double fromX = fromMercator->m_mercatorX; - double fromY = fromMercator->m_mercatorY; - double x; - if (0.5 < qAbs(toX - fromX)) { - // handle dateline crossing - double ex = toX; - double sx = fromX; - if (ex < sx) - sx -= 1.0; - else if (sx < ex) - ex -= 1.0; - - x = fromX + (toX - fromX) * progress; - - if (x < 0.0) - x += 1.0; - - } else { - x = fromX + (toX - fromX) * progress; - } - - double y = fromY + (toY - fromY) * progress; - - QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y)); - result.setAltitude(from.altitude() + (to.altitude() - from.altitude()) * progress); - return QVariant::fromValue(result); -} - -QVariant q_coordinateWestInterpolator(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress) -{ - const QGeoMercatorCoordinatePrivate* fromMercator = - static_cast(QGeoCoordinatePrivate::get(&from)); - const QGeoMercatorCoordinatePrivate* toMercator = - static_cast(QGeoCoordinatePrivate::get(&to)); - - double toX = toMercator->m_mercatorX; - double toY = toMercator->m_mercatorY; - double fromX = fromMercator->m_mercatorX; - double fromY = fromMercator->m_mercatorY; - double diff = toX - fromX; - - while (diff < 0.0) { - toX += 1.0; - diff += 1.0; - } - - double x = fromX + (toX - fromX) * progress; - double y = fromY + (toY - fromY) * progress; - - while (x > 1.0) - x -= 1.0; - - QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y)); - result.setAltitude(from.altitude() + (to.altitude() - from.altitude()) * progress); - - return QVariant::fromValue(result); -} - -QVariant q_coordinateEastInterpolator(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress) -{ - const QGeoMercatorCoordinatePrivate* fromMercator = - static_cast(QGeoCoordinatePrivate::get(&from)); - const QGeoMercatorCoordinatePrivate* toMercator = - static_cast(QGeoCoordinatePrivate::get(&to)); - - double toX = toMercator->m_mercatorX; - double toY = toMercator->m_mercatorY; - double fromX = fromMercator->m_mercatorX; - double fromY = fromMercator->m_mercatorY; - double diff = toX - fromX; - - while (diff > 0.0) { - toX -= 1.0; - diff -= 1.0; - } - - double x = fromX + (toX - fromX) * progress; - double y = fromY + (toY - fromY) * progress; - - while (x < 0.0) - x += 1.0; - - QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y)); - result.setAltitude(from.altitude() + (to.altitude() - from.altitude()) * progress); - - return QVariant::fromValue(result); -} - -QQuickGeoCoordinateAnimation::QQuickGeoCoordinateAnimation(QObject *parent) - : QQuickPropertyAnimation(*(new QQuickGeoCoordinateAnimationPrivate), parent) - -{ - Q_D(QQuickGeoCoordinateAnimation); - d->interpolatorType = qMetaTypeId(); - d->defaultToInterpolatorType = true; - d->interpolator = QVariantAnimationPrivate::getInterpolator(d->interpolatorType); -} - -QQuickGeoCoordinateAnimation::~QQuickGeoCoordinateAnimation() -{ -} - -/*! - \qmlproperty coordinate CoordinateAnimation::from - This property holds the coordinate where the animation should begin. -*/ -QGeoCoordinate QQuickGeoCoordinateAnimation::from() const -{ - Q_D(const QQuickGeoCoordinateAnimation); - return d->from.value(); -} - -void QQuickGeoCoordinateAnimation::setFrom(const QGeoCoordinate &f) -{ - QGeoMercatorCoordinatePrivate *mercator = new QGeoMercatorCoordinatePrivate(); - QDoubleVector2D fromVector = QWebMercator::coordToMercator(f); - mercator->lat = f.latitude(); - mercator->lng = f.longitude(); - mercator->alt = f.altitude(); - mercator->m_mercatorX = fromVector.x(); - mercator->m_mercatorY = fromVector.y(); - QGeoCoordinate from(*mercator); - QQuickPropertyAnimation::setFrom(QVariant::fromValue(from)); -} - -/*! - \qmlproperty coordinate CoordinateAnimation::to - This property holds the coordinate where the animation should end. -*/ -QGeoCoordinate QQuickGeoCoordinateAnimation::to() const -{ - Q_D(const QQuickGeoCoordinateAnimation); - return d->to.value(); -} - -void QQuickGeoCoordinateAnimation::setTo(const QGeoCoordinate &t) -{ - QGeoMercatorCoordinatePrivate *mercator = new QGeoMercatorCoordinatePrivate(); - QDoubleVector2D toVector = QWebMercator::coordToMercator(t); - mercator->lat = t.latitude(); - mercator->lng = t.longitude(); - mercator->alt = t.altitude(); - mercator->m_mercatorX = toVector.x(); - mercator->m_mercatorY = toVector.y(); - QGeoCoordinate to(*mercator); - QQuickPropertyAnimation::setTo(QVariant::fromValue(to)); -} - -/*! - \qmlproperty enumeration CoordinateAnimation::direction - This property holds the direction of the \l{longitude} animation of the \l{coordinate}. - - Possible values are: - - \list - \li CoordinateAnimation.Shortest (default) - the longitude animation goes in the direction - that produces the shortest animation path. - \li CoordinateAnimation.West - the longitude animation always goes into western direction - and may cross the date line. - \li CoordinateAnimation.East - the longitude animation always goes into eastern direction - and may cross the date line. - \endlist - \since 5.5 -*/ - - -QQuickGeoCoordinateAnimation::Direction QQuickGeoCoordinateAnimation::direction() const -{ - Q_D(const QQuickGeoCoordinateAnimation); - return d->m_direction; -} - -void QQuickGeoCoordinateAnimation::setDirection(QQuickGeoCoordinateAnimation::Direction direction) -{ - Q_D( QQuickGeoCoordinateAnimation); - if (d->m_direction == direction) - return; - - d->m_direction = direction; - switch (direction) { - case West: - d->interpolator = reinterpret_cast(reinterpret_cast(&q_coordinateWestInterpolator)); - break; - case East: - d->interpolator = reinterpret_cast(reinterpret_cast(&q_coordinateEastInterpolator)); - break; - case Shortest: - default: - d->interpolator = reinterpret_cast(reinterpret_cast(&q_coordinateShortestInterpolator)); - break; - } - emit directionChanged(); - -} - -QQuickGeoCoordinateAnimationPrivate::QQuickGeoCoordinateAnimationPrivate(): - m_direction(QQuickGeoCoordinateAnimation::Shortest) -{ -} - -QT_END_NAMESPACE diff --git a/src/imports/positioning/qquickgeocoordinateanimation_p.h b/src/imports/positioning/qquickgeocoordinateanimation_p.h deleted file mode 100644 index 95f8dc07..00000000 --- a/src/imports/positioning/qquickgeocoordinateanimation_p.h +++ /dev/null @@ -1,99 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtPositioning module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QQUICKGEOCOORDINATEANIMATION_P_H -#define QQUICKGEOCOORDINATEANIMATION_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include -#include - -QT_BEGIN_NAMESPACE - -class QQuickGeoCoordinateAnimationPrivate; - -class QQuickGeoCoordinateAnimation : public QQuickPropertyAnimation -{ - Q_OBJECT - Q_DECLARE_PRIVATE(QQuickGeoCoordinateAnimation) - Q_PROPERTY(QGeoCoordinate from READ from WRITE setFrom) - Q_PROPERTY(QGeoCoordinate to READ to WRITE setTo) - Q_PROPERTY(Direction direction READ direction WRITE setDirection NOTIFY directionChanged) - -public: - enum Direction { - Shortest, - West, - East - }; - Q_ENUM(Direction) - - QQuickGeoCoordinateAnimation(QObject *parent=0); - ~QQuickGeoCoordinateAnimation(); - - QGeoCoordinate from() const; - void setFrom(const QGeoCoordinate &); - - QGeoCoordinate to() const; - void setTo(const QGeoCoordinate &); - - Direction direction() const; - void setDirection(Direction direction); - -Q_SIGNALS: - void directionChanged(); -}; - -QVariant q_coordinateInterpolator(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress); - -QT_END_NAMESPACE - -QML_DECLARE_TYPE(QQuickGeoCoordinateAnimation) - -#endif // QQUICKCOORDINATEANIMATION_P_H diff --git a/src/imports/positioning/qquickgeocoordinateanimation_p_p.h b/src/imports/positioning/qquickgeocoordinateanimation_p_p.h deleted file mode 100644 index 946a38cb..00000000 --- a/src/imports/positioning/qquickgeocoordinateanimation_p_p.h +++ /dev/null @@ -1,69 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtPositioning module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QQUICKGEOCOORDINATEANIMATION_P_P_H -#define QQUICKGEOCOORDINATEANIMATION_P_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include "qquickgeocoordinateanimation_p.h" -#include - -QT_BEGIN_NAMESPACE - -class QQuickGeoCoordinateAnimationPrivate : public QQuickPropertyAnimationPrivate -{ - Q_DECLARE_PUBLIC(QQuickGeoCoordinateAnimation) -public: - QQuickGeoCoordinateAnimationPrivate(); - QQuickGeoCoordinateAnimation::Direction m_direction; -}; - -QT_END_NAMESPACE - -#endif // QQUICKGEOCOORDINATEANIMATION_P_P_H diff --git a/src/location/declarativemaps/declarativemaps.pri b/src/location/declarativemaps/declarativemaps.pri index 99d72a88..54a0824b 100644 --- a/src/location/declarativemaps/declarativemaps.pri +++ b/src/location/declarativemaps/declarativemaps.pri @@ -1,4 +1,4 @@ -QT += quick-private network positioning-private qml-private core-private gui-private +QT += quick-private network positioning-private positioningquick-private qml-private core-private gui-private INCLUDEPATH += declarativemaps @@ -29,8 +29,7 @@ PRIVATE_HEADERS += \ declarativemaps/qgeomapobject_p.h \ declarativemaps/qgeomapobject_p_p.h \ declarativemaps/qparameterizableobject_p.h \ - declarativemaps/qquickgeomapgesturearea_p.h \ - ../imports/positioning/qquickgeocoordinateanimation_p.h + declarativemaps/qquickgeomapgesturearea_p.h SOURCES += \ declarativemaps/error_messages.cpp \ @@ -58,8 +57,7 @@ SOURCES += \ declarativemaps/qgeomapitemgeometry.cpp \ declarativemaps/qgeomapobject.cpp \ declarativemaps/qparameterizableobject.cpp \ - declarativemaps/qquickgeomapgesturearea.cpp \ - ../imports/positioning/qquickgeocoordinateanimation.cpp + declarativemaps/qquickgeomapgesturearea.cpp load(qt_build_paths) LIBS_PRIVATE += -L$$MODULE_BASE_OUTDIR/lib -lpoly2tri$$qtPlatformTargetSuffix() -lclip2tri$$qtPlatformTargetSuffix() diff --git a/src/location/declarativemaps/qquickgeomapgesturearea.cpp b/src/location/declarativemaps/qquickgeomapgesturearea.cpp index c6f4b42f..b15dbc4d 100644 --- a/src/location/declarativemaps/qquickgeomapgesturearea.cpp +++ b/src/location/declarativemaps/qquickgeomapgesturearea.cpp @@ -35,7 +35,7 @@ ****************************************************************************/ #include "qquickgeomapgesturearea_p.h" -#include "qquickgeocoordinateanimation_p.h" +#include #include "qdeclarativegeomap_p.h" #include "error_messages_p.h" diff --git a/src/positioningquick/qquickgeocoordinateanimation.cpp b/src/positioningquick/qquickgeocoordinateanimation.cpp new file mode 100644 index 00000000..b00f187d --- /dev/null +++ b/src/positioningquick/qquickgeocoordinateanimation.cpp @@ -0,0 +1,297 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickgeocoordinateanimation_p.h" +#include "qquickgeocoordinateanimation_p_p.h" +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +/*! + \qmltype CoordinateAnimation + \instantiates QQuickGeoCoordinateAnimation + \inherits PropertyAnimation + \inqmlmodule QtPositioning + \since 5.3 + + \brief A PropertyAnimation for geo coordinate properties. + + A specialized \l{PropertyAnimation} that defines an animation + between two \l{coordinate}{coordinates}. + + By default, a \l{latitude} of the \l{coordinate} is animated in the direction of shortest + (geodesic) distance between those coordinates. Since CoordinateAnimation uses Mercator + map projection, the \l{latitude} animation is always between -90 and 90 degrees. + The \l{longitude} animation path is not limited and can go over 180 degrees + in both west and east directions. + + The \l{direction} property can be set to specify the direction in which the \l{longitude} + animation should occur. + + \sa {Animation and Transitions in Qt Quick} +*/ + +QVariant q_coordinateInterpolator(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress) +{ + if (from == to) { + if (progress < 0.5) { + return QVariant::fromValue(from); + } else { + return QVariant::fromValue(to); + } + } + + QGeoCoordinate result = QWebMercator::coordinateInterpolation(from, to, progress); + + return QVariant::fromValue(result); +} + +QVariant q_coordinateShortestInterpolator(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress) +{ + const QGeoMercatorCoordinatePrivate* fromMercator = + static_cast(QGeoCoordinatePrivate::get(&from)); + const QGeoMercatorCoordinatePrivate* toMercator = + static_cast(QGeoCoordinatePrivate::get(&to)); + + double toX = toMercator->m_mercatorX; + double toY = toMercator->m_mercatorY; + double fromX = fromMercator->m_mercatorX; + double fromY = fromMercator->m_mercatorY; + double x; + if (0.5 < qAbs(toX - fromX)) { + // handle dateline crossing + double ex = toX; + double sx = fromX; + if (ex < sx) + sx -= 1.0; + else if (sx < ex) + ex -= 1.0; + + x = fromX + (toX - fromX) * progress; + + if (x < 0.0) + x += 1.0; + + } else { + x = fromX + (toX - fromX) * progress; + } + + double y = fromY + (toY - fromY) * progress; + + QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y)); + result.setAltitude(from.altitude() + (to.altitude() - from.altitude()) * progress); + return QVariant::fromValue(result); +} + +QVariant q_coordinateWestInterpolator(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress) +{ + const QGeoMercatorCoordinatePrivate* fromMercator = + static_cast(QGeoCoordinatePrivate::get(&from)); + const QGeoMercatorCoordinatePrivate* toMercator = + static_cast(QGeoCoordinatePrivate::get(&to)); + + double toX = toMercator->m_mercatorX; + double toY = toMercator->m_mercatorY; + double fromX = fromMercator->m_mercatorX; + double fromY = fromMercator->m_mercatorY; + double diff = toX - fromX; + + while (diff < 0.0) { + toX += 1.0; + diff += 1.0; + } + + double x = fromX + (toX - fromX) * progress; + double y = fromY + (toY - fromY) * progress; + + while (x > 1.0) + x -= 1.0; + + QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y)); + result.setAltitude(from.altitude() + (to.altitude() - from.altitude()) * progress); + + return QVariant::fromValue(result); +} + +QVariant q_coordinateEastInterpolator(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress) +{ + const QGeoMercatorCoordinatePrivate* fromMercator = + static_cast(QGeoCoordinatePrivate::get(&from)); + const QGeoMercatorCoordinatePrivate* toMercator = + static_cast(QGeoCoordinatePrivate::get(&to)); + + double toX = toMercator->m_mercatorX; + double toY = toMercator->m_mercatorY; + double fromX = fromMercator->m_mercatorX; + double fromY = fromMercator->m_mercatorY; + double diff = toX - fromX; + + while (diff > 0.0) { + toX -= 1.0; + diff -= 1.0; + } + + double x = fromX + (toX - fromX) * progress; + double y = fromY + (toY - fromY) * progress; + + while (x < 0.0) + x += 1.0; + + QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y)); + result.setAltitude(from.altitude() + (to.altitude() - from.altitude()) * progress); + + return QVariant::fromValue(result); +} + +QQuickGeoCoordinateAnimation::QQuickGeoCoordinateAnimation(QObject *parent) + : QQuickPropertyAnimation(*(new QQuickGeoCoordinateAnimationPrivate), parent) + +{ + Q_D(QQuickGeoCoordinateAnimation); + d->interpolatorType = qMetaTypeId(); + d->defaultToInterpolatorType = true; + d->interpolator = QVariantAnimationPrivate::getInterpolator(d->interpolatorType); +} + +QQuickGeoCoordinateAnimation::~QQuickGeoCoordinateAnimation() +{ +} + +/*! + \qmlproperty coordinate CoordinateAnimation::from + This property holds the coordinate where the animation should begin. +*/ +QGeoCoordinate QQuickGeoCoordinateAnimation::from() const +{ + Q_D(const QQuickGeoCoordinateAnimation); + return d->from.value(); +} + +void QQuickGeoCoordinateAnimation::setFrom(const QGeoCoordinate &f) +{ + QGeoMercatorCoordinatePrivate *mercator = new QGeoMercatorCoordinatePrivate(); + QDoubleVector2D fromVector = QWebMercator::coordToMercator(f); + mercator->lat = f.latitude(); + mercator->lng = f.longitude(); + mercator->alt = f.altitude(); + mercator->m_mercatorX = fromVector.x(); + mercator->m_mercatorY = fromVector.y(); + QGeoCoordinate from(*mercator); + QQuickPropertyAnimation::setFrom(QVariant::fromValue(from)); +} + +/*! + \qmlproperty coordinate CoordinateAnimation::to + This property holds the coordinate where the animation should end. +*/ +QGeoCoordinate QQuickGeoCoordinateAnimation::to() const +{ + Q_D(const QQuickGeoCoordinateAnimation); + return d->to.value(); +} + +void QQuickGeoCoordinateAnimation::setTo(const QGeoCoordinate &t) +{ + QGeoMercatorCoordinatePrivate *mercator = new QGeoMercatorCoordinatePrivate(); + QDoubleVector2D toVector = QWebMercator::coordToMercator(t); + mercator->lat = t.latitude(); + mercator->lng = t.longitude(); + mercator->alt = t.altitude(); + mercator->m_mercatorX = toVector.x(); + mercator->m_mercatorY = toVector.y(); + QGeoCoordinate to(*mercator); + QQuickPropertyAnimation::setTo(QVariant::fromValue(to)); +} + +/*! + \qmlproperty enumeration CoordinateAnimation::direction + This property holds the direction of the \l{longitude} animation of the \l{coordinate}. + + Possible values are: + + \list + \li CoordinateAnimation.Shortest (default) - the longitude animation goes in the direction + that produces the shortest animation path. + \li CoordinateAnimation.West - the longitude animation always goes into western direction + and may cross the date line. + \li CoordinateAnimation.East - the longitude animation always goes into eastern direction + and may cross the date line. + \endlist + \since 5.5 +*/ + + +QQuickGeoCoordinateAnimation::Direction QQuickGeoCoordinateAnimation::direction() const +{ + Q_D(const QQuickGeoCoordinateAnimation); + return d->m_direction; +} + +void QQuickGeoCoordinateAnimation::setDirection(QQuickGeoCoordinateAnimation::Direction direction) +{ + Q_D( QQuickGeoCoordinateAnimation); + if (d->m_direction == direction) + return; + + d->m_direction = direction; + switch (direction) { + case West: + d->interpolator = reinterpret_cast(reinterpret_cast(&q_coordinateWestInterpolator)); + break; + case East: + d->interpolator = reinterpret_cast(reinterpret_cast(&q_coordinateEastInterpolator)); + break; + case Shortest: + default: + d->interpolator = reinterpret_cast(reinterpret_cast(&q_coordinateShortestInterpolator)); + break; + } + emit directionChanged(); + +} + +QQuickGeoCoordinateAnimationPrivate::QQuickGeoCoordinateAnimationPrivate(): + m_direction(QQuickGeoCoordinateAnimation::Shortest) +{ +} + +QT_END_NAMESPACE diff --git a/src/positioningquick/qquickgeocoordinateanimation_p.h b/src/positioningquick/qquickgeocoordinateanimation_p.h new file mode 100644 index 00000000..c616d780 --- /dev/null +++ b/src/positioningquick/qquickgeocoordinateanimation_p.h @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKGEOCOORDINATEANIMATION_P_H +#define QQUICKGEOCOORDINATEANIMATION_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QQuickGeoCoordinateAnimationPrivate; + +class Q_POSITIONINGQUICK_PRIVATE_EXPORT QQuickGeoCoordinateAnimation : public QQuickPropertyAnimation +{ + Q_OBJECT + Q_DECLARE_PRIVATE(QQuickGeoCoordinateAnimation) + Q_PROPERTY(QGeoCoordinate from READ from WRITE setFrom) + Q_PROPERTY(QGeoCoordinate to READ to WRITE setTo) + Q_PROPERTY(Direction direction READ direction WRITE setDirection NOTIFY directionChanged) + +public: + enum Direction { + Shortest, + West, + East + }; + Q_ENUM(Direction) + + QQuickGeoCoordinateAnimation(QObject *parent=0); + ~QQuickGeoCoordinateAnimation(); + + QGeoCoordinate from() const; + void setFrom(const QGeoCoordinate &); + + QGeoCoordinate to() const; + void setTo(const QGeoCoordinate &); + + Direction direction() const; + void setDirection(Direction direction); + +Q_SIGNALS: + void directionChanged(); +}; + +QVariant Q_POSITIONINGQUICK_PRIVATE_EXPORT q_coordinateInterpolator(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress); + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QQuickGeoCoordinateAnimation) + +#endif // QQUICKCOORDINATEANIMATION_P_H diff --git a/src/positioningquick/qquickgeocoordinateanimation_p_p.h b/src/positioningquick/qquickgeocoordinateanimation_p_p.h new file mode 100644 index 00000000..946a38cb --- /dev/null +++ b/src/positioningquick/qquickgeocoordinateanimation_p_p.h @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKGEOCOORDINATEANIMATION_P_P_H +#define QQUICKGEOCOORDINATEANIMATION_P_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qquickgeocoordinateanimation_p.h" +#include + +QT_BEGIN_NAMESPACE + +class QQuickGeoCoordinateAnimationPrivate : public QQuickPropertyAnimationPrivate +{ + Q_DECLARE_PUBLIC(QQuickGeoCoordinateAnimation) +public: + QQuickGeoCoordinateAnimationPrivate(); + QQuickGeoCoordinateAnimation::Direction m_direction; +}; + +QT_END_NAMESPACE + +#endif // QQUICKGEOCOORDINATEANIMATION_P_P_H -- cgit v1.2.1