diff --git a/libs/scene/merge/MergeAction.h b/libs/scene/merge/MergeAction.h index 718e4448cb..b54f65b3a6 100644 --- a/libs/scene/merge/MergeAction.h +++ b/libs/scene/merge/MergeAction.h @@ -127,6 +127,9 @@ class AddCloneToParentAction : assert(_node); assert(Node_getCloneable(node)); + auto* entity = Node_getEntity(node); + _modelIsEqualToName = entity && entity->getKeyValue("name") == entity->getKeyValue("model"); + // No post-clone callback since we don't care about selection groups right now _cloneToBeInserted = cloneNodeIncludingDescendants(_node, PostCloneCallback()); @@ -143,17 +146,12 @@ class AddCloneToParentAction : { child->moveToLayer(activeLayer); return true; }); - - auto* entity = Node_getEntity(_cloneToBeInserted); - - _modelIsEqualToName = entity && entity->getKeyValue("name") == entity->getKeyValue("model"); } public: - void applyChanges() override + void addSourceNodeToScene() { - if (!isActive()) return; - + // Get the clone and add it to the target scene, it needs to be renderable here addNodeToContainer(_cloneToBeInserted, _parent); // Check if we need to synchronise the model and name key values @@ -173,6 +171,18 @@ class AddCloneToParentAction : } } + void removeSourceNodeFromScene() + { + removeNodeFromParent(_cloneToBeInserted); + } + + void applyChanges() override + { + if (!isActive()) return; + + addSourceNodeToScene(); + } + const INodePtr& getParent() const { return _parent; diff --git a/libs/scene/merge/MergeActionNode.cpp b/libs/scene/merge/MergeActionNode.cpp index 50a849c62c..dff62595cb 100644 --- a/libs/scene/merge/MergeActionNode.cpp +++ b/libs/scene/merge/MergeActionNode.cpp @@ -313,7 +313,7 @@ void RegularMergeActionNode::addPreviewNodeForAddAction() if (addNodeAction) { // Get the clone and add it to the target scene, it needs to be renderable here - addNodeToContainer(_affectedNode, addNodeAction->getParent()); + addNodeAction->addSourceNodeToScene(); } } @@ -323,7 +323,7 @@ void RegularMergeActionNode::removePreviewNodeForAddAction() if (addNodeAction) { - removeNodeFromParent(_affectedNode); + addNodeAction->removeSourceNodeFromScene(); } } diff --git a/libs/scene/merge/MergeLib.h b/libs/scene/merge/MergeLib.h index 046d8840ea..c448bbb136 100644 --- a/libs/scene/merge/MergeLib.h +++ b/libs/scene/merge/MergeLib.h @@ -248,7 +248,7 @@ inline void resolveConflictByKeepingBothEntities() // Add the action to import the source node as a whole const auto& pair = *sourceAndTargetEntities.begin(); - auto addSourceEntityAction = std::make_shared(pair.first, pair.second->getRootNode()); // TODO: AddEntityAction needs to check model spawnarg + auto addSourceEntityAction = std::make_shared(pair.first, pair.second->getRootNode()); operation->addAction(addSourceEntityAction); // TODO: Observer pattern to notify Map class