forked from qt-creator/qt-creator
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:
committed by
Thomas Hartmann
parent
ebf074a604
commit
c6047e06e6
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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)
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user