diff --git a/editor/editor_data.cpp b/editor/editor_data.cpp index 5bbc4b6ea85..86dfe2ed7f6 100644 --- a/editor/editor_data.cpp +++ b/editor/editor_data.cpp @@ -1116,10 +1116,13 @@ Ref EditorData::_load_script_icon(const String &p_path) const { Ref EditorData::get_script_icon(const String &p_script_path) { // Take from the local cache, if available. - if (_script_icon_cache.has(p_script_path)) { - // Can be an empty value if we can't resolve any icon for this script. - // An empty value is still cached to avoid unnecessary attempts at resolving it again. - return _script_icon_cache[p_script_path]; + { + Ref *icon = _script_icon_cache.getptr(p_script_path); + if (icon) { + // Can be an empty value if we can't resolve any icon for this script. + // An empty value is still cached to avoid unnecessary attempts at resolving it again. + return *icon; + } } // Fast path in case the whole hierarchy is made of global classes. diff --git a/editor/editor_data.h b/editor/editor_data.h index 22f44db7213..e50ecda22d6 100644 --- a/editor/editor_data.h +++ b/editor/editor_data.h @@ -146,7 +146,7 @@ private: HashMap _script_class_icon_paths; HashMap _script_class_file_to_path; - HashMap> _script_icon_cache; + HashMap> _script_icon_cache; Ref _load_script_icon(const String &p_path) const; diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 330bc9d50f5..8049547815d 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -4005,9 +4005,10 @@ void EditorNode::_remove_edited_scene(bool p_change_tab) { } void EditorNode::_remove_scene(int index, bool p_change_tab) { - // Clear icon cache in case some scripts are no longer needed. + // Clear icon cache in case some scripts are no longer needed or class icons are outdated. // FIXME: Ideally the cache should never be cleared and only updated on per-script basis, when an icon changes. editor_data.clear_script_icon_cache(); + class_icon_cache.clear(); if (editor_data.get_edited_scene() == index) { // Scene to remove is current scene. @@ -5188,6 +5189,13 @@ Ref EditorNode::get_object_icon(const Object *p_object, const String Ref EditorNode::get_class_icon(const String &p_class, const String &p_fallback) { ERR_FAIL_COND_V_MSG(p_class.is_empty(), nullptr, "Class name cannot be empty."); + // Take from the local cache, if available. + { + Ref *icon = class_icon_cache.getptr(p_class); + if (icon) { + return *icon; + } + } String script_path; if (ScriptServer::is_global_class(p_class)) { @@ -5196,7 +5204,9 @@ Ref EditorNode::get_class_icon(const String &p_class, const String &p script_path = p_class; } - return _get_class_or_script_icon(p_class, script_path, p_fallback, true); + Ref icon = _get_class_or_script_icon(p_class, script_path, p_fallback, true); + class_icon_cache[p_class] = icon; + return icon; } bool EditorNode::is_object_of_custom_type(const Object *p_object, const StringName &p_class) { diff --git a/editor/editor_node.h b/editor/editor_node.h index 904f3c1a3ae..163075d0d27 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -484,6 +484,7 @@ private: PrintHandlerList print_handler; HashMap> icon_type_cache; + HashMap> class_icon_cache; ProjectUpgradeTool *project_upgrade_tool = nullptr; bool run_project_upgrade_tool = false;