Merge pull request #43015 from Xrayez/refactor-auto-instaprop
Refactor auto-instantiation of `Object` properties in editor
This commit is contained in:
commit
0154ce2c8d
6 changed files with 28 additions and 12 deletions
|
|
@ -503,17 +503,7 @@ Variant CreateDialog::instance_selected() {
|
|||
} else {
|
||||
obj = ClassDB::instantiate(selected->get_text(0));
|
||||
}
|
||||
|
||||
// Check if any Object-type property should be instantiated.
|
||||
List<PropertyInfo> pinfo;
|
||||
((Object *)obj)->get_property_list(&pinfo);
|
||||
|
||||
for (const PropertyInfo &pi : pinfo) {
|
||||
if (pi.type == Variant::OBJECT && pi.usage & PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT) {
|
||||
Object *prop = ClassDB::instantiate(pi.class_name);
|
||||
((Object *)obj)->set(pi.name, prop);
|
||||
}
|
||||
}
|
||||
EditorNode::get_editor_data().instantiate_object_properties(obj);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -520,6 +520,21 @@ void EditorData::remove_custom_type(const String &p_type) {
|
|||
}
|
||||
}
|
||||
|
||||
void EditorData::instantiate_object_properties(Object *p_object) {
|
||||
ERR_FAIL_NULL(p_object);
|
||||
// Check if any Object-type property should be instantiated.
|
||||
List<PropertyInfo> pinfo;
|
||||
p_object->get_property_list(&pinfo);
|
||||
|
||||
for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) {
|
||||
PropertyInfo pi = E->get();
|
||||
if (pi.type == Variant::OBJECT && pi.usage & PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT) {
|
||||
Object *prop = ClassDB::instantiate(pi.class_name);
|
||||
p_object->set(pi.name, prop);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int EditorData::add_edited_scene(int p_at_pos) {
|
||||
if (p_at_pos < 0) {
|
||||
p_at_pos = edited_scene.size();
|
||||
|
|
|
|||
|
|
@ -182,6 +182,8 @@ public:
|
|||
void remove_custom_type(const String &p_type);
|
||||
const Map<String, Vector<CustomType>> &get_custom_types() const { return custom_types; }
|
||||
|
||||
void instantiate_object_properties(Object *p_object);
|
||||
|
||||
int add_edited_scene(int p_at_pos);
|
||||
void move_edited_scene_index(int p_idx, int p_to_idx);
|
||||
void remove_scene(int p_idx);
|
||||
|
|
|
|||
|
|
@ -377,6 +377,8 @@ void EditorResourcePicker::_edit_menu_cbk(int p_which) {
|
|||
Resource *resp = Object::cast_to<Resource>(obj);
|
||||
ERR_BREAK(!resp);
|
||||
|
||||
EditorNode::get_editor_data().instantiate_object_properties(obj);
|
||||
|
||||
edited_resource = RES(resp);
|
||||
emit_signal(SNAME("resource_changed"), edited_resource);
|
||||
_update_resource();
|
||||
|
|
|
|||
|
|
@ -269,7 +269,9 @@ void CustomPropertyEditor::_menu_option(int p_which) {
|
|||
res->call("set_instance_base_type", owner->get_class());
|
||||
}
|
||||
|
||||
EditorNode::get_editor_data().instantiate_object_properties(obj);
|
||||
v = obj;
|
||||
|
||||
emit_signal(SNAME("variant_changed"));
|
||||
|
||||
} break;
|
||||
|
|
@ -1092,7 +1094,9 @@ void CustomPropertyEditor::_type_create_selected(int p_idx) {
|
|||
ERR_FAIL_COND(!obj);
|
||||
ERR_FAIL_COND(!Object::cast_to<Resource>(obj));
|
||||
|
||||
EditorNode::get_editor_data().instantiate_object_properties(obj);
|
||||
v = obj;
|
||||
|
||||
emit_signal(SNAME("variant_changed"));
|
||||
hide();
|
||||
}
|
||||
|
|
@ -1283,7 +1287,9 @@ void CustomPropertyEditor::_action_pressed(int p_which) {
|
|||
ERR_BREAK(!obj);
|
||||
ERR_BREAK(!Object::cast_to<Resource>(obj));
|
||||
|
||||
EditorNode::get_editor_data().instantiate_object_properties(obj);
|
||||
v = obj;
|
||||
|
||||
emit_signal(SNAME("variant_changed"));
|
||||
hide();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue