QmlDesigner: Fix Property Editor doesn't update binding properties

Now Property Editor correctly update a binding property when it is
added, removed, or updated.

Fixes: QDS-9465
Change-Id: I48eb101f7dcca04e123a84c6eebaf4ec6d098d6c
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Mahmoud Badri
2023-03-17 17:19:23 +02:00
parent 2da5e04ef7
commit e2e53896f9
4 changed files with 21 additions and 12 deletions

View File

@@ -365,6 +365,13 @@ void PropertyEditorQmlBackend::setValue(const QmlObjectNode & , const PropertyNa
}
}
void PropertyEditorQmlBackend::setExpression(const PropertyName &propName, const QString &exp)
{
PropertyEditorValue *propertyValue = propertyValueForName(QString::fromUtf8(propName));
if (propertyValue)
propertyValue->setExpression(exp);
}
QQmlContext *PropertyEditorQmlBackend::context() {
return m_view->rootContext();
}

View File

@@ -35,6 +35,7 @@ public:
void setup(const QmlObjectNode &fxObjectNode, const QString &stateName, const QUrl &qmlSpecificsFile, PropertyEditorView *propertyEditor);
void initialSetup(const TypeName &typeName, const QUrl &qmlSpecificsFile, PropertyEditorView *propertyEditor);
void setValue(const QmlObjectNode &fxObjectNode, const PropertyName &name, const QVariant &value);
void setExpression(const PropertyName &propName, const QString &exp);
QQmlContext *context();
PropertyEditorContextObject* contextObject();

View File

@@ -328,7 +328,7 @@ PropertyEditorNodeWrapper *PropertyEditorValue::complexNode()
void PropertyEditorValue::resetValue()
{
if (m_value.isValid() || isBound()) {
if (m_value.isValid() || !m_expression.isEmpty() || isBound()) {
m_value = QVariant();
m_isBound = false;
m_expression = QString();

View File

@@ -641,7 +641,11 @@ void PropertyEditorView::propertiesRemoved(const QList<AbstractProperty>& proper
m_qmlBackEndForCurrentType->contextObject()->setHasAliasExport(QmlObjectNode(m_selectedNode).isAliasExported());
if (node == m_selectedNode || QmlObjectNode(m_selectedNode).propertyChangeForCurrentState() == node) {
setValue(m_selectedNode, property.name(), QmlObjectNode(m_selectedNode).instanceValue(property.name()));
m_locked = true;
PropertyEditorValue *value = m_qmlBackEndForCurrentType->propertyValueForName(QString::fromUtf8(property.name()));
if (value)
value->resetValue();
m_locked = false;
if (propertyIsAttachedLayoutProperty(property.name())) {
m_qmlBackEndForCurrentType->setValueforLayoutAttachedProperties(m_selectedNode, property.name());
@@ -699,10 +703,7 @@ void PropertyEditorView::variantPropertiesChanged(const QList<VariantProperty>&
void PropertyEditorView::bindingPropertiesChanged(const QList<BindingProperty> &propertyList, PropertyChangeFlags /*propertyChange*/)
{
if (locked())
return;
if (noValidSelection())
if (locked() || noValidSelection())
return;
for (const BindingProperty &property : propertyList) {
@@ -714,11 +715,11 @@ void PropertyEditorView::bindingPropertiesChanged(const QList<BindingProperty>&
if (node == m_selectedNode || QmlObjectNode(m_selectedNode).propertyChangeForCurrentState() == node) {
if (property.name().contains("anchor"))
m_qmlBackEndForCurrentType->backendAnchorBinding().invalidate(m_selectedNode);
if ( QmlObjectNode(m_selectedNode).modelNode().property(property.name()).isBindingProperty())
setValue(m_selectedNode, property.name(), QmlObjectNode(m_selectedNode).instanceValue(property.name()));
else
setValue(m_selectedNode, property.name(), QmlObjectNode(m_selectedNode).modelValue(property.name()));
m_locked = true;
QString exp = QmlObjectNode(m_selectedNode).bindingProperty(property.name()).expression();
m_qmlBackEndForCurrentType->setExpression(property.name(), exp);
m_locked = false;
}
}
}