[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:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user