|
@@ -285,6 +285,11 @@ void CustomPropertyEditor::_menu_option(int p_which) {
|
|
}
|
|
}
|
|
|
|
|
|
Object *obj = ClassDB::instance(intype);
|
|
Object *obj = ClassDB::instance(intype);
|
|
|
|
+
|
|
|
|
+ if (!obj) {
|
|
|
|
+ obj = EditorNode::get_editor_data().instance_custom_type(intype, "Resource");
|
|
|
|
+ }
|
|
|
|
+
|
|
ERR_BREAK(!obj);
|
|
ERR_BREAK(!obj);
|
|
Resource *res = Object::cast_to<Resource>(obj);
|
|
Resource *res = Object::cast_to<Resource>(obj);
|
|
ERR_BREAK(!res);
|
|
ERR_BREAK(!res);
|
|
@@ -877,6 +882,7 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
|
|
} else if (hint_text != "") {
|
|
} else if (hint_text != "") {
|
|
int idx = 0;
|
|
int idx = 0;
|
|
|
|
|
|
|
|
+ const Vector<EditorData::CustomType> custom_resources = EditorNode::get_editor_data().get_custom_types()["Resource"];
|
|
for (int i = 0; i < hint_text.get_slice_count(","); i++) {
|
|
for (int i = 0; i < hint_text.get_slice_count(","); i++) {
|
|
|
|
|
|
String base = hint_text.get_slice(",", i);
|
|
String base = hint_text.get_slice(",", i);
|
|
@@ -885,6 +891,11 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
|
|
valid_inheritors.insert(base);
|
|
valid_inheritors.insert(base);
|
|
List<StringName> inheritors;
|
|
List<StringName> inheritors;
|
|
ClassDB::get_inheriters_from_class(base.strip_edges(), &inheritors);
|
|
ClassDB::get_inheriters_from_class(base.strip_edges(), &inheritors);
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < custom_resources.size(); i++) {
|
|
|
|
+ inheritors.push_back(custom_resources[i].name);
|
|
|
|
+ }
|
|
|
|
+
|
|
List<StringName>::Element *E = inheritors.front();
|
|
List<StringName>::Element *E = inheritors.front();
|
|
while (E) {
|
|
while (E) {
|
|
valid_inheritors.insert(E->get());
|
|
valid_inheritors.insert(E->get());
|
|
@@ -893,14 +904,34 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
|
|
|
|
|
|
for (Set<String>::Element *E = valid_inheritors.front(); E; E = E->next()) {
|
|
for (Set<String>::Element *E = valid_inheritors.front(); E; E = E->next()) {
|
|
String t = E->get();
|
|
String t = E->get();
|
|
- if (!ClassDB::can_instance(t))
|
|
|
|
|
|
+
|
|
|
|
+ bool is_custom_resource = false;
|
|
|
|
+ Ref<Texture> icon;
|
|
|
|
+ if (!custom_resources.empty()) {
|
|
|
|
+ for (int i = 0; i < custom_resources.size(); i++) {
|
|
|
|
+ if (custom_resources[i].name == t) {
|
|
|
|
+ is_custom_resource = true;
|
|
|
|
+ if (custom_resources[i].icon.is_valid())
|
|
|
|
+ icon = custom_resources[i].icon;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!is_custom_resource && !ClassDB::can_instance(t))
|
|
continue;
|
|
continue;
|
|
|
|
+
|
|
inheritors_array.push_back(t);
|
|
inheritors_array.push_back(t);
|
|
|
|
|
|
int id = TYPE_BASE_ID + idx;
|
|
int id = TYPE_BASE_ID + idx;
|
|
- if (has_icon(t, "EditorIcons")) {
|
|
|
|
|
|
|
|
- menu->add_icon_item(get_icon(t, "EditorIcons"), vformat(TTR("New %s"), t), id);
|
|
|
|
|
|
+ if (!icon.is_valid() && has_icon(t, "EditorIcons")) {
|
|
|
|
+ icon = get_icon(t, "EditorIcons");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (icon.is_valid()) {
|
|
|
|
+
|
|
|
|
+ menu->add_icon_item(icon, vformat(TTR("New %s"), t), id);
|
|
} else {
|
|
} else {
|
|
|
|
|
|
menu->add_item(vformat(TTR("New %s"), t), id);
|
|
menu->add_item(vformat(TTR("New %s"), t), id);
|
|
@@ -1094,6 +1125,10 @@ void CustomPropertyEditor::_type_create_selected(int p_idx) {
|
|
|
|
|
|
Object *obj = ClassDB::instance(intype);
|
|
Object *obj = ClassDB::instance(intype);
|
|
|
|
|
|
|
|
+ if (!obj) {
|
|
|
|
+ obj = EditorNode::get_editor_data().instance_custom_type(intype, "Resource");
|
|
|
|
+ }
|
|
|
|
+
|
|
ERR_FAIL_COND(!obj);
|
|
ERR_FAIL_COND(!obj);
|
|
|
|
|
|
Resource *res = Object::cast_to<Resource>(obj);
|
|
Resource *res = Object::cast_to<Resource>(obj);
|
|
@@ -1291,6 +1326,11 @@ void CustomPropertyEditor::_action_pressed(int p_which) {
|
|
if (hint == PROPERTY_HINT_RESOURCE_TYPE) {
|
|
if (hint == PROPERTY_HINT_RESOURCE_TYPE) {
|
|
|
|
|
|
Object *obj = ClassDB::instance(intype);
|
|
Object *obj = ClassDB::instance(intype);
|
|
|
|
+
|
|
|
|
+ if (!obj) {
|
|
|
|
+ obj = EditorNode::get_editor_data().instance_custom_type(intype, "Resource");
|
|
|
|
+ }
|
|
|
|
+
|
|
ERR_BREAK(!obj);
|
|
ERR_BREAK(!obj);
|
|
Resource *res = Object::cast_to<Resource>(obj);
|
|
Resource *res = Object::cast_to<Resource>(obj);
|
|
ERR_BREAK(!res);
|
|
ERR_BREAK(!res);
|