From b426e58acd5c426937f127c7cc2c267d0c24c40c Mon Sep 17 00:00:00 2001 From: Marcus Brummer Date: Thu, 24 Sep 2020 18:14:21 +0200 Subject: [PATCH] Fixed renaming/moving of nodes with exported NodePaths (cherry picked from commit fdec257e58f78fb13691a8ffde13370af1e41a5e) --- editor/scene_tree_dock.cpp | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 8626a00da81..94b8a538bc1 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -1329,29 +1329,33 @@ void SceneTreeDock::perform_node_renames(Node *p_base, List properties; si->get_property_list(&properties); + NodePath root_path = p_base->get_path(); for (List::Element *E = properties.front(); E; E = E->next()) { String propertyname = E->get().name; Variant p = p_base->get(propertyname); if (p.get_type() == Variant::NODE_PATH) { + NodePath root_path_new = root_path; + for (List >::Element *F = p_renames->front(); F; F = F->next()) { + if (root_path == F->get().first) { + root_path_new = F->get().second; + break; + } + } // Goes through all paths to check if its matching for (List >::Element *F = p_renames->front(); F; F = F->next()) { - - NodePath root_path = p_base->get_path(); - NodePath rel_path_old = root_path.rel_path_to(F->get().first); - NodePath rel_path_new = F->get().second; - - // if not empty, get new relative path - if (F->get().second != NodePath()) { - rel_path_new = root_path.rel_path_to(F->get().second); - } - // if old path detected, then it needs to be replaced with the new one if (p == rel_path_old) { + NodePath rel_path_new = F->get().second; + + // if not empty, get new relative path + if (!rel_path_new.is_empty()) { + rel_path_new = root_path_new.rel_path_to(F->get().second); + } editor_data->get_undo_redo().add_do_property(p_base, propertyname, rel_path_new); editor_data->get_undo_redo().add_undo_property(p_base, propertyname, rel_path_old); @@ -1359,6 +1363,17 @@ void SceneTreeDock::perform_node_renames(Node *p_base, Listset(propertyname, rel_path_new); break; } + + // update if the node itself moved up/down the tree hirarchy + if (root_path == F->get().first) { + NodePath abs_path = NodePath(String(root_path).plus_file(p)).simplified(); + NodePath rel_path_new = F->get().second.rel_path_to(abs_path); + + editor_data->get_undo_redo().add_do_property(p_base, propertyname, rel_path_new); + editor_data->get_undo_redo().add_undo_property(p_base, propertyname, p); + + p_base->set(propertyname, rel_path_new); + } } } }