summaryrefslogtreecommitdiff
path: root/src/imports/location/qdeclarativegeoshape.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/imports/location/qdeclarativegeoshape.cpp')
-rw-r--r--src/imports/location/qdeclarativegeoshape.cpp150
1 files changed, 143 insertions, 7 deletions
diff --git a/src/imports/location/qdeclarativegeoshape.cpp b/src/imports/location/qdeclarativegeoshape.cpp
index b65974dc..35a80483 100644
--- a/src/imports/location/qdeclarativegeoshape.cpp
+++ b/src/imports/location/qdeclarativegeoshape.cpp
@@ -41,21 +41,157 @@
#include "qdeclarativegeoshape.h"
+#include <QtLocation/QGeoRectangle>
+#include <QtLocation/QGeoCircle>
+
QT_BEGIN_NAMESPACE
/*!
- \qmltype GeoShape
- \instantiates QDeclarativeGeoShape
+ \qmlbasictype geoshape
\inqmlmodule QtLocation 5.0
- \ingroup qml-QtLocation5-positioning
+ \ingroup qml-QtLocation5-basictypes
\since Qt Location 5.0
- \brief The GeoShape type represents an abstract geographic area.
+ \brief A geoshape type represents an abstract geographic area.
+
+ The \c geoshape type represents an abstract geographic area. It includes attributes and
+ methods common to all geographic areas. To create objects that represent a valid geographic
+ area use \l {QtLocation5::georectangle}{georectangle} or
+ \l {QtLocation5::geocircle}{geocircle}.
+
+ The \c isValid attribute can be used to test if the geoshape represents a valid geographic
+ area.
+
+ The \c isEmpty attribute can be used to test if the geoshape represents a region with a
+ geomatrical area of 0.
+
+ The \l contains() method can be used to test if a \l {QtLocation5::coordinate}{coordinate} is
+ within the geoshape.
+
+ \section2 Example Usage
+
+ Use properties of type \l variant to store a \c {geoshape}. To create a \c geoshape use one
+ of the methods described below.
+
+ To create a \c geoshape value, specify it as a "shape()" string:
+
+ \qml
+ import QtLocation
+
+ Item {
+ property variant region: "shape()"
+ }
+ \endqml
+
+ or with the \l {QtLocation5::QtLocation}{QtLocation.shape()} function:
+
+ \qml
+ import QtLocation 5.0
+
+ Item {
+ property variant region: QtLocation.shape()
+ }
+ \endqml
+
+ When integrating with C++, note that any QGeoShape value passed into QML from C++ is
+ automatically converted into a \c geoshape value, and vice-versa.
- The GeoShape type is not intended to be instantiated by the developer. Use GeoRectangle
- or GeoCircle instead.
+ \section2 Methods
- \sa GeoRectangle, GeoCircle
+ \section3 contains()
+
+ \code
+ bool contains(coordinate coord)
+ \endcode
+
+ Returns true if the \l {QtLocation5::coordinate}{coordinate} specified by \a coord is within
+ this geoshape; Otherwise returns false.
*/
+GeoShapeValueType::GeoShapeValueType(QObject *parent)
+: QQmlValueTypeBase<QGeoShape>(qMetaTypeId<QGeoShape>(), parent)
+{
+}
+
+GeoShapeValueType::~GeoShapeValueType()
+{
+}
+
+GeoShapeValueType::ShapeType GeoShapeValueType::type() const
+{
+ return static_cast<GeoShapeValueType::ShapeType>(v.type());
+}
+
+bool GeoShapeValueType::isValid() const
+{
+ return v.isValid();
+}
+
+bool GeoShapeValueType::isEmpty() const
+{
+ return v.isEmpty();
+}
+
+bool GeoShapeValueType::contains(const QGeoCoordinate &coordinate) const
+{
+ return v.contains(coordinate);
+}
+
+QString GeoShapeValueType::toString() const
+{
+ switch (v.type()) {
+ case QGeoShape::UnknownType:
+ return QStringLiteral("QGeoShape()");
+ case QGeoShape::RectangleType: {
+ QGeoRectangle r = v;
+ return QStringLiteral("QGeoRectangle({%1, %2}, {%3, %4})")
+ .arg(r.topLeft().latitude())
+ .arg(r.topLeft().longitude())
+ .arg(r.bottomRight().latitude())
+ .arg(r.bottomRight().longitude());
+ }
+ case QGeoShape::CircleType: {
+ QGeoCircle c = v;
+ return QStringLiteral("QGeoCircle({%1, %2}, %3)")
+ .arg(c.center().latitude())
+ .arg(c.center().longitude())
+ .arg(c.radius());
+ }
+ }
+
+ return QStringLiteral("QGeoShape(%1)").arg(v.type());
+}
+
+void GeoShapeValueType::setValue(const QVariant &value)
+{
+ if (value.userType() == qMetaTypeId<QGeoShape>())
+ v = value.value<QGeoShape>();
+ else if (value.userType() == qMetaTypeId<QGeoRectangle>())
+ v = value.value<QGeoRectangle>();
+ else if (value.userType() == qMetaTypeId<QGeoCircle>())
+ v = value.value<QGeoCircle>();
+ else
+ v = QGeoShape();
+
+ onLoad();
+}
+
+bool GeoShapeValueType::isEqual(const QVariant &other) const
+{
+ if (other.userType() == qMetaTypeId<QGeoShape>())
+ return v == other.value<QGeoShape>();
+ else if (other.userType() == qMetaTypeId<QGeoRectangle>())
+ return v == other.value<QGeoRectangle>();
+ else if (other.userType() == qMetaTypeId<QGeoCircle>())
+ return v == other.value<QGeoCircle>();
+ else
+ return false;
+}
+
+GeoShapeValueType::GeoShapeValueType(int userType, QObject *parent)
+: QQmlValueTypeBase<QGeoShape>(userType, parent)
+{
+ QMetaType::construct(userType, &v, 0);
+}
+
QT_END_NAMESPACE