diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 38c20a65952..d511ae5d64d 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -989,7 +989,8 @@ void ModelPrivate::notifyVariantPropertiesChanged(const InternalNodePointer &nod } void ModelPrivate::notifyNodeAboutToBeReparent(const InternalNodePointer &node, - const InternalNodeAbstractProperty *newPropertyParent, + const InternalNodePointer &newParent, + const PropertyName &newPropertyName, const InternalNodePointer &oldParent, const PropertyName &oldPropertyName, AbstractView::PropertyChangeFlags propertyChange) @@ -998,12 +999,12 @@ void ModelPrivate::notifyNodeAboutToBeReparent(const InternalNodePointer &node, NodeAbstractProperty newProperty; NodeAbstractProperty oldProperty; - if (!oldPropertyName.isEmpty() && oldParent->isValid) + if (!oldPropertyName.isEmpty() && oldParent && oldParent->isValid) oldProperty = NodeAbstractProperty(oldPropertyName, oldParent, m_model, view); - if (newPropertyParent) { - newProperty = NodeAbstractProperty(newPropertyParent->name(), - newPropertyParent->propertyOwner(), + if (!newPropertyName.isEmpty() && newParent && newParent->isValid) { + newProperty = NodeAbstractProperty(newPropertyName, + newParent, m_model, view); } @@ -1394,6 +1395,22 @@ void ModelPrivate::reparentNode(const InternalNodePointer &parentNode, const TypeName &dynamicTypeName) { AbstractView::PropertyChangeFlags propertyChange = AbstractView::NoAdditionalChanges; + + InternalNodeAbstractPropertyPointer oldParentProperty(childNode->parentProperty()); + InternalNodePointer oldParentNode; + PropertyName oldParentPropertyName; + if (oldParentProperty && oldParentProperty->isValid()) { + oldParentNode = childNode->parentProperty()->propertyOwner(); + oldParentPropertyName = childNode->parentProperty()->name(); + } + + notifyNodeAboutToBeReparent(childNode, + parentNode, + name, + oldParentNode, + oldParentPropertyName, + propertyChange); + InternalNodeAbstractProperty *newParentProperty = nullptr; if (auto property = parentNode->property(name)) { newParentProperty = property->to(); @@ -1406,22 +1423,8 @@ void ModelPrivate::reparentNode(const InternalNodePointer &parentNode, propertyChange |= AbstractView::PropertiesAdded; } - InternalNodeAbstractPropertyPointer oldParentProperty(childNode->parentProperty()); - InternalNodePointer oldParentNode; - PropertyName oldParentPropertyName; - if (oldParentProperty && oldParentProperty->isValid()) { - oldParentNode = childNode->parentProperty()->propertyOwner(); - oldParentPropertyName = childNode->parentProperty()->name(); - } - Q_ASSERT(newParentProperty); - notifyNodeAboutToBeReparent(childNode, - newParentProperty, - oldParentNode, - oldParentPropertyName, - propertyChange); - if (newParentProperty) { childNode->setParentProperty( newParentProperty->toShared()); diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index 20b83a564b6..8ba7c69b595 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -149,7 +149,8 @@ public: void notifyNodeCreated(const InternalNodePointer &newNode); void notifyNodeAboutToBeReparent(const InternalNodePointer &node, - const InternalNodeAbstractProperty *newPropertyParent, + const InternalNodePointer &newParent, + const PropertyName &newPropertyName, const InternalNodePointer &oldParent, const PropertyName &oldPropertyName, AbstractView::PropertyChangeFlags propertyChange);