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 <tim.jenssen@theqtcompany.com>
This commit is contained in:
Thomas Hartmann
2015-05-19 16:37:55 +02:00
committed by Thomas Hartmann
parent ebf074a604
commit c6047e06e6
5 changed files with 71 additions and 60 deletions

View File

@@ -451,28 +451,7 @@ void ObjectNodeInstance::setPropertyBinding(const PropertyName &name, const QStr
if (!isSimpleExpression(expression)) if (!isSimpleExpression(expression))
return; return;
QQmlProperty property(object(), name, context()); QmlPrivateGate::setPropertyBinding(object(), context(), name, expression);
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";
}
} }
void ObjectNodeInstance::deleteObjectsInList(const QQmlProperty &property) 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 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) void ObjectNodeInstance::doResetProperty(const PropertyName &propertyName)
{ {
QmlPrivateGate::doResetProperty(object(), propertyName); QmlPrivateGate::doResetProperty(object(), context(), propertyName);
} }
QVariant ObjectNodeInstance::property(const PropertyName &name) const QVariant ObjectNodeInstance::property(const PropertyName &name) const
@@ -806,7 +785,7 @@ void ObjectNodeInstance::deactivateState()
void ObjectNodeInstance::populateResetHashes() void ObjectNodeInstance::populateResetHashes()
{ {
QmlPrivateGate::registerCustomData(object(), context()); QmlPrivateGate::registerCustomData(object());
} }
bool ObjectNodeInstance::hasValidResetBinding(const PropertyName &propertyName) const bool ObjectNodeInstance::hasValidResetBinding(const PropertyName &propertyName) const

View File

