From a53793472e4ed61e68405044beb6325a33ac5814 Mon Sep 17 00:00:00 2001 From: RedMser Date: Sat, 10 Feb 2024 20:17:42 +0100 Subject: [PATCH] Only update inspector if configuration warning change relevant Fixes #88176 --- editor/editor_inspector.cpp | 45 ++++++++++++++++++++++++++++++++++++- editor/editor_inspector.h | 2 ++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index 6633121737fe..e16fbe340905 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -3527,6 +3527,9 @@ void EditorInspector::edit(Object *p_object) { object = p_object; + property_configuration_warnings.clear(); + _update_configuration_warnings(); + if (object) { update_scroll_request = 0; //reset if (scroll_cache.has(object->get_instance_id())) { //if exists, set something else @@ -4050,10 +4053,50 @@ void EditorInspector::_node_removed(Node *p_node) { void EditorInspector::_warning_changed(Node *p_node) { if (p_node == object) { - update_tree_pending = true; + // Only update the tree if the list of configuration warnings has changed. + if (_update_configuration_warnings()) { + update_tree_pending = true; + } } } +bool EditorInspector::_update_configuration_warnings() { + Node *node = Object::cast_to(object); + if (!node) { + return false; + } + + bool changed = false; + LocalVector found_warning_indices; + + // New and changed warnings. + Vector warnings = node->get_configuration_warnings_as_dicts(); + for (const Dictionary &warning : warnings) { + if (!warning.has("property")) { + continue; + } + + int found_warning_index = property_configuration_warnings.find(warning); + if (found_warning_index < 0) { + found_warning_index = property_configuration_warnings.size(); + property_configuration_warnings.push_back(warning); + changed = true; + } + found_warning_indices.push_back(found_warning_index); + } + + // Removed warnings. + for (uint32_t i = 0; i < property_configuration_warnings.size(); i++) { + if (found_warning_indices.find(i) < 0) { + property_configuration_warnings.remove_at(i); + i--; + changed = true; + } + } + + return changed; +} + void EditorInspector::_notification(int p_what) { switch (p_what) { case NOTIFICATION_READY: { diff --git a/editor/editor_inspector.h b/editor/editor_inspector.h index d8b3e32d7d16..f375b60aa6ba 100644 --- a/editor/editor_inspector.h +++ b/editor/editor_inspector.h @@ -514,6 +514,7 @@ class EditorInspector : public ScrollContainer { int property_focusable; int update_scroll_request; + LocalVector property_configuration_warnings; HashMap> doc_path_cache; HashSet restart_request_props; @@ -542,6 +543,7 @@ class EditorInspector : public ScrollContainer { void _node_removed(Node *p_node); void _warning_changed(Node *p_node); + bool _update_configuration_warnings(); HashMap per_array_page; void _page_change_request(int p_new_page, const StringName &p_array_prefix);