From c6047e06e6680c42cbef1cdb3e70e136956012d1 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 19 May 2015 16:37:55 +0200 Subject: [PATCH] QmlPuppet: Move setPropertyBinding() to QmlPrivateGate We cannot keep the context. The context has to be forwarded each time. Change-Id: I50b944bea1c6ad30832490edad8b35f392c32029 Reviewed-by: Tim Jenssen --- .../instances/objectnodeinstance.cpp | 29 ++------- .../designercustomobjectdata.cpp | 61 +++++++++++++------ .../qmlprivategate/designercustomobjectdata.h | 17 +++--- .../qmlprivategate/qmlprivategate.cpp | 17 ++++-- .../qmlpuppet/qmlprivategate/qmlprivategate.h | 7 ++- 5 files changed, 71 insertions(+), 60 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp index ca7af686abd..b9498b28309 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp @@ -451,28 +451,7 @@ void ObjectNodeInstance::setPropertyBinding(const PropertyName &name, const QStr if (!isSimpleExpression(expression)) return; - QQmlProperty property(object(), name, context()); - - if (!property.isValid()) - return; - - if (property.isProperty()) { - QQmlBinding *binding = new QQmlBinding(expression, object(), context()); - binding->setTarget(property); - binding->setNotifyOnValueChanged(true); - QQmlAbstractBinding *oldBinding = QQmlPropertyPrivate::setBinding(property, binding); - if (oldBinding && !hasValidResetBinding(name)) - oldBinding->destroy(); - binding->update(); - if (binding->hasError()) { - //qDebug() <<" ObjectNodeInstance.setPropertyBinding has Error: " << object() << name << expression << binding->error(engine()).toString(); - if (property.property().userType() == QVariant::String) - property.write(QVariant(QString("#%1#").arg(expression))); - } - - } else { - qWarning() << "ObjectNodeInstance.setPropertyBinding: Cannot set binding for property" << name << ": property is unknown for type"; - } + QmlPrivateGate::setPropertyBinding(object(), context(), name, expression); } void ObjectNodeInstance::deleteObjectsInList(const QQmlProperty &property) @@ -531,12 +510,12 @@ void ObjectNodeInstance::refreshProperty(const PropertyName &name) bool ObjectNodeInstance::hasBindingForProperty(const PropertyName &propertyName, bool *hasChanged) const { - return QmlPrivateGate::hasBindingForProperty(object(), propertyName, hasChanged); + return QmlPrivateGate::hasBindingForProperty(object(), context(), propertyName, hasChanged); } void ObjectNodeInstance::doResetProperty(const PropertyName &propertyName) { - QmlPrivateGate::doResetProperty(object(), propertyName); + QmlPrivateGate::doResetProperty(object(), context(), propertyName); } QVariant ObjectNodeInstance::property(const PropertyName &name) const @@ -806,7 +785,7 @@ void ObjectNodeInstance::deactivateState() void ObjectNodeInstance::populateResetHashes() { - QmlPrivateGate::registerCustomData(object(), context()); + QmlPrivateGate::registerCustomData(object()); } bool ObjectNodeInstance::hasValidResetBinding(const PropertyName &propertyName) const diff --git a/share/qtcreator/qml/qmlpuppet/qmlprivategate/designercustomobjectdata.cpp b/share/qtcreator/qml/qmlpuppet/qmlprivategate/designercustomobjectdata.cpp index 8888b12a6ec..c35ca6677fb 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlprivategate/designercustomobjectdata.cpp +++ b/share/qtcreator/qml/qmlpuppet/qmlprivategate/designercustomobjectdata.cpp @@ -45,9 +45,8 @@ namespace QmlPrivateGate { QHash m_objectToDataHash; -DesignerCustomObjectData::DesignerCustomObjectData(QObject *object, QQmlContext *context) +DesignerCustomObjectData::DesignerCustomObjectData(QObject *object) : m_object(object) - , m_context(context) { if (object) populateResetHashes(); @@ -58,9 +57,9 @@ DesignerCustomObjectData::DesignerCustomObjectData(QObject *object, QQmlContext }); } -void DesignerCustomObjectData::registerData(QObject *object, QQmlContext *context) +void DesignerCustomObjectData::registerData(QObject *object) { - new DesignerCustomObjectData(object, context); + new DesignerCustomObjectData(object); } DesignerCustomObjectData *DesignerCustomObjectData::get(QObject *object) @@ -78,12 +77,12 @@ QVariant DesignerCustomObjectData::getResetValue(QObject *object, const Property return QVariant(); } -void DesignerCustomObjectData::doResetProperty(QObject *object, const PropertyName &propertyName) +void DesignerCustomObjectData::doResetProperty(QObject *object, QQmlContext *context, const PropertyName &propertyName) { DesignerCustomObjectData* data = get(object); if (data) - data->doResetProperty(propertyName); + data->doResetProperty(context, propertyName); } bool DesignerCustomObjectData::hasValidResetBinding(QObject *object, const PropertyName &propertyName) @@ -96,16 +95,24 @@ bool DesignerCustomObjectData::hasValidResetBinding(QObject *object, const Prope return false; } -bool DesignerCustomObjectData::hasBindingForProperty(QObject *object, const PropertyName &propertyName, bool *hasChanged) +bool DesignerCustomObjectData::hasBindingForProperty(QObject *object, QQmlContext *context, const PropertyName &propertyName, bool *hasChanged) { DesignerCustomObjectData* data = get(object); if (data) - return data->hasBindingForProperty(propertyName, hasChanged); + return data->hasBindingForProperty(context, propertyName, hasChanged); return false; } +void DesignerCustomObjectData::setPropertyBinding(QObject *object, QQmlContext *context, const PropertyName &propertyName, const QString &expression) +{ + DesignerCustomObjectData* data = get(object); + + if (data) + data->setPropertyBinding(context, propertyName, expression); +} + void DesignerCustomObjectData::populateResetHashes() { PropertyNameList propertyNameList = QmlPrivateGate::propertyNameListForWritableProperties(object()); @@ -127,11 +134,6 @@ void DesignerCustomObjectData::populateResetHashes() m_resetValueHash.insert("Layout.fillWidth", false); } -QQmlContext *DesignerCustomObjectData::context() const -{ - return m_context; -} - QObject *DesignerCustomObjectData::object() const { return m_object; @@ -142,9 +144,9 @@ QVariant DesignerCustomObjectData::getResetValue(const PropertyName &propertyNam return m_resetValueHash.value(propertyName); } -void DesignerCustomObjectData::doResetProperty(const PropertyName &propertyName) +void DesignerCustomObjectData::doResetProperty(QQmlContext *context, const PropertyName &propertyName) { - QQmlProperty property(object(), propertyName, context()); + QQmlProperty property(object(), propertyName, context); if (!property.isValid()) return; @@ -200,12 +202,12 @@ QQmlAbstractBinding *DesignerCustomObjectData::getResetBinding(const PropertyNam return m_resetBindingHash.value(propertyName).data(); } -bool DesignerCustomObjectData::hasBindingForProperty(const PropertyName &propertyName, bool *hasChanged) const +bool DesignerCustomObjectData::hasBindingForProperty(QQmlContext *context, const PropertyName &propertyName, bool *hasChanged) const { if (QmlPrivateGate::isPropertyBlackListed(propertyName)) return false; - QQmlProperty property(object(), propertyName, context()); + QQmlProperty property(object(), propertyName, context); bool hasBinding = QQmlPropertyPrivate::binding(property); @@ -218,6 +220,31 @@ bool DesignerCustomObjectData::hasBindingForProperty(const PropertyName &propert return QQmlPropertyPrivate::binding(property); } +void DesignerCustomObjectData::setPropertyBinding(QQmlContext *context, const PropertyName &propertyName, const QString &expression) +{ + QQmlProperty property(object(), propertyName, context); + + if (!property.isValid()) + return; + + if (property.isProperty()) { + QQmlBinding *binding = new QQmlBinding(expression, object(), context); + binding->setTarget(property); + binding->setNotifyOnValueChanged(true); + QQmlAbstractBinding *oldBinding = QQmlPropertyPrivate::setBinding(property, binding); + if (oldBinding && !hasValidResetBinding(propertyName)) + oldBinding->destroy(); + binding->update(); + if (binding->hasError()) { + if (property.property().userType() == QVariant::String) + property.write(QVariant(QString("#%1#").arg(expression))); + } + + } else { + qWarning() << Q_FUNC_INFO << ": Cannot set binding for property" << propertyName << ": property is unknown for type"; + } +} + } // namespace QmlPrivateGate } // namespace Internal diff --git a/share/qtcreator/qml/qmlpuppet/qmlprivategate/designercustomobjectdata.h b/share/qtcreator/qml/qmlpuppet/qmlprivategate/designercustomobjectdata.h index add0a896918..b930c912009 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlprivategate/designercustomobjectdata.h +++ b/share/qtcreator/qml/qmlpuppet/qmlprivategate/designercustomobjectdata.h @@ -51,30 +51,29 @@ namespace QmlPrivateGate { class DesignerCustomObjectData { public: - static void registerData(QObject *object, QQmlContext *context); + static void registerData(QObject *object); static DesignerCustomObjectData *get(QObject *object); static QVariant getResetValue(QObject *object, const PropertyName &propertyName); - static void doResetProperty(QObject *object, const PropertyName &propertyName); + static void doResetProperty(QObject *object, QQmlContext *context, const PropertyName &propertyName); static bool hasValidResetBinding(QObject *object, const PropertyName &propertyName); - static bool hasBindingForProperty(QObject *object, const PropertyName &propertyName, bool *hasChanged); + static bool hasBindingForProperty(QObject *object, QQmlContext *context, const PropertyName &propertyName, bool *hasChanged); + static void setPropertyBinding(QObject *object, QQmlContext *context, const PropertyName &propertyName, const QString &expression); private: - DesignerCustomObjectData(QObject *object, QQmlContext *context); + DesignerCustomObjectData(QObject *object); void populateResetHashes(); QObject *object() const; - QQmlContext *context() const; QVariant getResetValue(const PropertyName &propertyName) const; - void doResetProperty(const PropertyName &propertyName); + void doResetProperty(QQmlContext *context, const PropertyName &propertyName); bool hasValidResetBinding(const PropertyName &propertyName) const; QQmlAbstractBinding *getResetBinding(const PropertyName &propertyName) const; - bool hasBindingForProperty(const PropertyName &propertyName, bool *hasChanged) const; + bool hasBindingForProperty(QQmlContext *context, const PropertyName &propertyName, bool *hasChanged) const; + void setPropertyBinding(QQmlContext *context, const PropertyName &propertyName, const QString &expression); QObject *m_object; - QQmlContext *m_context; QHash m_resetValueHash; QHash > m_resetBindingHash; mutable QHash m_hasBindingHash; - }; } // namespace QmlPrivateGate diff --git a/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate.cpp b/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate.cpp index 44aba9f86c4..bb97d35e00e 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate.cpp +++ b/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate.cpp @@ -448,9 +448,9 @@ bool hasFullImplementedListInterface(const QQmlListReference &list) return list.isValid() && list.canCount() && list.canAt() && list.canAppend() && list.canClear(); } -void registerCustomData(QObject *object, QQmlContext *context) +void registerCustomData(QObject *object) { - DesignerCustomObjectData::registerData(object, context); + DesignerCustomObjectData::registerData(object); } QVariant getResetValue(QObject *object, const PropertyName &propertyName) @@ -458,9 +458,9 @@ QVariant getResetValue(QObject *object, const PropertyName &propertyName) return DesignerCustomObjectData::getResetValue(object, propertyName); } -void doResetProperty(QObject *object, const PropertyName &propertyName) +void doResetProperty(QObject *object, QQmlContext *context, const PropertyName &propertyName) { - DesignerCustomObjectData::doResetProperty(object, propertyName); + DesignerCustomObjectData::doResetProperty(object, context, propertyName); } bool hasValidResetBinding(QObject *object, const PropertyName &propertyName) @@ -468,9 +468,14 @@ bool hasValidResetBinding(QObject *object, const PropertyName &propertyName) return DesignerCustomObjectData::hasValidResetBinding(object, propertyName); } -bool hasBindingForProperty(QObject *object, const PropertyName &propertyName, bool *hasChanged) +bool hasBindingForProperty(QObject *object, QQmlContext *context, const PropertyName &propertyName, bool *hasChanged) { - return DesignerCustomObjectData::hasBindingForProperty(object, propertyName, hasChanged); + return DesignerCustomObjectData::hasBindingForProperty(object, context, propertyName, hasChanged); +} + +void setPropertyBinding(QObject *object, QQmlContext *context, const PropertyName &propertyName, const QString &expression) +{ + DesignerCustomObjectData::setPropertyBinding(object, context, propertyName, expression); } void doComponentCompleteRecursive(QObject *object, NodeInstanceServer *nodeInstanceServer) diff --git a/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate.h b/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate.h index 32249bada3e..817e1a19f97 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate.h +++ b/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate.h @@ -82,11 +82,12 @@ public: QObjectList *inspectedObjects = 0); bool hasFullImplementedListInterface(const QQmlListReference &list); - void registerCustomData(QObject *object, QQmlContext *context); + void registerCustomData(QObject *object); QVariant getResetValue(QObject *object, const PropertyName &propertyName); - void doResetProperty(QObject *object, const PropertyName &propertyName); + void doResetProperty(QObject *object, QQmlContext *context, const PropertyName &propertyName); bool hasValidResetBinding(QObject *object, const PropertyName &propertyName); - bool hasBindingForProperty(QObject *object, const PropertyName &propertyName, bool *hasChanged); + bool hasBindingForProperty(QObject *object, QQmlContext *context, const PropertyName &propertyName, bool *hasChanged); + void setPropertyBinding(QObject *object, QQmlContext *context, const PropertyName &propertyName, const QString &expression); void doComponentCompleteRecursive(QObject *object, NodeInstanceServer *nodeInstanceServer);