mirror of
https://github.com/godotengine/godot.git
synced 2025-11-01 14:11:15 +00:00
Object: Add usage hint to instantiate Object properties in editor
Fixes #36372 as Path2D/Path3D's `curve` property no longer uses a Curve instance as default value, but instead it gets a (unique) default Curve instance when created through the editor (CreateDialog). ClassDB gets a sanity check to ensure that we don't do the same mistake for other properties in the future, but instead use the dedicated property usage hint. Fixes #36372. Fixes #36650. Supersedes #36644 and #36656. Co-authored-by: Thakee Nathees <thakeenathees@gmail.com> Co-authored-by: simpuid <utkarsh.email@yahoo.com>
This commit is contained in:
parent
84abf5a979
commit
b3bc5aafc5
7 changed files with 54 additions and 30 deletions
|
|
@ -513,30 +513,45 @@ String CreateDialog::get_selected_type() {
|
|||
Object *CreateDialog::instance_selected() {
|
||||
TreeItem *selected = search_options->get_selected();
|
||||
|
||||
if (selected) {
|
||||
Variant md = selected->get_metadata(0);
|
||||
if (!selected) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
String custom;
|
||||
if (md.get_type() != Variant::NIL) {
|
||||
custom = md;
|
||||
}
|
||||
Variant md = selected->get_metadata(0);
|
||||
String custom;
|
||||
if (md.get_type() != Variant::NIL) {
|
||||
custom = md;
|
||||
}
|
||||
|
||||
if (custom != String()) {
|
||||
if (ScriptServer::is_global_class(custom)) {
|
||||
Object *obj = EditorNode::get_editor_data().script_class_instance(custom);
|
||||
Node *n = Object::cast_to<Node>(obj);
|
||||
if (n) {
|
||||
n->set_name(custom);
|
||||
}
|
||||
return obj;
|
||||
Object *obj = nullptr;
|
||||
|
||||
if (!custom.empty()) {
|
||||
if (ScriptServer::is_global_class(custom)) {
|
||||
obj = EditorNode::get_editor_data().script_class_instance(custom);
|
||||
Node *n = Object::cast_to<Node>(obj);
|
||||
if (n) {
|
||||
n->set_name(custom);
|
||||
}
|
||||
return EditorNode::get_editor_data().instance_custom_type(selected->get_text(0), custom);
|
||||
obj = n;
|
||||
} else {
|
||||
return ClassDB::instance(selected->get_text(0));
|
||||
obj = EditorNode::get_editor_data().instance_custom_type(selected->get_text(0), custom);
|
||||
}
|
||||
} else {
|
||||
obj = ClassDB::instance(selected->get_text(0));
|
||||
}
|
||||
|
||||
// Check if any Object-type property should be instantiated.
|
||||
List<PropertyInfo> pinfo;
|
||||
obj->get_property_list(&pinfo);
|
||||
|
||||
for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) {
|
||||
if (E->get().type == Variant::OBJECT && E->get().usage & PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT) {
|
||||
Object *prop = ClassDB::instance(E->get().class_name);
|
||||
obj->set(E->get().name, prop);
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
return obj;
|
||||
}
|
||||
|
||||
void CreateDialog::_item_selected() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue