[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.
This commit is contained in:
Bruno de Oliveira Abinader
2016-08-04 15:56:27 +03:00
parent 5057d7ef5d
commit ee62a807a3
4 changed files with 77 additions and 60 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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();
}

View File

@@ -1,55 +1,20 @@
#include <QQuickMapboxGLStyleProperty>
#include <QQuickMapboxGL>
QQuickMapboxGLStyleProperty::QQuickMapboxGLStyleProperty(QQuickItem *parent_)
// QQuickMapboxGLStyleProperty
QQuickMapboxGLStyleProperty::QQuickMapboxGLStyleProperty(QQuickItem *parent_, Type type)
: QQuickItem(parent_)
{
m_map["type"] = type;
}
QQuickMapboxGLLayoutStyleProperty::QQuickMapboxGLLayoutStyleProperty(QQuickItem *parent_)
: QQuickMapboxGLStyleProperty(parent_)
void QQuickMapboxGLStyleProperty::checkUpdated()
{
}
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.";
}
}
void QQuickMapboxGLPaintStyleProperty::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->setPaintProperty(layer(), property(), value(), styleClass());
} else {
qWarning() << "Style property requires QQuickMapboxGL as parent item.";
}
}
void QQuickMapboxGLStyleProperty::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &data)
{
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)
{
}