|
@@ -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<Texture2D> EditorNode::get_object_icon(const Object *p_object, const String
|
|
|
|
|
|
Ref<Texture2D> 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<Texture2D> *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<Texture2D> 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<Texture2D> 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) {
|