1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-06 12:20:30 +00:00

Refactor editor icon retrieval

This commit is contained in:
willnationsdev
2018-09-02 16:40:51 -05:00
committed by Will Nations
parent 06c8b5a4ff
commit 5436abefe4
29 changed files with 192 additions and 252 deletions

View File

@@ -141,12 +141,7 @@ void EditorNode::_update_scene_tabs() {
String type = editor_data.get_scene_type(i);
Ref<Texture> icon;
if (type != String()) {
if (!gui_base->has_icon(type, "EditorIcons")) {
type = "Node";
}
icon = gui_base->get_icon(type, "EditorIcons");
icon = get_class_icon(type, "Node");
}
int current = editor_data.get_edited_scene();
@@ -3126,6 +3121,86 @@ void EditorNode::stop_child_process() {
_menu_option_confirm(RUN_STOP, false);
}
Ref<Texture> EditorNode::get_object_icon(const Object *p_object, const String &p_fallback) const {
ERR_FAIL_COND_V(!p_object || !gui_base, NULL);
Ref<Script> script = p_object->get_script();
if (script.is_null() && p_object->is_class("Script")) {
script = p_object;
}
StringName name;
String icon_path;
if (script.is_valid()) {
name = EditorNode::get_editor_data().script_class_get_name(script->get_path());
icon_path = EditorNode::get_editor_data().script_class_get_icon_path(name);
name = script->get_instance_base_type();
}
if (gui_base->has_icon(p_object->get_class(), "EditorIcons"))
return gui_base->get_icon(p_object->get_class(), "EditorIcons");
if (icon_path.length())
return ResourceLoader::load(icon_path);
if (p_object->has_meta("_editor_icon"))
return p_object->get_meta("_editor_icon");
if (name != StringName()) {
const Map<String, Vector<EditorData::CustomType> > &p_map = EditorNode::get_editor_data().get_custom_types();
for (const Map<String, Vector<EditorData::CustomType> >::Element *E = p_map.front(); E; E = E->next()) {
const Vector<EditorData::CustomType> &ct = E->value();
for (int i = 0; i < ct.size(); ++i) {
if (ct[i].name == name && ct[i].icon.is_valid()) {
return ct[i].icon;
}
}
}
}
if (p_fallback.length())
return gui_base->get_icon(p_fallback, "EditorIcons");
return NULL;
}
Ref<Texture> EditorNode::get_class_icon(const String &p_class, const String &p_fallback) const {
ERR_FAIL_COND_V(p_class.empty(), NULL);
if (gui_base->has_icon(p_class, "EditorIcons")) {
return gui_base->get_icon(p_class, "EditorIcons");
}
if (ScriptServer::is_global_class(p_class)) {
String icon_path = EditorNode::get_editor_data().script_class_get_icon_path(p_class);
RES icon;
if (FileAccess::exists(icon_path)) {
icon = ResourceLoader::load(icon_path);
}
if (!icon.is_valid()) {
icon = gui_base->get_icon(ScriptServer::get_global_class_base(p_class), "EditorIcons");
}
return icon;
}
const Map<String, Vector<EditorData::CustomType> > &p_map = EditorNode::get_editor_data().get_custom_types();
for (const Map<String, Vector<EditorData::CustomType> >::Element *E = p_map.front(); E; E = E->next()) {
const Vector<EditorData::CustomType> &ct = E->value();
for (int i = 0; i < ct.size(); ++i) {
if (ct[i].name == p_class) {
if (ct[i].icon.is_valid()) {
return ct[i].icon;
}
}
}
}
if (p_fallback.length())
return gui_base->get_icon(p_fallback, "EditorIcons");
return NULL;
}
void EditorNode::progress_add_task(const String &p_task, const String &p_label, int p_steps, bool p_can_cancel) {
singleton->progress_dialog->add_task(p_task, p_label, p_steps, p_can_cancel);
@@ -5371,6 +5446,13 @@ EditorNode::EditorNode() {
video_driver_current = 0;
for (int i = 0; i < video_drivers.get_slice_count(","); i++) {
String driver = video_drivers.get_slice(",", i);
Ref<Texture> icon = get_class_icon(driver, "");
if (icon.is_valid()) {
video_driver->add_icon_item(icon, "");
} else {
video_driver->add_item(driver);
}
video_driver->add_item(driver);
video_driver->set_item_metadata(i, driver);