#include <QDebug>
#include <QPointF>
+#include <QVariant>
#include "geocoordinate.h"
#include "map/osm.h"
return m_y;
}
-QDebug operator<<(QDebug dbg, const SceneCoordinate &coordinate)
+SceneCoordinate::operator QVariant() const
{
- dbg.nospace() << "(" << coordinate.x() << ", " << coordinate.y() << ")";
+ return QVariant::fromValue(*this);
+}
- return dbg.space();
+SceneCoordinate & SceneCoordinate::operator*=(double factor)
+{
+ m_x *= factor;
+ m_y *= factor;
+ return *this;
+}
+
+SceneCoordinate & SceneCoordinate::operator+=(const SceneCoordinate &coordinate)
+{
+ m_x += coordinate.x();
+ m_y += coordinate.y();
+ return *this;
+}
+
+SceneCoordinate & SceneCoordinate::operator-=(const SceneCoordinate &coordinate)
+{
+ m_x -= coordinate.x();
+ m_y -= coordinate.y();
+ return *this;
+}
+
+const SceneCoordinate operator* (double factor, const SceneCoordinate &coordinate)
+{
+ return SceneCoordinate(coordinate) *= factor;
+}
+
+const SceneCoordinate SceneCoordinate::operator+(const SceneCoordinate &other) const
+{
+ return SceneCoordinate(*this) += other;
+}
+
+const SceneCoordinate SceneCoordinate::operator-(const SceneCoordinate &other) const
+{
+ return SceneCoordinate(*this) -= other;
}
private:
double m_x; ///< X value
double m_y; ///< Y value
+
+/*******************************************************************************
+ * OPERATORS
+ ******************************************************************************/
+public:
+ operator QVariant() const;
+
+ SceneCoordinate & operator*=(double factor);
+ SceneCoordinate & operator+=(const SceneCoordinate &coordinate);
+ SceneCoordinate & operator-=(const SceneCoordinate &coordinate);
+
+ const SceneCoordinate operator+(const SceneCoordinate &other) const;
+ const SceneCoordinate operator-(const SceneCoordinate &other) const;
};
QDebug operator<<(QDebug dbg, const SceneCoordinate &c);
+const SceneCoordinate operator*(double factor, const SceneCoordinate &coordinate);
+
Q_DECLARE_METATYPE(SceneCoordinate)
#endif // SCENECOORDINATE_H
m_scroller->stop();
m_scroller->setEasingCurve(QEasingCurve::InOutQuart);
m_scroller->setDuration(SMOOTH_CENTERING_TIME_MS);
- m_scroller->setStartValue(m_sceneCoordinate.toPointF());
- m_scroller->setEndValue(coordinate.toPointF());
+ m_scroller->setStartValue(m_sceneCoordinate);
+ m_scroller->setEndValue(coordinate);
m_smoothScrollRunning = true;
m_scroller->start();
}
*/
#include <QDebug>
-#include <QPointF>
+#include <QVariantAnimation>
+
+#include "coordinates/scenecoordinate.h"
#include "mapscroller.h"
+// scene coordinate interpolator function is not part of this class namespace
+QVariant sceneCoordinateInterpolator(const SceneCoordinate &start,
+ const SceneCoordinate &end,
+ qreal progress);
+
MapScroller& MapScroller::getInstance()
{
qDebug() << __PRETTY_FUNCTION__;
+ qRegisterAnimationInterpolator<SceneCoordinate>(sceneCoordinateInterpolator);
+
static MapScroller instance;
return instance;
}
{
qDebug() << __PRETTY_FUNCTION__;
- Q_ASSERT(value.type() == QVariant::PointF);
+ if ((state() == QAbstractAnimation::Running) && (value.canConvert<SceneCoordinate>()))
+ emit coordinateUpdated(value.value<SceneCoordinate>());
+}
- if (state() == QAbstractAnimation::Running) {
- QPointF point = value.toPointF();
- emit coordinateUpdated(SceneCoordinate(point.x(), point.y()));
- }
+// scene coordinate interpolator function is not part of this class namespace
+QVariant sceneCoordinateInterpolator(const SceneCoordinate &start,
+ const SceneCoordinate &end,
+ qreal progress)
+{
+ return SceneCoordinate(start + progress * (end - start));
}
/**
* @brief Get reference to instance of this class
*
+ * Also registers the custom SceneCoordinate interpolator method.
+ *
* @return reference to instance of this class
*/
static MapScroller &getInstance();
m_scroller->setEasingCurve(QEasingCurve::Linear);
m_scroller->setDuration(ZOOM_TIME_MS);
- m_scroller->setStartValue(QPointF(m_scenePosition));
- m_scroller->setEndValue(QPointF(zoomPosition));
+ m_scroller->setStartValue(SceneCoordinate(m_scenePosition.x(), m_scenePosition.y()));
+ m_scroller->setEndValue(SceneCoordinate(zoomPosition.x(), zoomPosition.y()));
m_zoomAnimation->setEasingCurve(QEasingCurve::InQuad);
m_zoomAnimation->setDuration(ZOOM_TIME_MS);
m_scroller->setEasingCurve(QEasingCurve::OutCirc);
m_scroller->setDuration(KINETIC_SCROLL_TIME_MS);
- m_scroller->setStartValue(QPointF(m_scenePosition));
- m_scroller->setEndValue(QPointF(m_scenePosition) + effectSceneDistance);
+ m_scroller->setStartValue(SceneCoordinate(m_scenePosition.x(), m_scenePosition.y()));
+ QPointF endValue = QPointF(m_scenePosition) + effectSceneDistance;
+ m_scroller->setEndValue(SceneCoordinate(endValue.x(), endValue.y()));
m_scroller->start();
+
+ /// @todo modify calculations to use double
}
}
}