diff --git a/Sources/OvEditor/include/OvEditor/Core/EditorActions.h b/Sources/OvEditor/include/OvEditor/Core/EditorActions.h index 5d43ef7e..d7f8819e 100644 --- a/Sources/OvEditor/include/OvEditor/Core/EditorActions.h +++ b/Sources/OvEditor/include/OvEditor/Core/EditorActions.h @@ -222,9 +222,16 @@ namespace OvEditor::Core * Duplicate an actor * @param p_toDuplicate * @param p_forcedParent - * @param bool - */ - void DuplicateActor(OvCore::ECS::Actor& p_toDuplicate, OvCore::ECS::Actor* p_forcedParent = nullptr, bool p_focus = true); + * @param p_focus + * @param p_keepSourceParentIfNoForcedParent + */ + void DuplicateActor + ( + OvCore::ECS::Actor& p_toDuplicate, + OvCore::ECS::Actor* p_forcedParent = nullptr, + bool p_focus = true, + bool p_keepSourceParentIfNoForcedParent = true + ); #pragma endregion #pragma region ACTOR_MANIPULATION @@ -235,7 +242,8 @@ namespace OvEditor::Core void CopyActor(OvCore::ECS::Actor& p_actor); /** - * Paste the copied actor next to the given actor (same parent), or at root if null + * Paste the copied actor next to the given actor (same parent), or at root if null. + * If the target actor is at root, the pasted actor is also pasted at root. * @param p_parent */ void PasteActor(OvCore::ECS::Actor* p_parent = nullptr); diff --git a/Sources/OvEditor/src/OvEditor/Core/EditorActions.cpp b/Sources/OvEditor/src/OvEditor/Core/EditorActions.cpp index 8d2a725d..c9507762 100644 --- a/Sources/OvEditor/src/OvEditor/Core/EditorActions.cpp +++ b/Sources/OvEditor/src/OvEditor/Core/EditorActions.cpp @@ -840,7 +840,13 @@ std::string FindDuplicatedActorUniqueName(OvCore::ECS::Actor& p_duplicated, OvCo return OvTools::Utils::String::GenerateUnique(p_duplicated.GetName(), availabilityChecker); } -void OvEditor::Core::EditorActions::DuplicateActor(OvCore::ECS::Actor & p_toDuplicate, OvCore::ECS::Actor* p_forcedParent, bool p_focus) +void OvEditor::Core::EditorActions::DuplicateActor +( + OvCore::ECS::Actor& p_toDuplicate, + OvCore::ECS::Actor* p_forcedParent, + bool p_focus, + bool p_keepSourceParentIfNoForcedParent +) { tinyxml2::XMLDocument doc; tinyxml2::XMLNode* actorsRoot = doc.NewElement("actors"); @@ -859,7 +865,7 @@ void OvEditor::Core::EditorActions::DuplicateActor(OvCore::ECS::Actor & p_toDupl { newActor.SetParent(*p_forcedParent); } - else if (newActor.GetParentID() > 0) + else if (p_keepSourceParentIfNoForcedParent && newActor.GetParentID() > 0) { if (auto found = currentScene->FindActorByID(newActor.GetParentID()); found) { @@ -914,7 +920,7 @@ void OvEditor::Core::EditorActions::PasteActor(OvCore::ECS::Actor* p_parent) destinationParent = destinationParent->GetParent(); } - DuplicateActor(*copiedActor, destinationParent, true); + DuplicateActor(*copiedActor, destinationParent, true, false); } } diff --git a/Sources/OvEditor/src/OvEditor/Panels/Hierarchy.cpp b/Sources/OvEditor/src/OvEditor/Panels/Hierarchy.cpp index b76fb75d..15642698 100644 --- a/Sources/OvEditor/src/OvEditor/Panels/Hierarchy.cpp +++ b/Sources/OvEditor/src/OvEditor/Panels/Hierarchy.cpp @@ -65,7 +65,7 @@ class ActorContextualMenu : public OvUI::Plugins::ContextualMenu auto& duplicateButton = CreateWidget("Duplicate"); duplicateButton.ClickedEvent += [this] { - EDITOR_EXEC(DelayAction(EDITOR_BIND(DuplicateActor, std::ref(*m_target), nullptr, true), 0)); + EDITOR_EXEC(DelayAction(EDITOR_BIND(DuplicateActor, std::ref(*m_target), nullptr, true, true), 0)); }; auto& pasteButton = CreateWidget("Paste");