diff options
-rw-r--r-- | platform/qt/include/QQuickMapboxGLMapParameter | 1 | ||||
-rw-r--r-- | platform/qt/include/qquickmapboxgl.hpp | 19 | ||||
-rw-r--r-- | platform/qt/include/qquickmapboxglmapparameter.hpp | 38 | ||||
-rw-r--r-- | platform/qt/qt5.cmake | 2 | ||||
-rw-r--r-- | platform/qt/src/qquickmapboxgl.cpp | 40 | ||||
-rw-r--r-- | platform/qt/src/qquickmapboxglmapparameter.cpp | 37 |
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 ¶ms); 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()); +} |