Don't use arbitrary theme editor icons for scripts with the same name

The existing theme editor icon could be unintentionally set for any
global class with matching name (`Group` icon, `Group` class_name etc),
which would only show up in the "Create Dialog" context, but not the
scene tree dock.

This change prevents this behavior, and ensures that the icon can be
actually overidden by explicit icon path in `class_name`, if there's any
custom icon to begin with.

The correct built-in type's icon is fetched for child classes if there
are no custom icons detected throughout base classes as well, so it
isn't left empty for those cases.

(cherry picked from commit c177308f80)
This commit is contained in:
Andrii Doroshenko (Xrayez) 2020-06-25 02:13:13 +03:00 committed by Rémi Verschelde
parent c682410379
commit 63523e56e1
1 changed files with 9 additions and 7 deletions

View File

@ -3822,16 +3822,13 @@ Ref<Texture> EditorNode::get_object_icon(const Object *p_object, const String &p
Ref<Texture> EditorNode::get_class_icon(const String &p_class, const String &p_fallback) const { Ref<Texture> EditorNode::get_class_icon(const String &p_class, const String &p_fallback) const {
ERR_FAIL_COND_V_MSG(p_class.empty(), NULL, "Class name cannot be empty."); ERR_FAIL_COND_V_MSG(p_class.empty(), NULL, "Class name cannot be empty.");
if (gui_base->has_icon(p_class, "EditorIcons")) {
return gui_base->get_icon(p_class, "EditorIcons");
}
if (ScriptServer::is_global_class(p_class)) { if (ScriptServer::is_global_class(p_class)) {
Ref<ImageTexture> icon; Ref<ImageTexture> icon;
Ref<Script> script = EditorNode::get_editor_data().script_class_load_script(p_class); Ref<Script> script = EditorNode::get_editor_data().script_class_load_script(p_class);
StringName name = p_class;
while (script.is_valid()) { while (script.is_valid()) {
StringName name = EditorNode::get_editor_data().script_class_get_name(script->get_path()); name = EditorNode::get_editor_data().script_class_get_name(script->get_path());
String current_icon_path = EditorNode::get_editor_data().script_class_get_icon_path(name); String current_icon_path = EditorNode::get_editor_data().script_class_get_icon_path(name);
icon = _load_custom_class_icon(current_icon_path); icon = _load_custom_class_icon(current_icon_path);
if (icon.is_valid()) { if (icon.is_valid()) {
@ -3841,7 +3838,7 @@ Ref<Texture> EditorNode::get_class_icon(const String &p_class, const String &p_f
} }
if (icon.is_null()) { if (icon.is_null()) {
icon = gui_base->get_icon(ScriptServer::get_global_class_base(p_class), "EditorIcons"); icon = gui_base->get_icon(ScriptServer::get_global_class_base(name), "EditorIcons");
} }
return icon; return icon;
@ -3859,8 +3856,13 @@ Ref<Texture> EditorNode::get_class_icon(const String &p_class, const String &p_f
} }
} }
if (p_fallback.length() && gui_base->has_icon(p_fallback, "EditorIcons")) if (gui_base->has_icon(p_class, "EditorIcons")) {
return gui_base->get_icon(p_class, "EditorIcons");
}
if (p_fallback.length() && gui_base->has_icon(p_fallback, "EditorIcons")) {
return gui_base->get_icon(p_fallback, "EditorIcons"); return gui_base->get_icon(p_fallback, "EditorIcons");
}
return NULL; return NULL;
} }