diff --git a/src/plugins/qmldesigner/designercore/include/modelmerger.h b/src/plugins/qmldesigner/designercore/include/modelmerger.h index 28541d3b98b..790cc8de1e7 100644 --- a/src/plugins/qmldesigner/designercore/include/modelmerger.h +++ b/src/plugins/qmldesigner/designercore/include/modelmerger.h @@ -28,19 +28,24 @@ #include #include +#include namespace QmlDesigner { class AbstractView; class ModelNode; +using MergePredicate = std::function; + class QMLDESIGNERCORE_EXPORT ModelMerger { public: ModelMerger(AbstractView *view) : m_view(view) {} - ModelNode insertModel(const ModelNode &modelNode); - void replaceModel(const ModelNode &modelNode); + ModelNode insertModel(const ModelNode &modelNode, + const MergePredicate &predicate = [](const ModelNode &) { return true; }); + void replaceModel(const ModelNode &modelNode, + const MergePredicate &predicate = [](const ModelNode &) { return true; }); protected: AbstractView *view() const diff --git a/src/plugins/qmldesigner/designercore/model/modelmerger.cpp b/src/plugins/qmldesigner/designercore/model/modelmerger.cpp index 8213109c034..6bf80dfd570 100644 --- a/src/plugins/qmldesigner/designercore/model/modelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelmerger.cpp @@ -43,7 +43,9 @@ namespace QmlDesigner { -static ModelNode createNodeFromNode(const ModelNode &modelNode,const QHash &idRenamingHash, AbstractView *view); +static ModelNode createNodeFromNode(const ModelNode &modelNode, + const QHash &idRenamingHash, + AbstractView *view, const MergePredicate &mergePredicate); static QString fixExpression(const QString &expression, const QHash &idRenamingHash) { @@ -130,25 +132,36 @@ static void setupIdRenamingHash(const ModelNode &modelNode, QHash &idRenamingHash, AbstractView *view) +static void syncNodeProperties(ModelNode &outputNode, const ModelNode &inputNode, + const QHash &idRenamingHash, + AbstractView *view, const MergePredicate &mergePredicate) { foreach (const NodeProperty &nodeProperty, inputNode.nodeProperties()) { - ModelNode newNode = createNodeFromNode(nodeProperty.modelNode(), idRenamingHash, view); + ModelNode node = nodeProperty.modelNode(); + if (!mergePredicate(node)) + continue; + ModelNode newNode = createNodeFromNode(node, idRenamingHash, view, mergePredicate); outputNode.nodeProperty(nodeProperty.name()).reparentHere(newNode); } } -static void syncNodeListProperties(ModelNode &outputNode, const ModelNode &inputNode, const QHash &idRenamingHash, AbstractView *view) +static void syncNodeListProperties(ModelNode &outputNode, const ModelNode &inputNode, + const QHash &idRenamingHash, + AbstractView *view, const MergePredicate &mergePredicate) { foreach (const NodeListProperty &nodeListProperty, inputNode.nodeListProperties()) { foreach (const ModelNode &node, nodeListProperty.toModelNodeList()) { - ModelNode newNode = createNodeFromNode(node, idRenamingHash, view); + if (!mergePredicate(node)) + continue; + ModelNode newNode = createNodeFromNode(node, idRenamingHash, view, mergePredicate); outputNode.nodeListProperty(nodeListProperty.name()).reparentHere(newNode); } } } -static ModelNode createNodeFromNode(const ModelNode &modelNode,const QHash &idRenamingHash, AbstractView *view) +static ModelNode createNodeFromNode(const ModelNode &modelNode, + const QHash &idRenamingHash, + AbstractView *view, const MergePredicate &mergePredicate) { QList > propertyList; QList > variantPropertyList; @@ -162,14 +175,17 @@ static ModelNode createNodeFromNode(const ModelNode &modelNode,const QHashbeginRewriterTransaction(QByteArrayLiteral("ModelMerger::insertModel"))); QList newImports; @@ -183,32 +199,36 @@ ModelNode ModelMerger::insertModel(const ModelNode &modelNode) QHash idRenamingHash; setupIdRenamingHash(modelNode, idRenamingHash, view()); - ModelNode newNode(createNodeFromNode(modelNode, idRenamingHash, view())); + ModelNode newNode(createNodeFromNode(modelNode, idRenamingHash, view(), predicate)); return newNode; } -void ModelMerger::replaceModel(const ModelNode &modelNode) + +void ModelMerger::replaceModel(const ModelNode &modelNode, const MergePredicate &predicate) { - view()->model()->changeImports(modelNode.model()->imports(), {}); - view()->model()->setFileUrl(modelNode.model()->fileUrl()); + if (!predicate(modelNode)) + return; - view()->executeInTransaction("ModelMerger::replaceModel", [this, modelNode](){ - ModelNode rootNode(view()->rootModelNode()); + view()->model()->changeImports(modelNode.model()->imports(), {}); + view()->model()->setFileUrl(modelNode.model()->fileUrl()); - foreach (const PropertyName &propertyName, rootNode.propertyNames()) - rootNode.removeProperty(propertyName); + view()->executeInTransaction("ModelMerger::replaceModel", [this, modelNode, &predicate](){ + ModelNode rootNode(view()->rootModelNode()); - QHash idRenamingHash; - setupIdRenamingHash(modelNode, idRenamingHash, view()); + foreach (const PropertyName &propertyName, rootNode.propertyNames()) + rootNode.removeProperty(propertyName); - syncAuxiliaryProperties(rootNode, modelNode); - syncVariantProperties(rootNode, modelNode); - syncBindingProperties(rootNode, modelNode, idRenamingHash); - syncId(rootNode, modelNode, idRenamingHash); - syncNodeProperties(rootNode, modelNode, idRenamingHash, view()); - syncNodeListProperties(rootNode, modelNode, idRenamingHash, view()); - m_view->changeRootNodeType(modelNode.type(), modelNode.majorVersion(), modelNode.minorVersion()); - }); + QHash idRenamingHash; + setupIdRenamingHash(modelNode, idRenamingHash, view()); + + syncAuxiliaryProperties(rootNode, modelNode); + syncVariantProperties(rootNode, modelNode); + syncBindingProperties(rootNode, modelNode, idRenamingHash); + syncId(rootNode, modelNode, idRenamingHash); + syncNodeProperties(rootNode, modelNode, idRenamingHash, view(), predicate); + syncNodeListProperties(rootNode, modelNode, idRenamingHash, view(), predicate); + m_view->changeRootNodeType(modelNode.type(), modelNode.majorVersion(), modelNode.minorVersion()); + }); } } //namespace QmlDesigner