summaryrefslogtreecommitdiff
path: root/editor/scene_tree_dock.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'editor/scene_tree_dock.cpp')
-rw-r--r--editor/scene_tree_dock.cpp56
1 files changed, 41 insertions, 15 deletions
diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp
index ce869feddd..c4e90ca3ff 100644
--- a/editor/scene_tree_dock.cpp
+++ b/editor/scene_tree_dock.cpp
@@ -1115,7 +1115,7 @@ void SceneTreeDock::_notification(int p_what) {
beginner_node_shortcuts->set_name("BeginnerNodeShortcuts");
node_shortcuts->add_child(beginner_node_shortcuts);
- Button *button_2d = memnew(Button);
+ button_2d = memnew(Button);
beginner_node_shortcuts->add_child(button_2d);
button_2d->set_text(TTR("2D Scene"));
button_2d->set_icon(get_theme_icon("Node2D", "EditorIcons"));
@@ -1127,7 +1127,7 @@ void SceneTreeDock::_notification(int p_what) {
button_3d->set_icon(get_theme_icon("Node3D", "EditorIcons"));
button_3d->connect("pressed", callable_mp(this, &SceneTreeDock::_tool_selected), make_binds(TOOL_CREATE_3D_SCENE, false));
- Button *button_ui = memnew(Button);
+ button_ui = memnew(Button);
beginner_node_shortcuts->add_child(button_ui);
button_ui->set_text(TTR("User Interface"));
button_ui->set_icon(get_theme_icon("Control", "EditorIcons"));
@@ -1137,11 +1137,11 @@ void SceneTreeDock::_notification(int p_what) {
favorite_node_shortcuts->set_name("FavoriteNodeShortcuts");
node_shortcuts->add_child(favorite_node_shortcuts);
- Button *button_custom = memnew(Button);
+ button_custom = memnew(Button);
node_shortcuts->add_child(button_custom);
button_custom->set_text(TTR("Other Node"));
button_custom->set_icon(get_theme_icon("Add", "EditorIcons"));
- button_custom->connect("pressed", callable_mp(this, &SceneTreeDock::_tool_selected), make_binds(TOOL_NEW, false));
+ button_custom->connect("pressed", callable_bind(callable_mp(this, &SceneTreeDock::_tool_selected), TOOL_NEW, false));
node_shortcuts->add_spacer();
create_root_dialog->add_child(node_shortcuts);
@@ -1160,6 +1160,10 @@ void SceneTreeDock::_notification(int p_what) {
button_instance->set_icon(get_theme_icon("Instance", "EditorIcons"));
button_create_script->set_icon(get_theme_icon("ScriptCreate", "EditorIcons"));
button_detach_script->set_icon(get_theme_icon("ScriptRemove", "EditorIcons"));
+ button_2d->set_icon(get_theme_icon("Node2D", "EditorIcons"));
+ button_3d->set_icon(get_theme_icon("Node3D", "EditorIcons"));
+ button_ui->set_icon(get_theme_icon("Control", "EditorIcons"));
+ button_custom->set_icon(get_theme_icon("Add", "EditorIcons"));
filter->set_right_icon(get_theme_icon("Search", "EditorIcons"));
filter->set_clear_button_enabled(true);
@@ -1314,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);
+ }
}
}
}
@@ -2085,8 +2107,12 @@ void SceneTreeDock::replace_node(Node *p_node, Node *p_by_node, bool p_keep_prop
}
if (E->get().name == "__meta__") {
- if (Object::cast_to<CanvasItem>(newnode)) {
- Dictionary metadata = n->get(E->get().name);
+ Dictionary metadata = n->get(E->get().name);
+ if (metadata.has("_editor_description_")) {
+ newnode->set_meta("_editor_description_", metadata["_editor_description_"]);
+ }
+
+ if (Object::cast_to<CanvasItem>(newnode) || Object::cast_to<Node3D>(newnode)) {
if (metadata.has("_edit_group_") && metadata["_edit_group_"]) {
newnode->set_meta("_edit_group_", true);
}