From 1d5ddbf8f81dacaf62f81ba6312b9eecfa1d0a72 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 27 Aug 2021 16:23:52 +0300 Subject: [PATCH] QmlDesigner: Fix update of effects after initial drag from library Effect source type was set to incorrect after the initial drag to the scene, so even resetting puppet wouldn't make a newly added effect show up. Fixed by updating the NodeSourceType when updating the node source. Also reset the puppet for now when node source changes, as it doesn't handle source changes properly. Change-Id: Id22a298738fb1e7f841b94b473ccb61cc82e0322 Reviewed-by: Thomas Hartmann --- .../qmldesigner/designercore/include/modelnode.h | 1 + .../designercore/instances/nodeinstanceview.cpp | 3 +++ .../qmldesigner/designercore/model/modelnode.cpp | 16 ++++++++++++++++ .../designercore/model/texttomodelmerger.cpp | 4 ++-- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/modelnode.h b/src/plugins/qmldesigner/designercore/include/modelnode.h index e9c47ccae47..961d3914059 100644 --- a/src/plugins/qmldesigner/designercore/include/modelnode.h +++ b/src/plugins/qmldesigner/designercore/include/modelnode.h @@ -226,6 +226,7 @@ public: qint32 internalId() const; void setNodeSource(const QString&); + void setNodeSource(const QString &newNodeSource, NodeSourceType type); QString nodeSource() const; QString convertTypeToImportAlias() const; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index e2887782abe..1eb4bb3b9fc 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -642,6 +642,9 @@ void NodeInstanceView::nodeSourceChanged(const ModelNode &node, const QString & NodeInstance instance = instanceForModelNode(node); ChangeNodeSourceCommand changeNodeSourceCommand(instance.instanceId(), newNodeSource); m_nodeInstanceServer->changeNodeSource(changeNodeSourceCommand); + + // Puppet doesn't deal with node source changes properly, so just reset the puppet for now + delayedRestartProcess(); // TODO: Remove this once the issue is properly fixed (QDS-4955) } } diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 0e40c8edabe..64b51ff69fa 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -1278,6 +1278,22 @@ void ModelNode::setNodeSource(const QString &newNodeSource) m_model.data()->d->setNodeSource(internalNode(), newNodeSource); } +void ModelNode::setNodeSource(const QString &newNodeSource, NodeSourceType type) +{ + Internal::WriteLocker locker(m_model.data()); + + if (!isValid()) { + Q_ASSERT_X(isValid(), Q_FUNC_INFO, "model node is invalid"); + throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); + } + + if (internalNode()->nodeSourceType() == type && internalNode()->nodeSource() == newNodeSource) + return; + + internalNode()->setNodeSourceType(type); // Set type first as it doesn't trigger any notifies + m_model.data()->d->setNodeSource(internalNode(), newNodeSource); +} + QString ModelNode::nodeSource() const { if (!isValid()) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 3c6a64d02c2..f3fb6f5cfda 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -2086,7 +2086,7 @@ void TextToModelMerger::setupComponent(const ModelNode &node) return; //No object definition found if (node.nodeSource() != result) - ModelNode(node).setNodeSource(result); + ModelNode(node).setNodeSource(result, ModelNode::NodeWithComponentSource); } void TextToModelMerger::collectLinkErrors(QList *errors, const ReadingContext &ctxt) @@ -2256,7 +2256,7 @@ void TextToModelMerger::setupCustomParserNode(const ModelNode &node) return; if (node.nodeSource() != modelText) - ModelNode(node).setNodeSource(modelText); + ModelNode(node).setNodeSource(modelText, ModelNode::NodeWithCustomParserSource); }