summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--editor/scene_tree_dock.cpp36
1 files changed, 27 insertions, 9 deletions
diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp
index d9c95b1944..75dc840738 100644
--- a/editor/scene_tree_dock.cpp
+++ b/editor/scene_tree_dock.cpp
@@ -1318,32 +1318,50 @@ void SceneTreeDock::perform_node_renames(Node *p_base, List<Pair<NodePath, NodeP
if (si) {
List<PropertyInfo> properties;
si->get_property_list(&properties);
+ NodePath root_path = p_base->get_path();
for (List<PropertyInfo>::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) {
- // Goes through all paths to check if its matching
+ NodePath root_path_new = root_path;
for (List<Pair<NodePath, NodePath>>::Element *F = p_renames->front(); F; F = F->next()) {
- NodePath root_path = p_base->get_path();
+ if (root_path == F->get().first) {
+ root_path_new = F->get().second;
+ break;
+ }
+ }
+ // Goes through all paths to check if its matching
+ for (List<Pair<NodePath, NodePath>>::Element *F = p_renames->front(); F; F = F->next()) {
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);
p_base->set(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);
+ }
}
}
}