Skip to content

Commit

Permalink
Refactor auto-instantiation of Object properties in editor
Browse files Browse the repository at this point in the history
Auto-instantiation is used by the create dialog, but should also be
used by the editor inspector.

This refactors object properties auto-instantiation into a dedicated
method to be reused throughout editor (and possibly scripting).
  • Loading branch information
Andrii Doroshenko (Xrayez) committed Dec 28, 2021
1 parent 28174d5 commit 7a8b11e
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 12 deletions.
3 changes: 2 additions & 1 deletion core/object/class_db.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1632,7 +1632,8 @@ Variant ClassDB::class_get_default_property_value(const StringName &p_class, con
// Some properties may have an instantiated Object as default value,
// (like Path2D's `curve` used to have), but that's not a good practice.
// Instead, those properties should use PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT
// to be auto-instantiated when created in the editor.
// to be auto-instantiated when created in the editor with the following method:
// EditorNode::get_editor_data().instantiate_object_properties(obj);
if (var.get_type() == Variant::OBJECT) {
Object *obj = var.get_validated_object();
if (obj) {
Expand Down
12 changes: 1 addition & 11 deletions editor/create_dialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -446,17 +446,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;
}
Expand Down
15 changes: 15 additions & 0 deletions editor/editor_data.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
2 changes: 2 additions & 0 deletions editor/editor_data.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,8 @@ class EditorData {
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);
Expand Down
2 changes: 2 additions & 0 deletions editor/editor_resource_picker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,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();
Expand Down
6 changes: 6 additions & 0 deletions editor/property_editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -1080,7 +1082,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();
}
Expand Down Expand Up @@ -1270,7 +1274,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();
}
Expand Down

0 comments on commit 7a8b11e

Please sign in to comment.