From b4998e7e1b1f8c04b6a9472a9a24a0d65851f121 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20J=2E=20Est=C3=A9banez?= Date: Wed, 1 Dec 2021 14:43:17 +0100 Subject: [PATCH] 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`. - Superfluous code to handle cancelation of ownership is removed. --- scene/main/node.cpp | 40 ++++------------------------------------ scene/main/node.h | 1 - 2 files changed, 4 insertions(+), 37 deletions(-) diff --git a/scene/main/node.cpp b/scene/main/node.cpp index 0e2af71ce68..c51754ba792 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -151,12 +151,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); } @@ -164,10 +158,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; } } @@ -242,6 +234,10 @@ 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++) { data.children[i]->_propagate_after_exit_tree(); @@ -1153,31 +1149,6 @@ void Node::add_child_below_node(Node *p_node, Node *p_child, bool p_legible_uniq } } -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."); @@ -1226,9 +1197,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 1f37f2e6fca..5577defdca5 100644 --- a/scene/main/node.h +++ b/scene/main/node.h @@ -162,7 +162,6 @@ private: void _propagate_ready(); void _propagate_exit_tree(); void _propagate_after_exit_tree(); - void _propagate_validate_owner(); void _print_stray_nodes(); void _propagate_pause_owner(Node *p_owner); Array _get_node_and_resource(const NodePath &p_path);