|
@@ -229,15 +229,32 @@ void Node::_propagate_enter_tree() {
|
|
}
|
|
}
|
|
|
|
|
|
void Node::_propagate_after_exit_tree() {
|
|
void Node::_propagate_after_exit_tree() {
|
|
|
|
+ // Clear owner if it was not part of the pruned branch
|
|
if (data.owner) {
|
|
if (data.owner) {
|
|
- data.owner->data.owned.erase(data.OW);
|
|
|
|
- data.owner = nullptr;
|
|
|
|
|
|
+ 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;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+
|
|
data.blocked++;
|
|
data.blocked++;
|
|
for (int i = data.children.size() - 1; i >= 0; i--) {
|
|
for (int i = data.children.size() - 1; i >= 0; i--) {
|
|
data.children[i]->_propagate_after_exit_tree();
|
|
data.children[i]->_propagate_after_exit_tree();
|
|
}
|
|
}
|
|
data.blocked--;
|
|
data.blocked--;
|
|
|
|
+
|
|
emit_signal(SceneStringNames::get_singleton()->tree_exited);
|
|
emit_signal(SceneStringNames::get_singleton()->tree_exited);
|
|
}
|
|
}
|
|
|
|
|