QmlDesigner: Fix crash on NodeProperty Reparenting

Task-number: QDS-10645
Change-Id: I67a0fd5618ad020bd83d2e62e9e1f278bd1696f1
Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Aleksei German
2023-09-11 17:27:29 +02:00
parent a94ab799f9
commit 97a312aad3
2 changed files with 24 additions and 20 deletions

View File

@@ -989,7 +989,8 @@ void ModelPrivate::notifyVariantPropertiesChanged(const InternalNodePointer &nod
} }
void ModelPrivate::notifyNodeAboutToBeReparent(const InternalNodePointer &node, void ModelPrivate::notifyNodeAboutToBeReparent(const InternalNodePointer &node,
const InternalNodeAbstractProperty *newPropertyParent, const InternalNodePointer &newParent,
const PropertyName &newPropertyName,
const InternalNodePointer &oldParent, const InternalNodePointer &oldParent,
const PropertyName &oldPropertyName, const PropertyName &oldPropertyName,
AbstractView::PropertyChangeFlags propertyChange) AbstractView::PropertyChangeFlags propertyChange)
@@ -998,12 +999,12 @@ void ModelPrivate::notifyNodeAboutToBeReparent(const InternalNodePointer &node,
NodeAbstractProperty newProperty; NodeAbstractProperty newProperty;
NodeAbstractProperty oldProperty; NodeAbstractProperty oldProperty;
if (!oldPropertyName.isEmpty() && oldParent->isValid) if (!oldPropertyName.isEmpty() && oldParent && oldParent->isValid)
oldProperty = NodeAbstractProperty(oldPropertyName, oldParent, m_model, view); oldProperty = NodeAbstractProperty(oldPropertyName, oldParent, m_model, view);
if (newPropertyParent) { if (!newPropertyName.isEmpty() && newParent && newParent->isValid) {
newProperty = NodeAbstractProperty(newPropertyParent->name(), newProperty = NodeAbstractProperty(newPropertyName,
newPropertyParent->propertyOwner(), newParent,
m_model, m_model,
view); view);
} }
@@ -1394,6 +1395,22 @@ void ModelPrivate::reparentNode(const InternalNodePointer &parentNode,
const TypeName &dynamicTypeName) const TypeName &dynamicTypeName)
{ {
AbstractView::PropertyChangeFlags propertyChange = AbstractView::NoAdditionalChanges; 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; InternalNodeAbstractProperty *newParentProperty = nullptr;
if (auto property = parentNode->property(name)) { if (auto property = parentNode->property(name)) {
newParentProperty = property->to<PropertyType::Node, PropertyType::NodeList>(); newParentProperty = property->to<PropertyType::Node, PropertyType::NodeList>();
@@ -1406,22 +1423,8 @@ void ModelPrivate::reparentNode(const InternalNodePointer &parentNode,
propertyChange |= AbstractView::PropertiesAdded; 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); Q_ASSERT(newParentProperty);
notifyNodeAboutToBeReparent(childNode,
newParentProperty,
oldParentNode,
oldParentPropertyName,
propertyChange);
if (newParentProperty) { if (newParentProperty) {
childNode->setParentProperty( childNode->setParentProperty(
newParentProperty->toShared<PropertyType::Node, PropertyType::NodeList>()); newParentProperty->toShared<PropertyType::Node, PropertyType::NodeList>());

View File

@@ -149,7 +149,8 @@ public:
void notifyNodeCreated(const InternalNodePointer &newNode); void notifyNodeCreated(const InternalNodePointer &newNode);
void notifyNodeAboutToBeReparent(const InternalNodePointer &node, void notifyNodeAboutToBeReparent(const InternalNodePointer &node,
const InternalNodeAbstractProperty *newPropertyParent, const InternalNodePointer &newParent,
const PropertyName &newPropertyName,
const InternalNodePointer &oldParent, const InternalNodePointer &oldParent,
const PropertyName &oldPropertyName, const PropertyName &oldPropertyName,
AbstractView::PropertyChangeFlags propertyChange); AbstractView::PropertyChangeFlags propertyChange);