diff options
author | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2016-08-04 15:56:27 +0300 |
---|---|---|
committer | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2016-08-17 14:43:22 +0300 |
commit | ee62a807a3fe2a1276583fc93cee3d1ffc55f4bc (patch) | |
tree | df172be925a2e8714c0a7dbb58cdf1d71ffc0e8e | |
parent | 5057d7ef5d218f3f9636d128e36970c077acafbd (diff) | |
download | qtlocation-mapboxgl-ee62a807a3fe2a1276583fc93cee3d1ffc55f4bc.tar.gz |
[Qt] Invert parent/child notification mechanism in QQuickMapboxGLStyleProperty
Parent item (QQuickMapboxGL) should check for signals from its child
items e.g. QQuickMapboxGLStyleProperty, and not the opposite.
-rw-r--r-- | platform/qt/include/qquickmapboxgl.hpp | 7 | ||||
-rw-r--r-- | platform/qt/include/qquickmapboxglstyleproperty.hpp | 19 | ||||
-rw-r--r-- | platform/qt/src/qquickmapboxgl.cpp | 34 | ||||
-rw-r--r-- | platform/qt/src/qquickmapboxglstyleproperty.cpp | 77 |
4 files changed, 77 insertions, 60 deletions
diff --git a/platform/qt/include/qquickmapboxgl.hpp b/platform/qt/include/qquickmapboxgl.hpp index 325a5f99dd..337360cac6 100644 --- a/platform/qt/include/qquickmapboxgl.hpp +++ b/platform/qt/include/qquickmapboxgl.hpp @@ -96,6 +96,10 @@ public: int swapSyncState(); +protected: + // QQuickItem implementation. + virtual void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value); + signals: void minimumZoomLevelChanged(); void maximumZoomLevelChanged(); @@ -116,6 +120,9 @@ signals: public slots: void setCenter(const QGeoCoordinate ¢er); +private slots: + void onStylePropertyUpdated(const QVariantMap ¶ms); + private: qreal m_minimumZoomLevel = 0; qreal m_maximumZoomLevel = 20; diff --git a/platform/qt/include/qquickmapboxglstyleproperty.hpp b/platform/qt/include/qquickmapboxglstyleproperty.hpp index f7762b4ee6..26eecce75d 100644 --- a/platform/qt/include/qquickmapboxglstyleproperty.hpp +++ b/platform/qt/include/qquickmapboxglstyleproperty.hpp @@ -12,10 +12,12 @@ class Q_DECL_EXPORT QQuickMapboxGLStyleProperty : public QQuickItem Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged) public: - virtual ~QQuickMapboxGLStyleProperty() {} + enum Type { + LayoutType = 0, + PaintType, + }; - // QQuickItem implementation - virtual void itemChange(QQuickItem::ItemChange, const QQuickItem::ItemChangeData &); + virtual ~QQuickMapboxGLStyleProperty() {} void setLayer(const QString &); QString layer() const; @@ -30,10 +32,11 @@ signals: void layerChanged(const QString &); void propertyChanged(const QString &); void valueChanged(const QVariant &); + void updated(const QVariantMap& params); protected: - QQuickMapboxGLStyleProperty(QQuickItem *parent); - virtual void updateParent() = 0; + QQuickMapboxGLStyleProperty(QQuickItem *parent, Type); + void checkUpdated(); QVariantMap m_map; }; @@ -43,9 +46,6 @@ class Q_DECL_EXPORT QQuickMapboxGLLayoutStyleProperty : public QQuickMapboxGLSty public: QQuickMapboxGLLayoutStyleProperty(QQuickItem *parent = 0); virtual ~QQuickMapboxGLLayoutStyleProperty() {} - -protected: - virtual void updateParent(); }; class Q_DECL_EXPORT QQuickMapboxGLPaintStyleProperty : public QQuickMapboxGLStyleProperty @@ -62,9 +62,6 @@ public: signals: void classChanged(const QString &); - -protected: - virtual void updateParent(); }; #endif // QQUICKMAPBOXGLSTYLEPROPERTY_H diff --git a/platform/qt/src/qquickmapboxgl.cpp b/platform/qt/src/qquickmapboxgl.cpp index 9e90593bbd..6d90a4aeae 100644 --- a/platform/qt/src/qquickmapboxgl.cpp +++ b/platform/qt/src/qquickmapboxgl.cpp @@ -3,6 +3,7 @@ #include <mbgl/util/constants.hpp> #include <QQuickMapboxGL> +#include <QQuickMapboxGLStyleProperty> #include <QDebug> #include <QQuickItem> @@ -257,3 +258,36 @@ int QQuickMapboxGL::swapSyncState() return oldState; } + +void QQuickMapboxGL::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value) +{ + QQuickFramebufferObject::itemChange(change, value); + + switch (change) { + case QQuickItem::ItemChildAddedChange: + if (QQuickMapboxGLStyleProperty *property = qobject_cast<QQuickMapboxGLStyleProperty *>(value.item)) { + connect(property, SIGNAL(updated(QVariantMap)), this, SLOT(onStylePropertyUpdated(QVariantMap))); + } + break; + case QQuickItem::ItemChildRemovedChange: + if (QQuickMapboxGLStyleProperty *property = qobject_cast<QQuickMapboxGLStyleProperty *>(value.item)) { + disconnect(property, SIGNAL(updated(QVariantMap)), this, SLOT(onStylePropertyUpdated(QVariantMap))); + } + default: + break; + } +} + +void QQuickMapboxGL::onStylePropertyUpdated(const QVariantMap ¶ms) +{ + switch (params.value("type").toInt()) { + case QQuickMapboxGLStyleProperty::LayoutType: + m_layoutChanges << params; + break; + case QQuickMapboxGLStyleProperty::PaintType: + m_paintChanges << params; + break; + } + + update(); +} diff --git a/platform/qt/src/qquickmapboxglstyleproperty.cpp b/platform/qt/src/qquickmapboxglstyleproperty.cpp index ffded9c9e7..b8603d00ef 100644 --- a/platform/qt/src/qquickmapboxglstyleproperty.cpp +++ b/platform/qt/src/qquickmapboxglstyleproperty.cpp @@ -1,55 +1,20 @@ #include <QQuickMapboxGLStyleProperty> -#include <QQuickMapboxGL> -QQuickMapboxGLStyleProperty::QQuickMapboxGLStyleProperty(QQuickItem *parent_) - : QQuickItem(parent_) -{ -} - -QQuickMapboxGLLayoutStyleProperty::QQuickMapboxGLLayoutStyleProperty(QQuickItem *parent_) - : QQuickMapboxGLStyleProperty(parent_) -{ -} - -QQuickMapboxGLPaintStyleProperty::QQuickMapboxGLPaintStyleProperty(QQuickItem *parent_) - : QQuickMapboxGLStyleProperty(parent_) -{ -} - -void QQuickMapboxGLLayoutStyleProperty::updateParent() -{ - if (m_map.value("layer").isNull() || m_map.value("property").isNull() || m_map.value("value").isNull()) { - return; - } - - QQuickMapboxGL *map = qobject_cast<QQuickMapboxGL *>(parentItem()); - if (map) { - map->setLayoutProperty(layer(), property(), value()); - } else { - qWarning() << "Style property requires QQuickMapboxGL as parent item."; - } -} +// QQuickMapboxGLStyleProperty -void QQuickMapboxGLPaintStyleProperty::updateParent() +QQuickMapboxGLStyleProperty::QQuickMapboxGLStyleProperty(QQuickItem *parent_, Type type) + : QQuickItem(parent_) { - if (m_map.value("layer").isNull() || m_map.value("property").isNull() || m_map.value("value").isNull()) { - return; - } - - QQuickMapboxGL *map = qobject_cast<QQuickMapboxGL *>(parentItem()); - if (map) { - map->setPaintProperty(layer(), property(), value(), styleClass()); - } else { - qWarning() << "Style property requires QQuickMapboxGL as parent item."; - } + m_map["type"] = type; } -void QQuickMapboxGLStyleProperty::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &data) +void QQuickMapboxGLStyleProperty::checkUpdated() { - QQuickItem::itemChange(change, data); - - if (change == QQuickItem::ItemParentHasChanged) { - updateParent(); + if (m_map.value("type").isValid() + && m_map.value("layer").isValid() + && m_map.value("property").isValid() + && m_map.value("value").isValid()) { + emit updated(m_map); } } @@ -61,7 +26,7 @@ void QQuickMapboxGLStyleProperty::setLayer(const QString &layer) m_map["layer"] = layer; emit layerChanged(layer); - updateParent(); + checkUpdated(); } QString QQuickMapboxGLStyleProperty::layer() const @@ -77,7 +42,7 @@ void QQuickMapboxGLStyleProperty::setProperty(const QString &property) m_map["property"] = property; emit propertyChanged(property); - updateParent(); + checkUpdated(); } QString QQuickMapboxGLStyleProperty::property() const @@ -93,7 +58,7 @@ void QQuickMapboxGLStyleProperty::setValue(const QVariant &value) m_map["value"] = value; emit valueChanged(value); - updateParent(); + checkUpdated(); } QVariant QQuickMapboxGLStyleProperty::value() const @@ -109,10 +74,24 @@ void QQuickMapboxGLPaintStyleProperty::setStyleClass(const QString &styleClass) m_map["class"] = styleClass; emit classChanged(styleClass); - updateParent(); + checkUpdated(); } QString QQuickMapboxGLPaintStyleProperty::styleClass() const { return m_map.value("class").toString(); } + +// QQuickMapboxGLLayoutStyleProperty + +QQuickMapboxGLLayoutStyleProperty::QQuickMapboxGLLayoutStyleProperty(QQuickItem *parent_) + : QQuickMapboxGLStyleProperty(parent_, LayoutType) +{ +} + +// QQuickMapboxGLPaintStyleProperty + +QQuickMapboxGLPaintStyleProperty::QQuickMapboxGLPaintStyleProperty(QQuickItem *parent_) + : QQuickMapboxGLStyleProperty(parent_, PaintType) +{ +} |