Skip to content

Commit

Permalink
Merge pull request #84443 from KoBeWi/cookies_for_EditorResourcePicker
Browse files Browse the repository at this point in the history
Cache allowed types in EditorResourcePicker
  • Loading branch information
akien-mga committed Apr 30, 2024
2 parents 64520fe + 50eac4d commit d9bf750
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 24 deletions.
52 changes: 29 additions & 23 deletions editor/editor_resource_picker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -488,8 +488,8 @@ void EditorResourcePicker::set_create_options(Object *p_menu_node) {
if (!base_type.is_empty()) {
int idx = 0;

HashSet<StringName> allowed_types;
_get_allowed_types(false, &allowed_types);
_ensure_allowed_types();
HashSet<StringName> allowed_types = allowed_types_without_convert;

for (const StringName &E : allowed_types) {
const String &t = E;
Expand Down Expand Up @@ -593,23 +593,29 @@ static void _add_allowed_type(const StringName &p_type, HashSet<StringName> *p_v
}
}

void EditorResourcePicker::_get_allowed_types(bool p_with_convert, HashSet<StringName> *p_vector) const {
void EditorResourcePicker::_ensure_allowed_types() const {
if (!allowed_types_without_convert.is_empty()) {
return;
}

Vector<String> allowed_types = base_type.split(",");
int size = allowed_types.size();

for (int i = 0; i < size; i++) {
String base = allowed_types[i].strip_edges();
const String base = allowed_types[i].strip_edges();
_add_allowed_type(base, &allowed_types_without_convert);
}

_add_allowed_type(base, p_vector);
allowed_types_with_convert = HashSet<StringName>(allowed_types_without_convert);

if (p_with_convert) {
if (base == "BaseMaterial3D") {
p_vector->insert("Texture2D");
} else if (base == "ShaderMaterial") {
p_vector->insert("Shader");
} else if (base == "Texture2D") {
p_vector->insert("Image");
}
for (int i = 0; i < size; i++) {
const String base = allowed_types[i].strip_edges();
if (base == "BaseMaterial3D") {
allowed_types_with_convert.insert("Texture2D");
} else if (base == "ShaderMaterial") {
allowed_types_with_convert.insert("Shader");
} else if (base == "Texture2D") {
allowed_types_with_convert.insert("Image");
}
}
}
Expand Down Expand Up @@ -645,8 +651,8 @@ bool EditorResourcePicker::_is_drop_valid(const Dictionary &p_drag_data) const {
}
}

HashSet<StringName> allowed_types;
_get_allowed_types(true, &allowed_types);
_ensure_allowed_types();
HashSet<StringName> allowed_types = allowed_types_with_convert;

if (res.is_valid()) {
String res_type = _get_resource_type(res);
Expand Down Expand Up @@ -713,8 +719,8 @@ void EditorResourcePicker::drop_data_fw(const Point2 &p_point, const Variant &p_
}

if (dropped_resource.is_valid()) {
HashSet<StringName> allowed_types;
_get_allowed_types(false, &allowed_types);
_ensure_allowed_types();
HashSet<StringName> allowed_types = allowed_types_without_convert;

String res_type = _get_resource_type(dropped_resource);

Expand Down Expand Up @@ -835,8 +841,8 @@ void EditorResourcePicker::set_base_type(const String &p_base_type) {
// There is a possibility that the new base type is conflicting with the existing value.
// Keep the value, but warn the user that there is a potential mistake.
if (!base_type.is_empty() && edited_resource.is_valid()) {
HashSet<StringName> allowed_types;
_get_allowed_types(true, &allowed_types);
_ensure_allowed_types();
HashSet<StringName> allowed_types = allowed_types_with_convert;

StringName custom_class;
bool is_custom = false;
Expand All @@ -857,8 +863,8 @@ String EditorResourcePicker::get_base_type() const {
}

Vector<String> EditorResourcePicker::get_allowed_types() const {
HashSet<StringName> allowed_types;
_get_allowed_types(false, &allowed_types);
_ensure_allowed_types();
HashSet<StringName> allowed_types = allowed_types_without_convert;

Vector<String> types;
types.resize(allowed_types.size());
Expand All @@ -881,8 +887,8 @@ void EditorResourcePicker::set_edited_resource(Ref<Resource> p_resource) {
}

if (!base_type.is_empty()) {
HashSet<StringName> allowed_types;
_get_allowed_types(true, &allowed_types);
_ensure_allowed_types();
HashSet<StringName> allowed_types = allowed_types_with_convert;

StringName custom_class;
bool is_custom = false;
Expand Down
4 changes: 3 additions & 1 deletion editor/editor_resource_picker.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ class EditorResourcePicker : public HBoxContainer {
bool dropping = false;

Vector<String> inheritors_array;
mutable HashSet<StringName> allowed_types_without_convert;
mutable HashSet<StringName> allowed_types_with_convert;

Button *assign_button = nullptr;
TextureRect *preview_rect = nullptr;
Expand Down Expand Up @@ -97,7 +99,7 @@ class EditorResourcePicker : public HBoxContainer {
void _button_input(const Ref<InputEvent> &p_event);

String _get_resource_type(const Ref<Resource> &p_resource) const;
void _get_allowed_types(bool p_with_convert, HashSet<StringName> *p_vector) const;
void _ensure_allowed_types() const;
bool _is_drop_valid(const Dictionary &p_drag_data) const;
bool _is_type_valid(const String &p_type_name, const HashSet<StringName> &p_allowed_types) const;

Expand Down

0 comments on commit d9bf750

Please sign in to comment.