From 621080096a4e8730e23afa482a28a0e5c436f21d Mon Sep 17 00:00:00 2001 From: Janos Bonic <86970079+janosdebugs@users.noreply.github.com> Date: Mon, 15 Apr 2024 18:07:59 +0200 Subject: [PATCH] Fixes godotengine/godot-proposals#8850: Synchronously notify the scene tree of changes --- doc/classes/SceneTree.xml | 6 ++++++ scene/main/node.cpp | 2 ++ scene/main/scene_tree.cpp | 5 +++++ scene/main/scene_tree.h | 2 ++ 4 files changed, 15 insertions(+) diff --git a/doc/classes/SceneTree.xml b/doc/classes/SceneTree.xml index bae5fe12054be..4d39618169221 100644 --- a/doc/classes/SceneTree.xml +++ b/doc/classes/SceneTree.xml @@ -278,6 +278,12 @@ + + + + Emitted before the [param node] enters this tree. + + diff --git a/scene/main/node.cpp b/scene/main/node.cpp index 5c5049759f224..fd2e57edd3ad6 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -291,6 +291,8 @@ void Node::_propagate_enter_tree() { E.value.group = data.tree->add_to_group(E.key, this); } + data.tree->node_adding(this); + notification(NOTIFICATION_ENTER_TREE); GDVIRTUAL_CALL(_enter_tree); diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index 04dd38fb5d2b2..fa7b795630cec 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -123,6 +123,10 @@ void SceneTree::tree_changed() { emit_signal(tree_changed_name); } +void SceneTree::node_adding(Node *p_node) { + emit_signal(node_adding_name, p_node); +} + void SceneTree::node_added(Node *p_node) { emit_signal(node_added_name, p_node); } @@ -1679,6 +1683,7 @@ void SceneTree::_bind_methods() { ADD_SIGNAL(MethodInfo("tree_changed")); ADD_SIGNAL(MethodInfo("tree_process_mode_changed")); //editor only signal, but due to API hash it can't be removed in run-time + ADD_SIGNAL(MethodInfo("node_adding", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, "Node"))); ADD_SIGNAL(MethodInfo("node_added", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, "Node"))); ADD_SIGNAL(MethodInfo("node_removed", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, "Node"))); ADD_SIGNAL(MethodInfo("node_renamed", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, "Node"))); diff --git a/scene/main/scene_tree.h b/scene/main/scene_tree.h index c9f3a4de1f97d..0c5fd395eb9b6 100644 --- a/scene/main/scene_tree.h +++ b/scene/main/scene_tree.h @@ -140,6 +140,7 @@ class SceneTree : public MainLoop { bool _physics_interpolation_enabled = false; StringName tree_changed_name = "tree_changed"; + StringName node_adding_name = "node_adding"; StringName node_added_name = "node_added"; StringName node_removed_name = "node_removed"; StringName node_renamed_name = "node_renamed"; @@ -204,6 +205,7 @@ class SceneTree : public MainLoop { friend class Node; void tree_changed(); + void node_adding(Node *p_node); void node_added(Node *p_node); void node_removed(Node *p_node); void node_renamed(Node *p_node);