From aeb30c0840928df1ec7117302b28bd7861a79478 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Mon, 5 Oct 2020 12:04:34 +0200 Subject: [PATCH] QmlDesigner: Delete existing node when property does not allow list Some properties can only contain a single QML element. In this case we should delete the old existing element. This can be checked using NodeMetainfo::propertyIsListProperty. Change-Id: I1782a38b7bfdb8a6f1078b0fa39654a4653dab59 Reviewed-by: Mahmoud Badri Reviewed-by: Miikka Heikkinen --- .../designercore/model/qmlvisualnode.cpp | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp index 9a376bab64a..29fd0785b48 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp @@ -213,11 +213,20 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view, NodeHints hints = NodeHints::fromItemLibraryEntry(itemLibraryEntry); const PropertyName forceNonDefaultProperty = hints.forceNonDefaultProperty().toUtf8(); - QmlObjectNode newNode = QmlItemNode::createQmlObjectNode(view, itemLibraryEntry, position, parentProperty); + QmlObjectNode newNode = QmlItemNode::createQmlObjectNode(view, + itemLibraryEntry, + position, + parentProperty); if (!forceNonDefaultProperty.isEmpty()) { - if (parentQmlItemNode.modelNode().metaInfo().hasProperty(forceNonDefaultProperty)) + const NodeMetaInfo metaInfo = parentQmlItemNode.modelNode().metaInfo(); + if (metaInfo.hasProperty(forceNonDefaultProperty)) { + if (!metaInfo.propertyIsListProperty(forceNonDefaultProperty) + && parentQmlItemNode.modelNode().hasNodeProperty(forceNonDefaultProperty)) { + parentQmlItemNode.removeProperty(forceNonDefaultProperty); + } parentQmlItemNode.nodeListProperty(forceNonDefaultProperty).reparentHere(newNode); + } } return newNode; @@ -288,8 +297,18 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view, newQmlObjectNode = createQmlObjectNodeFromSource(view, itemLibraryEntry.qmlSource(), position); } - if (parentProperty.isValid()) - parentProperty.reparentHere(newQmlObjectNode); + if (parentProperty.isValid()) { + const PropertyName propertyName = parentProperty.name(); + const ModelNode parentNode = parentProperty.parentModelNode(); + const NodeMetaInfo metaInfo = parentNode.metaInfo(); + + if (metaInfo.isValid() && !metaInfo.propertyIsListProperty(propertyName) + && parentProperty.isNodeProperty()) { + parentNode.removeProperty(propertyName); + } + + parentNode.nodeAbstractProperty(propertyName).reparentHere(newQmlObjectNode); + } if (!newQmlObjectNode.isValid()) return;