2
0
Эх сурвалжийг харах

Now the inspector will show the custom resources added via plugin

MrCdK 7 жил өмнө
parent
commit
97e77688bb

+ 1 - 20
editor/create_dialog.cpp

@@ -433,26 +433,7 @@ Object *CreateDialog::instance_selected() {
 			custom = md;
 
 		if (custom != String()) {
-			if (EditorNode::get_editor_data().get_custom_types().has(custom)) {
-
-				for (int i = 0; i < EditorNode::get_editor_data().get_custom_types()[custom].size(); i++) {
-					if (EditorNode::get_editor_data().get_custom_types()[custom][i].name == selected->get_text(0)) {
-						Ref<Texture> icon = EditorNode::get_editor_data().get_custom_types()[custom][i].icon;
-						Ref<Script> script = EditorNode::get_editor_data().get_custom_types()[custom][i].script;
-						String name = selected->get_text(0);
-
-						Object *ob = ClassDB::instance(custom);
-						ERR_FAIL_COND_V(!ob, NULL);
-						if (ob->is_class("Node")) {
-							ob->call("set_name", name);
-						}
-						ob->set_script(script.get_ref_ptr());
-						if (icon.is_valid())
-							ob->set_meta("_editor_icon", icon);
-						return ob;
-					}
-				}
-			}
+			return EditorNode::get_editor_data().instance_custom_type(selected->get_text(0), custom);
 		} else {
 			return ClassDB::instance(selected->get_text(0));
 		}

+ 25 - 0
editor/editor_data.cpp

@@ -452,6 +452,31 @@ void EditorData::add_custom_type(const String &p_type, const String &p_inherits,
 	custom_types[p_inherits].push_back(ct);
 }
 
+Object *EditorData::instance_custom_type(const String &p_type, const String &p_inherits) {
+
+	if (get_custom_types().has(p_inherits)) {
+
+		for (int i = 0; i < get_custom_types()[p_inherits].size(); i++) {
+			if (get_custom_types()[p_inherits][i].name == p_type) {
+				Ref<Texture> icon = get_custom_types()[p_inherits][i].icon;
+				Ref<Script> script = get_custom_types()[p_inherits][i].script;
+
+				Object *ob = ClassDB::instance(p_inherits);
+				ERR_FAIL_COND_V(!ob, NULL);
+				if (ob->is_class("Node")) {
+					ob->call("set_name", p_type);
+				}
+				ob->set_script(script.get_ref_ptr());
+				if (icon.is_valid())
+					ob->set_meta("_editor_icon", icon);
+				return ob;
+			}
+		}
+	}
+
+	return NULL;
+}
+
 void EditorData::remove_custom_type(const String &p_type) {
 
 	for (Map<String, Vector<CustomType> >::Element *E = custom_types.front(); E; E = E->next()) {

+ 1 - 0
editor/editor_data.h

@@ -171,6 +171,7 @@ public:
 	void restore_editor_global_states();
 
 	void add_custom_type(const String &p_type, const String &p_inherits, const Ref<Script> &p_script, const Ref<Texture> &p_icon);
+	Object *instance_custom_type(const String &p_type, const String &p_inherits);
 	void remove_custom_type(const String &p_type);
 	const Map<String, Vector<CustomType> > &get_custom_types() const { return custom_types; }
 

+ 43 - 3
editor/property_editor.cpp

@@ -285,6 +285,11 @@ void CustomPropertyEditor::_menu_option(int p_which) {
 					}
 
 					Object *obj = ClassDB::instance(intype);
+
+					if (!obj) {
+						obj = EditorNode::get_editor_data().instance_custom_type(intype, "Resource");
+					}
+
 					ERR_BREAK(!obj);
 					Resource *res = Object::cast_to<Resource>(obj);
 					ERR_BREAK(!res);
@@ -877,6 +882,7 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
 			} else if (hint_text != "") {
 				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++) {
 
 					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);
 					List<StringName> 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();
 					while (E) {
 						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()) {
 						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;
+
 						inheritors_array.push_back(t);
 
 						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 {
 
 							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);
 
+		if (!obj) {
+			obj = EditorNode::get_editor_data().instance_custom_type(intype, "Resource");
+		}
+
 		ERR_FAIL_COND(!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) {
 
 					Object *obj = ClassDB::instance(intype);
+
+					if (!obj) {
+						obj = EditorNode::get_editor_data().instance_custom_type(intype, "Resource");
+					}
+
 					ERR_BREAK(!obj);
 					Resource *res = Object::cast_to<Resource>(obj);
 					ERR_BREAK(!res);