summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno de Oliveira Abinader <bruno@mapbox.com>2016-08-04 15:56:27 +0300
committerBruno de Oliveira Abinader <bruno@mapbox.com>2016-08-17 14:43:22 +0300
commitee62a807a3fe2a1276583fc93cee3d1ffc55f4bc (patch)
treedf172be925a2e8714c0a7dbb58cdf1d71ffc0e8e
parent5057d7ef5d218f3f9636d128e36970c077acafbd (diff)
downloadqtlocation-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.hpp7
-rw-r--r--platform/qt/include/qquickmapboxglstyleproperty.hpp19
-rw-r--r--platform/qt/src/qquickmapboxgl.cpp34
-rw-r--r--platform/qt/src/qquickmapboxglstyleproperty.cpp77
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 &center);
+private slots:
+ void onStylePropertyUpdated(const QVariantMap &params);
+
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 &params)
+{
+ 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)
+{
+}