From 41441765cd70e34f0bb5361171799bcd1e371f6d Mon Sep 17 00:00:00 2001 From: Chia-Hsiang Cheng <88014292+garychia@users.noreply.github.com> Date: Sat, 26 Aug 2023 22:00:36 +0800 Subject: [PATCH] Avoid creating any useless undo action when dragging nodes in place --- editor/scene_tree_dock.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 3096d20c19f7..7caac66b2a3e 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -1911,6 +1911,8 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V p_nodes.sort_custom(); //Makes result reliable. + const int first_idx = p_position_in_parent == -1 ? p_new_parent->get_child_count(false) : p_position_in_parent; + int nodes_before = first_idx; bool no_change = true; for (int ni = 0; ni < p_nodes.size(); ni++) { if (p_nodes[ni] == p_new_parent) { @@ -1919,7 +1921,17 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V // `move_child` + `get_index` doesn't really work for internal nodes. ERR_FAIL_COND_MSG(p_nodes[ni]->get_internal_mode() != INTERNAL_MODE_DISABLED, "Trying to move internal node, this is not supported."); - if (p_nodes[ni]->get_parent() != p_new_parent || p_position_in_parent + ni != p_nodes[ni]->get_index(false)) { + if (p_nodes[ni]->get_index(false) < first_idx) { + nodes_before--; + } + + if (p_nodes[ni]->get_parent() != p_new_parent) { + no_change = false; + } + } + + for (int ni = 0; ni < p_nodes.size() && no_change; ni++) { + if (p_nodes[ni]->get_index(false) != nodes_before + ni) { no_change = false; } }