From 526d2996236c36d5411b5303c995cfa8e9d57b2a Mon Sep 17 00:00:00 2001 From: SnailRhymer Date: Sun, 17 Jul 2022 23:16:43 +0100 Subject: [PATCH] Stop pasted child nodes being assigned an owner when previously unowned Make copy and pasting match duplication's ownership transferral behavior by storing ownership information in the duplicated nodes on the node clipboard, then checking that information when setting owners for pasted nodes. --- editor/scene_tree_dock.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index d8f1d92e446..b6e5ddafe24 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -482,6 +482,20 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { ERR_CONTINUE(!dup); + // Preserve ownership relations ready for pasting. + List owned; + node->get_owned_by(node->get_owner(), &owned); + + for (Node *F : owned) { + if (!duplimap.has(F) || F == node) { + continue; + } + Node *d = duplimap[F]; + // Only use this as a marker that ownership needs to be assigned when pasting. + // The actual owner doesn't matter. + d->set_owner(dup); + } + node_clipboard.push_back(dup); } @@ -3239,7 +3253,8 @@ List SceneTreeDock::paste_nodes() { for (KeyValue &E2 : duplimap) { Node *d = E2.value; - if (d != dup) { + // When copying, all nodes that should have an owner assigned here were given node as an owner. + if (d != dup && E2.key->get_owner() == node) { ur->add_do_method(d, "set_owner", owner); } }