Explorar o código

Merge pull request #88182 from RedMser/fix-88176-inspector

Only update inspector if configuration warning change was relevant
Rémi Verschelde hai 1 ano
pai
achega
85869957e9
Modificáronse 2 ficheiros con 46 adicións e 1 borrados
  1. 44 1
      editor/editor_inspector.cpp
  2. 2 0
      editor/editor_inspector.h

+ 44 - 1
editor/editor_inspector.cpp

@@ -3533,6 +3533,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
@@ -4056,8 +4059,48 @@ 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<Node>(object);
+	if (!node) {
+		return false;
 	}
+
+	bool changed = false;
+	LocalVector<int> found_warning_indices;
+
+	// New and changed warnings.
+	Vector<Dictionary> 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) {

+ 2 - 0
editor/editor_inspector.h

@@ -514,6 +514,7 @@ class EditorInspector : public ScrollContainer {
 	int property_focusable;
 	int update_scroll_request;
 
+	LocalVector<Dictionary> property_configuration_warnings;
 	HashMap<StringName, HashMap<StringName, String>> doc_path_cache;
 	HashSet<StringName> restart_request_props;
 	HashMap<String, String> custom_property_descriptions;
@@ -543,6 +544,7 @@ class EditorInspector : public ScrollContainer {
 
 	void _node_removed(Node *p_node);
 	void _warning_changed(Node *p_node);
+	bool _update_configuration_warnings();
 
 	HashMap<StringName, int> per_array_page;
 	void _page_change_request(int p_new_page, const StringName &p_array_prefix);