@@ -45,9 +45,8 @@ namespace QmlPrivateGate {
QHash<QObject *, DesignerCustomObjectData*> m_objectToDataHash; QHash<QObject *, DesignerCustomObjectData*> m_objectToDataHash;
DesignerCustomObjectData::DesignerCustomObjectData(QObject *object, QQmlContext *context) DesignerCustomObjectData::DesignerCustomObjectData(QObject *object)
: m_object(object) : m_object(object)
, m_context(context)
{ {
if (object) if (object)
populateResetHashes(); 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) DesignerCustomObjectData *DesignerCustomObjectData::get(QObject *object)
@@ -78,12 +77,12 @@ QVariant DesignerCustomObjectData::getResetValue(QObject *object, const Property
return QVariant(); return QVariant();
} }
void DesignerCustomObjectData::doResetProperty(QObject *object, const PropertyName &propertyName) void DesignerCustomObjectData::doResetProperty(QObject *object, QQmlContext *context, const PropertyName &propertyName)
{ {
DesignerCustomObjectData* data = get(object); DesignerCustomObjectData* data = get(object);
if (data) if (data)
data->doResetProperty(propertyName); data->doResetProperty(context, propertyName);
} }
bool DesignerCustomObjectData::hasValidResetBinding(QObject *object, const PropertyName &propertyName) bool DesignerCustomObjectData::hasValidResetBinding(QObject *object, const PropertyName &propertyName)
@@ -96,16 +95,24 @@ bool DesignerCustomObjectData::hasValidResetBinding(QObject *object, const Prope
return false; 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); DesignerCustomObjectData* data = get(object);
if (data) if (data)
return data->hasBindingForProperty(propertyName, hasChanged); return data->hasBindingForProperty(context, propertyName, hasChanged);
return false; 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() void DesignerCustomObjectData::populateResetHashes()
{ {
PropertyNameList propertyNameList = QmlPrivateGate::propertyNameListForWritableProperties(object()); PropertyNameList propertyNameList = QmlPrivateGate::propertyNameListForWritableProperties(object());
@@ -127,11 +134,6 @@ void DesignerCustomObjectData::populateResetHashes()
m_resetValueHash.insert("Layout.fillWidth", false); m_resetValueHash.insert("Layout.fillWidth", false);
} }
QQmlContext *DesignerCustomObjectData::context() const
{
return m_context;
}
QObject *DesignerCustomObjectData::object() const QObject *DesignerCustomObjectData::object() const
{ {
return m_object; return m_object;
@@ -142,9 +144,9 @@ QVariant DesignerCustomObjectData::getResetValue(const PropertyName &propertyNam
return m_resetValueHash.value(propertyName); 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()) if (!property.isValid())
return; return;
@@ -200,12 +202,12 @@ QQmlAbstractBinding *DesignerCustomObjectData::getResetBinding(const PropertyNam
return m_resetBindingHash.value(propertyName).data(); 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)) if (QmlPrivateGate::isPropertyBlackListed(propertyName))
return false; return false;
QQmlProperty property(object(), propertyName, context()); QQmlProperty property(object(), propertyName, context);
bool hasBinding = QQmlPropertyPrivate::binding(property); bool hasBinding = QQmlPropertyPrivate::binding(property);
@@ -218,6 +220,31 @@ bool DesignerCustomObjectData::hasBindingForProperty(const PropertyName &propert
return QQmlPropertyPrivate::binding(property); 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 QmlPrivateGate
} // namespace Internal } // namespace Internal

View File

@@ -51,30 +51,29 @@ namespace QmlPrivateGate {
class DesignerCustomObjectData class DesignerCustomObjectData
{ {
public: public:
static void registerData(QObject *object, QQmlContext *context); static void registerData(QObject *object);
static DesignerCustomObjectData *get(QObject *object); static DesignerCustomObjectData *get(QObject *object);
static QVariant getResetValue(QObject *object, const PropertyName &propertyName); 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 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: private:
DesignerCustomObjectData(QObject *object, QQmlContext *context); DesignerCustomObjectData(QObject *object);
void populateResetHashes(); void populateResetHashes();
QObject *object() const; QObject *object() const;
QQmlContext *context() const;
QVariant getResetValue(const PropertyName &propertyName) 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; bool hasValidResetBinding(const PropertyName &propertyName) const;
QQmlAbstractBinding *getResetBinding(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; QObject *m_object;
QQmlContext *m_context;
QHash<PropertyName, QVariant> m_resetValueHash; QHash<PropertyName, QVariant> m_resetValueHash;
QHash<PropertyName, QWeakPointer<QQmlAbstractBinding> > m_resetBindingHash; QHash<PropertyName, QWeakPointer<QQmlAbstractBinding> > m_resetBindingHash;
mutable QHash<PropertyName, bool> m_hasBindingHash; mutable QHash<PropertyName, bool> m_hasBindingHash;
}; };
} // namespace QmlPrivateGate } // namespace QmlPrivateGate

View File

@@ -448,9 +448,9 @@ bool hasFullImplementedListInterface(const QQmlListReference &list)
return list.isValid() && list.canCount() && list.canAt() && list.canAppend() && list.canClear(); 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) QVariant getResetValue(QObject *object, const PropertyName &propertyName)
@@ -458,9 +458,9 @@ QVariant getResetValue(QObject *object, const PropertyName &propertyName)
return DesignerCustomObjectData::getResetValue(object, 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) bool hasValidResetBinding(QObject *object, const PropertyName &propertyName)
@@ -468,9 +468,14 @@ bool hasValidResetBinding(QObject *object, const PropertyName &propertyName)
return DesignerCustomObjectData::hasValidResetBinding(object, 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) void doComponentCompleteRecursive(QObject *object, NodeInstanceServer *nodeInstanceServer)

View File

@@ -82,11 +82,12 @@ public:
QObjectList *inspectedObjects = 0); QObjectList *inspectedObjects = 0);
bool hasFullImplementedListInterface(const QQmlListReference &list); bool hasFullImplementedListInterface(const QQmlListReference &list);
void registerCustomData(QObject *object, QQmlContext *context); void registerCustomData(QObject *object);
QVariant getResetValue(QObject *object, const PropertyName &propertyName); 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 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); void doComponentCompleteRecursive(QObject *object, NodeInstanceServer *nodeInstanceServer);