Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions Sources/OvEditor/include/OvEditor/Core/EditorActions.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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);
Expand Down
12 changes: 9 additions & 3 deletions Sources/OvEditor/src/OvEditor/Core/EditorActions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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)
{
Expand Down Expand Up @@ -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);
}
}

Expand Down
2 changes: 1 addition & 1 deletion Sources/OvEditor/src/OvEditor/Panels/Hierarchy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ class ActorContextualMenu : public OvUI::Plugins::ContextualMenu
auto& duplicateButton = CreateWidget<OvUI::Widgets::Menu::MenuItem>("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<OvUI::Widgets::Menu::MenuItem>("Paste");
Expand Down