forked from qt-creator/qt-creator
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:
@@ -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>());
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user