summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRindbee <idleman@yeah.net>2022-11-13 14:52:37 +0800
committerRindbee <idleman@yeah.net>2023-06-12 21:49:30 +0800
commiteb74079dfbebabcab15688495bec7aa748a5bd9c (patch)
treea3e621b907b1729586fa3aac9ec28c4c0926c2ae
parent9f12e7b52d944281a39b7d3a33de6700c76cc23a (diff)
downloadredot-engine-eb74079dfbebabcab15688495bec7aa748a5bd9c.tar.gz
Update the edit scene root in time after it is replaced
When changing the type of the edited scene root node, it may be necessary to update edited scene root in time for the child nodes to work properly.
-rw-r--r--doc/classes/Node.xml7
-rw-r--r--editor/editor_node.cpp9
-rw-r--r--editor/scene_tree_dock.cpp5
-rw-r--r--scene/main/node.cpp4
4 files changed, 17 insertions, 8 deletions
diff --git a/doc/classes/Node.xml b/doc/classes/Node.xml
index 42418b3e8d..7d76676854 100644
--- a/doc/classes/Node.xml
+++ b/doc/classes/Node.xml
@@ -845,6 +845,13 @@
Emitted when the node is renamed.
</description>
</signal>
+ <signal name="replacing_by">
+ <param index="0" name="node" type="Node" />
+ <description>
+ Emitted when this node is being replaced by the [param node], see [method replace_by].
+ This signal is emitted [i]after[/i] [param node] has been added as a child of the original parent node, but [i]before[/i] all original child nodes have been reparented to [param node].
+ </description>
+ </signal>
<signal name="tree_entered">
<description>
Emitted when the node enters the tree.
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
index 3681f61cd8..b441855fc5 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -3430,10 +3430,12 @@ void EditorNode::_remove_scene(int index, bool p_change_tab) {
}
void EditorNode::set_edited_scene(Node *p_scene) {
- if (get_editor_data().get_edited_scene_root()) {
- if (get_editor_data().get_edited_scene_root()->get_parent() == scene_root) {
- scene_root->remove_child(get_editor_data().get_edited_scene_root());
+ Node *old_edited_scene_root = get_editor_data().get_edited_scene_root();
+ if (old_edited_scene_root) {
+ if (old_edited_scene_root->get_parent() == scene_root) {
+ scene_root->remove_child(old_edited_scene_root);
}
+ old_edited_scene_root->disconnect(SNAME("replacing_by"), callable_mp(this, &EditorNode::set_edited_scene));
}
get_editor_data().set_edited_scene_root(p_scene);
@@ -3449,6 +3451,7 @@ void EditorNode::set_edited_scene(Node *p_scene) {
if (p_scene->get_parent() != scene_root) {
scene_root->add_child(p_scene, true);
}
+ p_scene->connect(SNAME("replacing_by"), callable_mp(this, &EditorNode::set_edited_scene));
}
}
diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp
index 96166dab3f..bdb9cd75c3 100644
--- a/editor/scene_tree_dock.cpp
+++ b/editor/scene_tree_dock.cpp
@@ -2468,11 +2468,6 @@ void SceneTreeDock::replace_node(Node *p_node, Node *p_by_node, bool p_keep_prop
}
n->replace_by(newnode, true);
- if (n == edited_scene) {
- edited_scene = newnode;
- EditorNode::get_singleton()->set_edited_scene(newnode);
- }
-
//small hack to make collisionshapes and other kind of nodes to work
for (int i = 0; i < newnode->get_child_count(); i++) {
Node *c = newnode->get_child(i);
diff --git a/scene/main/node.cpp b/scene/main/node.cpp
index b947526e96..8f3c8453cc 100644
--- a/scene/main/node.cpp
+++ b/scene/main/node.cpp
@@ -2500,6 +2500,8 @@ void Node::replace_by(Node *p_node, bool p_keep_groups) {
parent->move_child(p_node, index_in_parent);
}
+ emit_signal(SNAME("replacing_by"), p_node);
+
while (get_child_count()) {
Node *child = get_child(0);
remove_child(child);
@@ -3040,7 +3042,9 @@ void Node::_bind_methods() {
ADD_SIGNAL(MethodInfo("tree_exited"));
ADD_SIGNAL(MethodInfo("child_entered_tree", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT, "Node")));
ADD_SIGNAL(MethodInfo("child_exiting_tree", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT, "Node")));
+
ADD_SIGNAL(MethodInfo("child_order_changed"));
+ ADD_SIGNAL(MethodInfo("replacing_by", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT, "Node")));
ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "name", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_name", "get_name");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "unique_name_in_owner", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR), "set_unique_name_in_owner", "is_unique_name_in_owner");