diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2024-01-02 15:08:57 +0100 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2024-01-02 15:08:57 +0100 |
commit | e78c5d0ec526f895dea874e763b72f1bdf3b2a2b (patch) | |
tree | fb1d00946df6c60b3e322d994a3aefa6d692853d /editor/scene_tree_dock.cpp | |
parent | e42d615471c2210dc8116e6acf6c5bc2c1fc7f18 (diff) | |
parent | ed648799aed3c2637e80415c4dcacdb896b350d4 (diff) | |
download | redot-engine-e78c5d0ec526f895dea874e763b72f1bdf3b2a2b.tar.gz |
Merge pull request #86211 from TheSofox/node-duplicate-undo-fix
Fix duplicating multiple nodes at different depths in `SceneTreeDock`
Diffstat (limited to 'editor/scene_tree_dock.cpp')
-rw-r--r-- | editor/scene_tree_dock.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 6553a592d0..5d2bd2b61f 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -713,7 +713,14 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { selection.sort_custom<Node::Comparator>(); - Node *add_below_node = selection.back()->get(); + HashMap<const Node *, Node *> add_below_map; + + for (List<Node *>::Element *E = selection.back(); E; E = E->prev()) { + Node *node = E->get(); + if (!add_below_map.has(node->get_parent())) { + add_below_map.insert(node->get_parent(), node); + } + } for (Node *node : selection) { Node *parent = node->get_parent(); @@ -740,7 +747,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { dup->set_name(parent->validate_child_name(dup)); - undo_redo->add_do_method(add_below_node, "add_sibling", dup, true); + undo_redo->add_do_method(add_below_map[parent], "add_sibling", dup, true); for (Node *F : owned) { if (!duplimap.has(F)) { @@ -759,7 +766,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { undo_redo->add_do_method(ed, "live_debug_duplicate_node", edited_scene->get_path_to(node), dup->get_name()); undo_redo->add_undo_method(ed, "live_debug_remove_node", NodePath(String(edited_scene->get_path_to(parent)).path_join(dup->get_name()))); - add_below_node = dup; + add_below_map[parent] = dup; } undo_redo->commit_action(); |