From 5436abefe4f40eb84f96c36ae372df39ec4295d7 Mon Sep 17 00:00:00 2001 From: willnationsdev Date: Sun, 2 Sep 2018 16:40:51 -0500 Subject: Refactor editor icon retrieval --- editor/animation_bezier_editor.cpp | 9 +-- editor/create_dialog.cpp | 46 ++--------- editor/dependency_editor.cpp | 31 ++----- editor/editor_audio_buses.cpp | 5 +- editor/editor_data.cpp | 45 ++++++++--- editor/editor_data.h | 11 ++- editor/editor_file_system.cpp | 1 + editor/editor_help.cpp | 18 ++--- editor/editor_inspector.cpp | 5 +- editor/editor_node.cpp | 94 ++++++++++++++++++++-- editor/editor_node.h | 2 + editor/editor_path.cpp | 14 +--- editor/editor_properties.cpp | 26 +----- editor/editor_sub_scene.cpp | 5 +- editor/groups_editor.cpp | 7 +- editor/inspector_dock.cpp | 7 +- .../plugins/animation_blend_tree_editor_plugin.cpp | 6 +- editor/plugins/canvas_item_editor_plugin.cpp | 11 +-- editor/plugins/item_list_editor_plugin.cpp | 5 +- .../plugins/resource_preloader_editor_plugin.cpp | 3 +- editor/plugins/root_motion_editor_plugin.cpp | 15 +--- editor/plugins/spatial_editor_plugin.cpp | 6 +- editor/plugins/text_editor.cpp | 7 +- editor/project_export.cpp | 9 +-- editor/property_selector.cpp | 9 +-- editor/scene_tree_dock.cpp | 27 +------ editor/scene_tree_editor.cpp | 6 +- editor/script_editor_debugger.cpp | 5 +- .../visual_script_property_selector.cpp | 9 +-- 29 files changed, 192 insertions(+), 252 deletions(-) diff --git a/editor/animation_bezier_editor.cpp b/editor/animation_bezier_editor.cpp index 04977dbb47..f0dc3ce305 100644 --- a/editor/animation_bezier_editor.cpp +++ b/editor/animation_bezier_editor.cpp @@ -30,6 +30,8 @@ #include "animation_bezier_editor.h" +#include "editor/editor_node.h" + float AnimationBezierTrackEdit::_bezier_h_to_pixel(float p_h) { float h = p_h; h = (h - v_scroll) / v_zoom; @@ -288,12 +290,7 @@ void AnimationBezierTrackEdit::_notification(int p_what) { int h = font->get_height(); if (node) { - Ref icon; - if (has_icon(node->get_class(), "EditorIcons")) { - icon = get_icon(node->get_class(), "EditorIcons"); - } else { - icon = get_icon("Node", "EditorIcons"); - } + Ref icon = EditorNode::get_singleton()->get_object_icon(node, "Node"); h = MAX(h, icon->get_height()); diff --git a/editor/create_dialog.cpp b/editor/create_dialog.cpp index 8bef94d8a8..ff34618b04 100644 --- a/editor/create_dialog.cpp +++ b/editor/create_dialog.cpp @@ -60,7 +60,7 @@ void CreateDialog::popup_create(bool p_dont_clear, bool p_replace_mode) { TreeItem *ti = recent->create_item(root); ti->set_text(0, l); - ti->set_icon(0, _get_editor_icon(l)); + ti->set_icon(0, EditorNode::get_singleton()->get_class_icon(l, base_type)); } } @@ -151,41 +151,6 @@ void CreateDialog::_sbox_input(const Ref &p_ie) { } } -Ref CreateDialog::_get_editor_icon(const String &p_type) const { - - if (has_icon(p_type, "EditorIcons")) { - return get_icon(p_type, "EditorIcons"); - } - - if (ScriptServer::is_global_class(p_type)) { - String icon_path = EditorNode::get_editor_data().script_class_get_icon_path(p_type); - RES icon; - if (FileAccess::exists(icon_path)) { - icon = ResourceLoader::load(icon_path); - } - if (!icon.is_valid()) { - icon = get_icon(ScriptServer::get_global_class_base(p_type), "EditorIcons"); - } - return icon; - } - - const Map > &p_map = EditorNode::get_editor_data().get_custom_types(); - for (const Map >::Element *E = p_map.front(); E; E = E->next()) { - const Vector &ct = E->value(); - for (int i = 0; i < ct.size(); ++i) { - if (ct[i].name == p_type) { - if (ct[i].icon.is_valid()) { - return ct[i].icon; - } else { - return get_icon("Object", "EditorIcons"); - } - } - } - } - - return get_icon("Object", "EditorIcons"); -} - void CreateDialog::add_type(const String &p_type, HashMap &p_types, TreeItem *p_root, TreeItem **to_select) { if (p_types.has(p_type)) @@ -246,7 +211,10 @@ void CreateDialog::add_type(const String &p_type, HashMap &p to_select_type = to_select_type.split(" ")[0]; bool current_item_is_preferred; if (cpp_type) { - current_item_is_preferred = ClassDB::is_parent_class(p_type, preferred_search_result_type) && !ClassDB::is_parent_class(to_select_type, preferred_search_result_type) && search_box->get_text() != to_select_type; + String cpp_to_select_type = to_select_type; + if (ScriptServer::is_global_class(to_select_type)) + cpp_to_select_type = ScriptServer::get_global_class_base(to_select_type); + current_item_is_preferred = ClassDB::is_parent_class(p_type, preferred_search_result_type) && !ClassDB::is_parent_class(cpp_to_select_type, preferred_search_result_type); } else { current_item_is_preferred = ed.script_class_is_parent(p_type, preferred_search_result_type) && !ed.script_class_is_parent(to_select_type, preferred_search_result_type) && search_box->get_text() != to_select_type; } @@ -274,7 +242,7 @@ void CreateDialog::add_type(const String &p_type, HashMap &p const String &description = EditorHelp::get_doc_data()->class_list[p_type].brief_description; item->set_tooltip(0, description); - item->set_icon(0, _get_editor_icon(p_type)); + item->set_icon(0, EditorNode::get_singleton()->get_class_icon(p_type, base_type)); p_types[p_type] = item; } @@ -578,7 +546,7 @@ void CreateDialog::_update_favorite_list() { continue; TreeItem *ti = favorites->create_item(root); ti->set_text(0, l); - ti->set_icon(0, _get_editor_icon(l)); + ti->set_icon(0, EditorNode::get_singleton()->get_class_icon(l, base_type)); } emit_signal("favorites_updated"); } diff --git a/editor/dependency_editor.cpp b/editor/dependency_editor.cpp index 9f04d40763..037543f45c 100644 --- a/editor/dependency_editor.cpp +++ b/editor/dependency_editor.cpp @@ -198,12 +198,7 @@ void DependencyEditor::_update_list() { } String name = path.get_file(); - Ref icon; - if (has_icon(type, "EditorIcons")) { - icon = get_icon(type, "EditorIcons"); - } else { - icon = get_icon("Object", "EditorIcons"); - } + Ref icon = EditorNode::get_singleton()->get_class_icon(type); item->set_text(0, name); item->set_icon(0, icon); item->set_metadata(0, type); @@ -346,13 +341,7 @@ void DependencyEditorOwners::_fill_owners(EditorFileSystemDirectory *efsd) { if (!found) continue; - Ref icon; - String type = efsd->get_file_type(i); - if (!has_icon(type, "EditorIcons")) { - icon = get_icon("Object", "EditorIcons"); - } else { - icon = get_icon(type, "EditorIcons"); - } + Ref icon = EditorNode::get_singleton()->get_class_icon(efsd->get_file_type(i)); owners->add_item(efsd->get_file_path(i), icon); } @@ -460,7 +449,7 @@ void DependencyRemoveDialog::_build_removed_dependency_tree(const Vector icon = has_icon(rd.file_type, "EditorIcons") ? get_icon(rd.file_type, "EditorIcons") : get_icon("Object", "EditorIcons"); + Ref icon = EditorNode::get_singleton()->get_class_icon(rd.file_type); TreeItem *file_item = owners->create_item(tree_items[rd.dependency]); file_item->set_text(0, rd.file); file_item->set_icon(0, icon); @@ -579,12 +568,7 @@ void DependencyErrorDialog::show(const String &p_for_file, const Vector if (report[i].get_slice_count("::") > 0) type = report[i].get_slice("::", 1); - Ref icon; - if (!has_icon(type, "EditorIcons")) { - icon = get_icon("Object", "EditorIcons"); - } else { - icon = get_icon(type, "EditorIcons"); - } + Ref icon = EditorNode::get_singleton()->get_class_icon(type); TreeItem *ti = files->create_item(root); ti->set_text(0, dep); @@ -687,12 +671,7 @@ bool OrphanResourcesDialog::_fill_owners(EditorFileSystemDirectory *efsd, HashMa String type = efsd->get_file_type(i); - Ref icon; - if (has_icon(type, "EditorIcons")) { - icon = get_icon(type, "EditorIcons"); - } else { - icon = get_icon("Object", "EditorIcons"); - } + Ref icon = EditorNode::get_singleton()->get_class_icon(type); ti->set_icon(0, icon); int ds = efsd->get_file_deps(i).size(); ti->set_text(1, itos(ds)); diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp index 96110b61ab..6cd81626c7 100644 --- a/editor/editor_audio_buses.cpp +++ b/editor/editor_audio_buses.cpp @@ -765,10 +765,7 @@ EditorAudioBus::EditorAudioBus(EditorAudioBuses *p_buses, bool p_is_master) { if (!ClassDB::can_instance(E->get())) continue; - Ref icon; - if (has_icon(E->get(), "EditorIcons")) { - icon = get_icon(E->get(), "EditorIcons"); - } + Ref icon = EditorNode::get_singleton()->get_class_icon(E->get()); String name = E->get().operator String().replace("AudioEffect", ""); effect_options->add_item(name); effect_options->set_item_metadata(effect_options->get_item_count() - 1, E->get()); diff --git a/editor/editor_data.cpp b/editor/editor_data.cpp index 6187c6b318..9420452da1 100644 --- a/editor/editor_data.cpp +++ b/editor/editor_data.cpp @@ -869,7 +869,7 @@ bool EditorData::script_class_is_parent(const String &p_class, const String &p_i return true; } -StringName EditorData::script_class_get_base(const String &p_class) { +StringName EditorData::script_class_get_base(const String &p_class) const { if (!ScriptServer::is_global_class(p_class)) return StringName(); @@ -895,24 +895,48 @@ Object *EditorData::script_class_instance(const String &p_class) { RES script = ResourceLoader::load(ScriptServer::get_global_class_path(p_class)); if (script.is_valid()) obj->set_script(script.get_ref_ptr()); - - RES icon = ResourceLoader::load(script_class_get_icon_path(p_class)); - if (icon.is_valid()) - obj->set_meta("_editor_icon", icon); - return obj; } } return NULL; } +void EditorData::script_class_set_icon_path(const String &p_class, const String &p_icon_path) { + _script_class_icon_paths[p_class] = p_icon_path; +} + +String EditorData::script_class_get_icon_path(const String &p_class) const { + if (!ScriptServer::is_global_class(p_class)) + return String(); + + String current = p_class; + String ret = _script_class_icon_paths[current]; + while (ret.empty()) { + current = script_class_get_base(current); + if (!ScriptServer::is_global_class(current)) + return String(); + ret = _script_class_icon_paths.has(current) ? _script_class_icon_paths[current] : String(); + } + + return ret; +} + +StringName EditorData::script_class_get_name(const String &p_path) const { + return _script_class_file_to_path.has(p_path) ? _script_class_file_to_path[p_path] : StringName(); +} + +void EditorData::script_class_set_name(const String &p_path, const StringName &p_class) { + _script_class_file_to_path[p_path] = p_class; +} + void EditorData::script_class_save_icon_paths() { List keys; _script_class_icon_paths.get_key_list(&keys); Dictionary d; for (List::Element *E = keys.front(); E; E = E->next()) { - d[E->get()] = _script_class_icon_paths[E->get()]; + if (ScriptServer::is_global_class(E->get())) + d[E->get()] = _script_class_icon_paths[E->get()]; } ProjectSettings::get_singleton()->set("_global_script_class_icons", d); @@ -927,8 +951,11 @@ void EditorData::script_class_load_icon_paths() { d.get_key_list(&keys); for (List::Element *E = keys.front(); E; E = E->next()) { - String key = E->get().operator String(); - _script_class_icon_paths[key] = d[key]; + String name = E->get().operator String(); + _script_class_icon_paths[name] = d[name]; + + String path = ScriptServer::get_global_class_path(name); + script_class_set_name(path, name); } } diff --git a/editor/editor_data.h b/editor/editor_data.h index 9f5d3e2a15..87a76ee5ba 100644 --- a/editor/editor_data.h +++ b/editor/editor_data.h @@ -147,6 +147,7 @@ private: bool _find_updated_instances(Node *p_root, Node *p_node, Set &checked_paths); HashMap _script_class_icon_paths; + HashMap _script_class_file_to_path; public: EditorPlugin *get_editor(Object *p_object); @@ -214,10 +215,14 @@ public: void notify_resource_saved(const Ref &p_resource); bool script_class_is_parent(const String &p_class, const String &p_inherits); - StringName script_class_get_base(const String &p_class); + StringName script_class_get_base(const String &p_class) const; Object *script_class_instance(const String &p_class); - String script_class_get_icon_path(const String &p_class) const { return _script_class_icon_paths.has(p_class) ? _script_class_icon_paths[p_class] : String(); } - void script_class_set_icon_path(const String &p_class, const String &p_icon_path) { _script_class_icon_paths[p_class] = p_icon_path; } + + StringName script_class_get_name(const String &p_path) const; + void script_class_set_name(const String &p_path, const StringName &p_class); + + String script_class_get_icon_path(const String &p_class) const; + void script_class_set_icon_path(const String &p_class, const String &p_icon_path); void script_class_clear_icon_paths() { _script_class_icon_paths.clear(); } void script_class_save_icon_paths(); void script_class_load_icon_paths(); diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp index 3d034989ed..56358cf5b7 100644 --- a/editor/editor_file_system.cpp +++ b/editor/editor_file_system.cpp @@ -1358,6 +1358,7 @@ void EditorFileSystem::_scan_script_classes(EditorFileSystemDirectory *p_dir) { } ScriptServer::add_global_class(files[i]->script_class_name, files[i]->script_class_extends, lang, p_dir->get_file_path(i)); EditorNode::get_editor_data().script_class_set_icon_path(files[i]->script_class_name, files[i]->script_class_icon_path); + EditorNode::get_editor_data().script_class_set_name(files[i]->file, files[i]->script_class_name); } for (int i = 0; i < p_dir->get_subdir_count(); i++) { _scan_script_classes(p_dir->get_subdir(i)); diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index 5b9e7b29a9..728c4affbd 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -88,10 +88,8 @@ void EditorHelpSearch::IncrementalSearch::phase1(Map: TreeItem *item = search_options->create_item(root); item->set_metadata(0, "class_name:" + E->key()); item->set_text(0, E->key() + " (Class)"); - if (search->has_icon(E->key(), "EditorIcons")) - item->set_icon(0, search->get_icon(E->key(), "EditorIcons")); - else - item->set_icon(0, def_icon); + Ref icon = EditorNode::get_singleton()->get_class_icon(E->key(), "Node"); + item->set_icon(0, icon); } } @@ -99,11 +97,7 @@ void EditorHelpSearch::IncrementalSearch::phase2(Map: DocData::ClassDoc &c = E->get(); - Ref cicon; - if (search->has_icon(E->key(), "EditorIcons")) - cicon = search->get_icon(E->key(), "EditorIcons"); - else - cicon = def_icon; + Ref cicon = EditorNode::get_singleton()->get_class_icon(E->key(), "Node"); for (int i = 0; i < c.methods.size(); i++) { if ((term.begins_with(".") && c.methods[i].name.begins_with(term.right(1))) || (term.ends_with("(") && c.methods[i].name.ends_with(term.left(term.length() - 1).strip_edges())) || (term.begins_with(".") && term.ends_with("(") && c.methods[i].name == term.substr(1, term.length() - 2).strip_edges()) || c.methods[i].name.findn(term) != -1) { @@ -343,10 +337,8 @@ void EditorHelpIndex::add_type(const String &p_type, HashMap item->set_tooltip(0, EditorHelp::get_doc_data()->class_list[p_type].brief_description); item->set_text(0, p_type); - if (has_icon(p_type, "EditorIcons")) { - - item->set_icon(0, get_icon(p_type, "EditorIcons")); - } + Ref icon = EditorNode::get_singleton()->get_class_icon(p_type); + item->set_icon(0, icon); p_types[p_type] = item; } diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index b64570f312..36c3102840 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -1423,10 +1423,7 @@ void EditorInspector::update_tree() { category_vbox = NULL; //reset String type = p.name; - if (has_icon(type, "EditorIcons")) - category->icon = get_icon(type, "EditorIcons"); - else - category->icon = get_icon("Object", "EditorIcons"); + category->icon = EditorNode::get_singleton()->get_class_icon(type, "Object"); category->label = type; category->bg_color = get_color("prop_category", "Editor"); diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index b652a25b6b..b28d639a7c 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -141,12 +141,7 @@ void EditorNode::_update_scene_tabs() { String type = editor_data.get_scene_type(i); Ref 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 EditorNode::get_object_icon(const Object *p_object, const String &p_fallback) const { + ERR_FAIL_COND_V(!p_object || !gui_base, NULL); + + Ref