summaryrefslogtreecommitdiff
path: root/editor/editor_resource_picker.cpp
diff options
context:
space:
mode:
authorYuri Sizov <yuris@humnom.net>2021-08-03 16:52:12 +0300
committerYuri Sizov <yuris@humnom.net>2021-08-03 16:52:12 +0300
commitdecd5482237714f29edd38fee2717262f5812427 (patch)
tree765a6d54c63759c2047bfb54d72499f9f2d22501 /editor/editor_resource_picker.cpp
parentba2e6c66cbb362089d4185ed75e42c75a8213a45 (diff)
Cache EditorResourcePicker's allowed types
Diffstat (limited to 'editor/editor_resource_picker.cpp')
-rw-r--r--editor/editor_resource_picker.cpp40
1 files changed, 32 insertions, 8 deletions
diff --git a/editor/editor_resource_picker.cpp b/editor/editor_resource_picker.cpp
index 9977f5f42c..f3965fe7de 100644
--- a/editor/editor_resource_picker.cpp
+++ b/editor/editor_resource_picker.cpp
@@ -36,6 +36,12 @@
#include "editor_settings.h"
#include "filesystem_dock.h"
+HashMap<StringName, List<StringName>> EditorResourcePicker::allowed_types_cache;
+
+void EditorResourcePicker::clear_caches() {
+ allowed_types_cache.clear();
+}
+
void EditorResourcePicker::_update_resource() {
preview_rect->set_texture(Ref<Texture2D>());
assign_button->set_custom_minimum_size(Size2(1, 1));
@@ -462,17 +468,31 @@ void EditorResourcePicker::_get_allowed_types(bool p_with_convert, Set<String> *
String base = allowed_types[i].strip_edges();
p_vector->insert(base);
- List<StringName> inheriters;
+ // If we hit a familiar base type, take all the data from cache.
+ if (allowed_types_cache.has(base)) {
+ List<StringName> allowed_subtypes = allowed_types_cache[base];
+ for (const StringName &subtype_name : allowed_subtypes) {
+ p_vector->insert(subtype_name);
+ }
+ } else {
+ List<StringName> allowed_subtypes;
- ClassDB::get_inheriters_from_class(base, &inheriters);
- for (const StringName &E : inheriters) {
- p_vector->insert(E);
- }
+ List<StringName> inheriters;
+ ClassDB::get_inheriters_from_class(base, &inheriters);
+ for (const StringName &subtype_name : inheriters) {
+ p_vector->insert(subtype_name);
+ allowed_subtypes.push_back(subtype_name);
+ }
- for (const StringName &E : global_classes) {
- if (EditorNode::get_editor_data().script_class_is_parent(E, base)) {
- p_vector->insert(E);
+ for (const StringName &subtype_name : global_classes) {
+ if (EditorNode::get_editor_data().script_class_is_parent(subtype_name, base)) {
+ p_vector->insert(subtype_name);
+ allowed_subtypes.push_back(subtype_name);
+ }
}
+
+ // Store the subtypes of the base type in the cache for future use.
+ allowed_types_cache[base] = allowed_subtypes;
}
if (p_with_convert) {
@@ -706,6 +726,10 @@ void EditorResourcePicker::set_base_type(const String &p_base_type) {
String class_str = (custom_class == StringName() ? edited_resource->get_class() : vformat("%s (%s)", custom_class, edited_resource->get_class()));
WARN_PRINT(vformat("Value mismatch between the new base type of this EditorResourcePicker, '%s', and the type of the value it already has, '%s'.", base_type, class_str));
}
+ } else {
+ // Call the method to build the cache immediately.
+ Set<String> allowed_types;
+ _get_allowed_types(false, &allowed_types);
}
}