You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-07 12:30:27 +00:00
Add class icon cache to EditorNode
This commit is contained in:
@@ -1116,10 +1116,13 @@ Ref<Texture2D> EditorData::_load_script_icon(const String &p_path) const {
|
|||||||
|
|
||||||
Ref<Texture2D> EditorData::get_script_icon(const String &p_script_path) {
|
Ref<Texture2D> EditorData::get_script_icon(const String &p_script_path) {
|
||||||
// Take from the local cache, if available.
|
// 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.
|
Ref<Texture2D> *icon = _script_icon_cache.getptr(p_script_path);
|
||||||
// An empty value is still cached to avoid unnecessary attempts at resolving it again.
|
if (icon) {
|
||||||
return _script_icon_cache[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 *icon;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fast path in case the whole hierarchy is made of global classes.
|
// Fast path in case the whole hierarchy is made of global classes.
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ private:
|
|||||||
|
|
||||||
HashMap<StringName, String> _script_class_icon_paths;
|
HashMap<StringName, String> _script_class_icon_paths;
|
||||||
HashMap<String, StringName> _script_class_file_to_path;
|
HashMap<String, StringName> _script_class_file_to_path;
|
||||||
HashMap<String, Ref<Texture>> _script_icon_cache;
|
HashMap<String, Ref<Texture2D>> _script_icon_cache;
|
||||||
|
|
||||||
Ref<Texture2D> _load_script_icon(const String &p_path) const;
|
Ref<Texture2D> _load_script_icon(const String &p_path) const;
|
||||||
|
|
||||||
|
|||||||
@@ -3986,9 +3986,10 @@ void EditorNode::_remove_edited_scene(bool p_change_tab) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void EditorNode::_remove_scene(int index, 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.
|
// 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();
|
editor_data.clear_script_icon_cache();
|
||||||
|
class_icon_cache.clear();
|
||||||
|
|
||||||
if (editor_data.get_edited_scene() == index) {
|
if (editor_data.get_edited_scene() == index) {
|
||||||
// Scene to remove is current scene.
|
// Scene to remove is current scene.
|
||||||
@@ -5140,6 +5141,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) {
|
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.");
|
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;
|
String script_path;
|
||||||
if (ScriptServer::is_global_class(p_class)) {
|
if (ScriptServer::is_global_class(p_class)) {
|
||||||
@@ -5148,7 +5156,9 @@ Ref<Texture2D> EditorNode::get_class_icon(const String &p_class, const String &p
|
|||||||
script_path = p_class;
|
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) {
|
bool EditorNode::is_object_of_custom_type(const Object *p_object, const StringName &p_class) {
|
||||||
|
|||||||
@@ -484,6 +484,7 @@ private:
|
|||||||
PrintHandlerList print_handler;
|
PrintHandlerList print_handler;
|
||||||
|
|
||||||
HashMap<String, Ref<Texture2D>> icon_type_cache;
|
HashMap<String, Ref<Texture2D>> icon_type_cache;
|
||||||
|
HashMap<String, Ref<Texture2D>> class_icon_cache;
|
||||||
|
|
||||||
ProjectUpgradeTool *project_upgrade_tool = nullptr;
|
ProjectUpgradeTool *project_upgrade_tool = nullptr;
|
||||||
bool run_project_upgrade_tool = false;
|
bool run_project_upgrade_tool = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user