diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp index 43cf7523013..e8a9180508c 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp @@ -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(); } diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.h b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.h index 1334ff55f2f..c96e2dcf5cf 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.h +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.h @@ -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(); diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp index 9cc32d33f86..27f3ebcab67 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp @@ -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(); diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp index c5ba15af1a1..f32c93c089f 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp @@ -629,7 +629,7 @@ void PropertyEditorView::modelAboutToBeDetached(Model *model) resetView(); } -void PropertyEditorView::propertiesRemoved(const QList& propertyList) +void PropertyEditorView::propertiesRemoved(const QList &propertyList) { if (noValidSelection()) return; @@ -641,7 +641,11 @@ void PropertyEditorView::propertiesRemoved(const QList& 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()); @@ -697,12 +701,9 @@ void PropertyEditorView::variantPropertiesChanged(const QList& } } -void PropertyEditorView::bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags /*propertyChange*/) +void PropertyEditorView::bindingPropertiesChanged(const QList &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& 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; } } }