1
0
mirror of https://github.com/godotengine/godot.git synced 2025-12-05 17:15:09 +00:00

Fix cleaning up inspector and history when deleting multiple nodes at once.

This commit is contained in:
SaracenOne
2023-04-18 14:05:01 +02:00
committed by Yuri Sizov
parent 377d8845da
commit f1ba23e8bb

View File

@@ -39,6 +39,7 @@
#include "editor/editor_plugin.h" #include "editor/editor_plugin.h"
#include "editor/editor_scale.h" #include "editor/editor_scale.h"
#include "editor/editor_undo_redo_manager.h" #include "editor/editor_undo_redo_manager.h"
#include "editor/multi_node_edit.h"
#include "editor/plugins/script_editor_plugin.h" #include "editor/plugins/script_editor_plugin.h"
#include "scene/resources/packed_scene.h" #include "scene/resources/packed_scene.h"
@@ -48,25 +49,48 @@ void EditorSelectionHistory::cleanup_history() {
for (int j = 0; j < history[i].path.size(); j++) { for (int j = 0; j < history[i].path.size(); j++) {
if (!history[i].path[j].ref.is_null()) { if (!history[i].path[j].ref.is_null()) {
// Reference is not null - object still alive. // If the node is a MultiNodeEdit node, examine it and see if anything is missing from it.
continue; Ref<MultiNodeEdit> multi_node_edit = history[i].path[j].ref;
if (multi_node_edit.is_valid()) {
Node *root = EditorNode::get_singleton()->get_edited_scene();
if (root) {
for (int k = 0; k < multi_node_edit->get_node_count(); k++) {
NodePath np = multi_node_edit->get_node(k);
Node *multi_node_selected_node = root->get_node_or_null(np);
if (!multi_node_selected_node) {
fail = true;
break;
}
}
} else {
fail = true;
}
} else {
// Reference is not null - object still alive.
continue;
}
} }
Object *obj = ObjectDB::get_instance(history[i].path[j].object); if (!fail) {
if (obj) { Object *obj = ObjectDB::get_instance(history[i].path[j].object);
Node *n = Object::cast_to<Node>(obj); if (obj) {
if (n && n->is_inside_tree()) { Node *n = Object::cast_to<Node>(obj);
// Node valid and inside tree - object still alive. if (n && n->is_inside_tree()) {
continue; // Node valid and inside tree - object still alive.
} continue;
if (!n) { }
// Node possibly still alive. if (!n) {
continue; // Node possibly still alive.
} continue;
} // Else: object not valid - not alive. }
} // Else: object not valid - not alive.
fail = true; fail = true;
break; }
if (fail) {
break;
}
} }
if (fail) { if (fail) {