From 46301159527087c9d0d51b00c4684b5b9f24fba7 Mon Sep 17 00:00:00 2001 From: oreyg Date: Tue, 30 Dec 2025 03:44:16 +0100 Subject: [PATCH] Add scene hierarchy change to command history --- src/commands/nodeCommand.cpp | 21 +++++++++++++++++++++ src/commands/nodeCommand.hpp | 19 +++++++++++++++++++ src/uiManager.cpp | 11 ++++------- 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/commands/nodeCommand.cpp b/src/commands/nodeCommand.cpp index af0877d..e7a0d3e 100644 --- a/src/commands/nodeCommand.cpp +++ b/src/commands/nodeCommand.cpp @@ -45,4 +45,25 @@ namespace Command return createCommand; } + ReparentSceneNode::ReparentSceneNode(Scene* inScene, SceneNode* inSceneNode, SceneNode* inNewParent) + { + m_scene = inScene; + m_nodeHandle = inScene->findHandleOfNode(inSceneNode); + m_newParentIsScene = inNewParent == inScene; + m_oldParentIsScene = inSceneNode->parent == inScene; + m_newParentHandle = inScene->findHandleOfNode(inNewParent); + m_oldParentHandle = inScene->findHandleOfNode(inSceneNode->parent); + } + + std::unique_ptr ReparentSceneNode::exec() + { + SceneNode* node = m_scene->getNodeByHandle(m_nodeHandle); + SceneNode* newParentNode = m_newParentIsScene ? m_scene : m_scene->getNodeByHandle(m_newParentHandle); + SceneNode* oldParentNode = m_oldParentIsScene ? m_scene : m_scene->getNodeByHandle(m_oldParentHandle); + std::unique_ptr nodePtr = oldParentNode->removeChild(node); + newParentNode->addChild(std::move(nodePtr)); + auto reparentCommand = std::make_unique(m_scene, node, oldParentNode); + return reparentCommand; + } + } diff --git a/src/commands/nodeCommand.hpp b/src/commands/nodeCommand.hpp index 5f4dc7b..c5dda66 100644 --- a/src/commands/nodeCommand.hpp +++ b/src/commands/nodeCommand.hpp @@ -40,4 +40,23 @@ namespace Command SceneNodeHandle m_nodeHandle; }; + class ReparentSceneNode final : public CommandBase + { + public: + ReparentSceneNode( + Scene* inScene, + SceneNode* inSceneNode, + SceneNode* inNewParent); + + protected: + virtual std::unique_ptr exec() override; + + Scene* m_scene = nullptr; + SceneNodeHandle m_nodeHandle; + SceneNodeHandle m_newParentHandle; + SceneNodeHandle m_oldParentHandle; + bool m_oldParentIsScene = false; + bool m_newParentIsScene = false; + }; + }; diff --git a/src/uiManager.cpp b/src/uiManager.cpp index 9a6369e..9ed7a3b 100644 --- a/src/uiManager.cpp +++ b/src/uiManager.cpp @@ -553,8 +553,8 @@ void UIManager::drawSceneGraph() SceneNode* draggedNode = *(SceneNode**)payload->Data; if (draggedNode && draggedNode->parent) { - std::unique_ptr nodePtr = draggedNode->parent->removeChild(draggedNode); - m_scene->addChild(std::move(nodePtr)); + auto reparentSceneNode = std::make_unique(m_scene, draggedNode, m_scene); + m_commandManager->commitCommand(std::move(reparentSceneNode)); } } ImGui::EndDragDropTarget(); @@ -666,11 +666,8 @@ void UIManager::handleNodeDragDrop(SceneNode* targetNode) SceneNode* draggedNode = *reinterpret_cast(payload->Data); if (draggedNode && draggedNode != targetNode && draggedNode->parent) { - std::unique_ptr nodePtr = draggedNode->parent->removeChild(draggedNode); - if (nodePtr) - { - targetNode->addChild(std::move(nodePtr)); - } + auto reparentSceneNode = std::make_unique(m_scene, draggedNode, targetNode); + m_commandManager->commitCommand(std::move(reparentSceneNode)); } } ImGui::EndDragDropTarget();