summaryrefslogtreecommitdiff
path: root/platform/qt
diff options
context:
space:
mode:
authorBruno de Oliveira Abinader <bruno@mapbox.com>2016-09-22 18:21:59 +0300
committerBruno de Oliveira Abinader <bruno@mapbox.com>2016-09-26 11:47:34 +0200
commit478241a90f9ab995640e630bdf689060fe026fa5 (patch)
treec6b23a7f28322f9670d559bab1bedc2f97cdfbb1 /platform/qt
parent1d1b3f5882c52ee310563d3b6963e6f5f2b59b70 (diff)
downloadqtlocation-mapboxgl-478241a90f9ab995640e630bdf689060fe026fa5.tar.gz
[Qt] Added QQuickMapboxGLMapParameter
Diffstat (limited to 'platform/qt')
-rw-r--r--platform/qt/include/QQuickMapboxGLMapParameter1
-rw-r--r--platform/qt/include/qquickmapboxgl.hpp19
-rw-r--r--platform/qt/include/qquickmapboxglmapparameter.hpp38
-rw-r--r--platform/qt/qt5.cmake2
-rw-r--r--platform/qt/src/qquickmapboxgl.cpp40
-rw-r--r--platform/qt/src/qquickmapboxglmapparameter.cpp37
6 files changed, 136 insertions, 1 deletions
diff --git a/platform/qt/include/QQuickMapboxGLMapParameter b/platform/qt/include/QQuickMapboxGLMapParameter
new file mode 100644
index 0000000000..603fb2bd51
--- /dev/null
+++ b/platform/qt/include/QQuickMapboxGLMapParameter
@@ -0,0 +1 @@
+#include "qquickmapboxglmapparameter.hpp"
diff --git a/platform/qt/include/qquickmapboxgl.hpp b/platform/qt/include/qquickmapboxgl.hpp
index 270020a901..64e779b40c 100644
--- a/platform/qt/include/qquickmapboxgl.hpp
+++ b/platform/qt/include/qquickmapboxgl.hpp
@@ -7,9 +7,11 @@
#include <QGeoShape>
#include <QPointF>
#include <QQuickFramebufferObject>
+#include <QQmlListProperty>
#include <QMapbox>
#include <QQuickMapboxGLStyle>
+#include <QQuickMapboxGLMapParameter>
class QDeclarativeGeoServiceProvider;
class QQuickItem;
@@ -19,7 +21,7 @@ class Q_DECL_EXPORT QQuickMapboxGL : public QQuickFramebufferObject
{
Q_OBJECT
- // Map QML Type interface implementation.
+ // Map QML Type interface.
Q_ENUMS(QGeoServiceProvider::Error)
Q_PROPERTY(QDeclarativeGeoServiceProvider *plugin READ plugin WRITE setPlugin NOTIFY pluginChanged)
Q_PROPERTY(qreal minimumZoomLevel READ minimumZoomLevel WRITE setMinimumZoomLevel NOTIFY minimumZoomLevelChanged)
@@ -37,6 +39,10 @@ class Q_DECL_EXPORT QQuickMapboxGL : public QQuickFramebufferObject
Q_PROPERTY(qreal bearing READ bearing WRITE setBearing NOTIFY bearingChanged)
Q_PROPERTY(qreal pitch READ pitch WRITE setPitch NOTIFY pitchChanged)
+ // Proposed Qt interface - based on the example documentation below:
+ // http://doc.qt.io/qt-5/qtqml-referenceexamples-properties-example.html
+ Q_PROPERTY(QQmlListProperty<QQuickMapboxGLMapParameter> parameters READ parameters)
+
public:
QQuickMapboxGL(QQuickItem *parent = 0);
virtual ~QQuickMapboxGL();
@@ -83,11 +89,15 @@ public:
void setPitch(qreal pitch);
qreal pitch() const;
+ // Proposed Qt interface implementation.
+ QQmlListProperty<QQuickMapboxGLMapParameter> parameters();
+
protected:
// QQuickItem implementation.
virtual void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value);
signals:
+ // Map QML Type signals.
void minimumZoomLevelChanged();
void maximumZoomLevelChanged();
void zoomLevelChanged(qreal zoomLevel);
@@ -100,6 +110,7 @@ signals:
void copyrightLinkActivated(const QString &link);
void copyrightsVisibleChanged(bool visible);
+ // Mapbox-specific signals.
void styleChanged();
void bearingChanged(qreal angle);
void pitchChanged(qreal angle);
@@ -113,6 +124,11 @@ private slots:
void onStylePropertyUpdated(const QVariantMap &params);
private:
+ static void appendParameter(QQmlListProperty<QQuickMapboxGLMapParameter> *prop, QQuickMapboxGLMapParameter *mapObject);
+ static int countParameters(QQmlListProperty<QQuickMapboxGLMapParameter> *prop);
+ static QQuickMapboxGLMapParameter *parameterAt(QQmlListProperty<QQuickMapboxGLMapParameter> *prop, int index);
+ static void clearParameter(QQmlListProperty<QQuickMapboxGLMapParameter> *prop);
+
enum SyncState {
NothingNeedsSync = 0,
ZoomNeedsSync = 1 << 0,
@@ -134,6 +150,7 @@ private:
QColor m_color;
QList<QVariantMap> m_layoutChanges;
QList<QVariantMap> m_paintChanges;
+ QList<QQuickMapboxGLMapParameter*> m_parameters;
QQuickMapboxGLStyle *m_style = 0;
qreal m_bearing = 0;
diff --git a/platform/qt/include/qquickmapboxglmapparameter.hpp b/platform/qt/include/qquickmapboxglmapparameter.hpp
new file mode 100644
index 0000000000..9a6e3a2ff0
--- /dev/null
+++ b/platform/qt/include/qquickmapboxglmapparameter.hpp
@@ -0,0 +1,38 @@
+#ifndef QQUICKMAPBOXGLMAPPARAMETER_H
+#define QQUICKMAPBOXGLMAPPARAMETER_H
+
+#include <QObject>
+#include <QQmlParserStatus>
+#include <QString>
+#include <qqml.h>
+
+class Q_DECL_EXPORT QQuickMapboxGLMapParameter : public QObject, public QQmlParserStatus
+{
+ Q_OBJECT
+ Q_INTERFACES(QQmlParserStatus)
+
+public:
+ QQuickMapboxGLMapParameter(QObject *parent = 0);
+ virtual ~QQuickMapboxGLMapParameter() {};
+
+ int propertyOffset() const { return m_metaPropertyOffset; }
+
+signals:
+ void propertiesReady();
+ void propertyUpdated(const QString &name);
+
+protected:
+ // QQmlParserStatus implementation
+ void classBegin() override {}
+ void componentComplete() override;
+
+private slots:
+ void onPropertyUpdated(int index);
+
+private:
+ int m_metaPropertyOffset;
+};
+
+QML_DECLARE_TYPE(QQuickMapboxGLMapParameter)
+
+#endif // QQUICKMAPBOXGLMAPPARAMETER_H
diff --git a/platform/qt/qt5.cmake b/platform/qt/qt5.cmake
index 95e35eaab4..72d93da4e5 100644
--- a/platform/qt/qt5.cmake
+++ b/platform/qt/qt5.cmake
@@ -17,9 +17,11 @@ set(MBGL_QT_LIBRARIES
add_library(qmapboxgl SHARED
platform/qt/include/qquickmapboxgl.hpp
+ platform/qt/include/qquickmapboxglmapparameter.hpp
platform/qt/include/qquickmapboxglstyle.hpp
platform/qt/include/qquickmapboxglstyleproperty.hpp
platform/qt/src/qquickmapboxgl.cpp
+ platform/qt/src/qquickmapboxglmapparameter.cpp
platform/qt/src/qquickmapboxglrenderer.cpp
platform/qt/src/qquickmapboxglrenderer.hpp
platform/qt/src/qquickmapboxglstyle.cpp
diff --git a/platform/qt/src/qquickmapboxgl.cpp b/platform/qt/src/qquickmapboxgl.cpp
index 2174c92139..a0eb2a6b7c 100644
--- a/platform/qt/src/qquickmapboxgl.cpp
+++ b/platform/qt/src/qquickmapboxgl.cpp
@@ -2,13 +2,17 @@
#include <mbgl/util/constants.hpp>
+#include <QMapbox>
#include <QQuickMapboxGL>
#include <QQuickMapboxGLStyleProperty>
+#include <QQuickMapboxGLMapParameter>
#include <QDebug>
#include <QQuickItem>
+#include <QRegularExpression>
#include <QString>
#include <QtGlobal>
+#include <QQmlListProperty>
#include <cmath>
@@ -300,3 +304,39 @@ void QQuickMapboxGL::onStyleChanged()
emit styleChanged();
}
+
+void QQuickMapboxGL::appendParameter(QQmlListProperty<QQuickMapboxGLMapParameter> *prop, QQuickMapboxGLMapParameter *param)
+{
+ QQuickMapboxGL *map = static_cast<QQuickMapboxGL *>(prop->object);
+ map->m_parameters.append(param);
+}
+
+int QQuickMapboxGL::countParameters(QQmlListProperty<QQuickMapboxGLMapParameter> *prop)
+{
+ QQuickMapboxGL *map = static_cast<QQuickMapboxGL *>(prop->object);
+ return map->m_parameters.count();
+}
+
+QQuickMapboxGLMapParameter *QQuickMapboxGL::parameterAt(QQmlListProperty<QQuickMapboxGLMapParameter> *prop, int index)
+{
+ QQuickMapboxGL *map = static_cast<QQuickMapboxGL *>(prop->object);
+ return map->m_parameters[index];
+}
+
+void QQuickMapboxGL::clearParameter(QQmlListProperty<QQuickMapboxGLMapParameter> *prop)
+{
+ QQuickMapboxGL *map = static_cast<QQuickMapboxGL *>(prop->object);
+ for (auto param : map->m_parameters) {
+ }
+ map->m_parameters.clear();
+}
+
+QQmlListProperty<QQuickMapboxGLMapParameter> QQuickMapboxGL::parameters()
+{
+ return QQmlListProperty<QQuickMapboxGLMapParameter>(this,
+ nullptr,
+ appendParameter,
+ countParameters,
+ parameterAt,
+ clearParameter);
+}
diff --git a/platform/qt/src/qquickmapboxglmapparameter.cpp b/platform/qt/src/qquickmapboxglmapparameter.cpp
new file mode 100644
index 0000000000..bd5cfdd089
--- /dev/null
+++ b/platform/qt/src/qquickmapboxglmapparameter.cpp
@@ -0,0 +1,37 @@
+#include "QQuickMapboxGLMapParameter"
+
+#include <QByteArray>
+#include <QMetaObject>
+#include <QMetaProperty>
+#include <QSignalMapper>
+
+
+QQuickMapboxGLMapParameter::QQuickMapboxGLMapParameter(QObject *parent)
+ : QObject(parent)
+ , m_metaPropertyOffset(metaObject()->propertyCount())
+{
+}
+
+void QQuickMapboxGLMapParameter::componentComplete()
+{
+ for (int i = m_metaPropertyOffset; i < metaObject()->propertyCount(); ++i) {
+ QMetaProperty property = metaObject()->property(i);
+
+ if (!property.hasNotifySignal()) {
+ return;
+ }
+
+ auto mapper = new QSignalMapper(this);
+ mapper->setMapping(this, i);
+
+ const QByteArray signalName = '2' + property.notifySignal().methodSignature();
+ QObject::connect(this, signalName, mapper, SLOT(map()));
+ QObject::connect(mapper, SIGNAL(mapped(int)), this, SLOT(onPropertyUpdated(int)));
+ }
+ emit propertiesReady();
+}
+
+void QQuickMapboxGLMapParameter::onPropertyUpdated(int index)
+{
+ emit propertyUpdated(metaObject()->property(index).name());
+}