summaryrefslogtreecommitdiff
path: root/scene/main
diff options
context:
space:
mode:
authorPedro J. Estébanez <pedrojrulez@gmail.com>2021-12-01 14:28:59 +0100
committerPedro J. Estébanez <pedrojrulez@gmail.com>2021-12-01 14:28:59 +0100
commit0a0381dd0adc84fd240b0eeeb4dbf0c66524307f (patch)
tree3abf6c6fa622c062287d82dbd1e590f579d16dff /scene/main
parent52b7d5fa347fb88aa016e1e30414abd01e800381 (diff)
Rationalize Node removals and deletions
- Regarding preservation of owner, `free()` and `remove_child()` now behave the same: owner is kept during `tree_exiting` signal and `null` during `tree_exited`. - `tree_exited` is emitted in the same order as `tree_exiting`. - Superfluous code to handle cancelation of ownership is removed.
Diffstat (limited to 'scene/main')
-rw-r--r--scene/main/node.cpp42
-rw-r--r--scene/main/node.h1
2 files changed, 5 insertions, 38 deletions
diff --git a/scene/main/node.cpp b/scene/main/node.cpp
index 0d646ff2a9..6aff006b99 100644
--- a/scene/main/node.cpp
+++ b/scene/main/node.cpp
@@ -152,12 +152,6 @@ void Node::_notification(int p_notification) {
data.in_constructor = false;
} break;
case NOTIFICATION_PREDELETE: {
- set_owner(nullptr);
-
- while (data.owned.size()) {
- data.owned.front()->get()->set_owner(nullptr);
- }
-
if (data.parent) {
data.parent->remove_child(this);
}
@@ -165,10 +159,8 @@ void Node::_notification(int p_notification) {
// kill children as cleanly as possible
while (data.children.size()) {
Node *child = data.children[data.children.size() - 1]; //begin from the end because its faster and more consistent with creation
- remove_child(child);
memdelete(child);
}
-
} break;
}
}
@@ -237,8 +229,12 @@ void Node::_propagate_enter_tree() {
}
void Node::_propagate_after_exit_tree() {
+ if (data.owner) {
+ data.owner->data.owned.erase(data.OW);
+ data.owner = nullptr;
+ }
data.blocked++;
- for (int i = 0; i < data.children.size(); i++) {
+ for (int i = data.children.size() - 1; i >= 0; i--) {
data.children[i]->_propagate_after_exit_tree();
}
data.blocked--;
@@ -1144,31 +1140,6 @@ void Node::add_sibling(Node *p_sibling, bool p_legible_unique_name) {
data.parent->_move_child(p_sibling, get_index() + 1);
}
-void Node::_propagate_validate_owner() {
- if (data.owner) {
- bool found = false;
- Node *parent = data.parent;
-
- while (parent) {
- if (parent == data.owner) {
- found = true;
- break;
- }
-
- parent = parent->data.parent;
- }
-
- if (!found) {
- data.owner->data.owned.erase(data.OW);
- data.owner = nullptr;
- }
- }
-
- for (int i = 0; i < data.children.size(); i++) {
- data.children[i]->_propagate_validate_owner();
- }
-}
-
void Node::remove_child(Node *p_child) {
ERR_FAIL_NULL(p_child);
ERR_FAIL_COND_MSG(data.blocked > 0, "Parent node is busy setting up children, remove_node() failed. Consider using call_deferred(\"remove_child\", child) instead.");
@@ -1222,9 +1193,6 @@ void Node::remove_child(Node *p_child) {
p_child->data.parent = nullptr;
p_child->data.pos = -1;
- // validate owner
- p_child->_propagate_validate_owner();
-
if (data.inside_tree) {
p_child->_propagate_after_exit_tree();
}
diff --git a/scene/main/node.h b/scene/main/node.h
index dc74a33580..1ea0422f25 100644
--- a/scene/main/node.h
+++ b/scene/main/node.h
@@ -172,7 +172,6 @@ private:
void _propagate_ready();
void _propagate_exit_tree();
void _propagate_after_exit_tree();
- void _propagate_validate_owner();
void _print_stray_nodes();
void _propagate_process_owner(Node *p_owner, int p_pause_notification, int p_enabled_notification);
Array _get_node_and_resource(const NodePath &p_path);