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

View File

@@ -45,9 +45,8 @@ namespace QmlPrivateGate {
QHash<QObject *, DesignerCustomObjectData*> 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

View File

@@ -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<PropertyName, QVariant> m_resetValueHash;
QHash<PropertyName, QWeakPointer<QQmlAbstractBinding> > m_resetBindingHash;
mutable QHash<PropertyName, bool> m_hasBindingHash;
};
} // namespace QmlPrivateGate

View File

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

View File

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