Merge pull request #67614 from aaronfranke/virtually-virtual
Don't allow instancing virtual node types in the Create New Node dialog
This commit is contained in:
commit
e95dec0c64
3 changed files with 24 additions and 10 deletions
|
@ -31,6 +31,7 @@
|
|||
#include "class_db.h"
|
||||
|
||||
#include "core/config/engine.h"
|
||||
#include "core/object/script_language.h"
|
||||
#include "core/os/mutex.h"
|
||||
#include "core/version.h"
|
||||
|
||||
|
@ -376,7 +377,12 @@ bool ClassDB::is_virtual(const StringName &p_class) {
|
|||
OBJTYPE_RLOCK;
|
||||
|
||||
ClassInfo *ti = classes.getptr(p_class);
|
||||
ERR_FAIL_COND_V_MSG(!ti, false, "Cannot get class '" + String(p_class) + "'.");
|
||||
if (!ti) {
|
||||
if (!ScriptServer::is_global_class(p_class)) {
|
||||
ERR_FAIL_V_MSG(false, "Cannot get class '" + String(p_class) + "'.");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#ifdef TOOLS_ENABLED
|
||||
if (ti->api == API_EDITOR && !Engine::get_singleton()->is_editor_hint()) {
|
||||
return false;
|
||||
|
|
|
@ -284,12 +284,12 @@ void CreateDialog::_configure_search_option_item(TreeItem *r_item, const String
|
|||
bool can_instantiate = (p_type_category == TypeCategory::CPP_TYPE && ClassDB::can_instantiate(p_type)) ||
|
||||
p_type_category == TypeCategory::OTHER_TYPE;
|
||||
|
||||
if (!can_instantiate) {
|
||||
r_item->set_custom_color(0, search_options->get_theme_color(SNAME("disabled_font_color"), SNAME("Editor")));
|
||||
r_item->set_icon(0, EditorNode::get_singleton()->get_class_icon(p_type, "NodeDisabled"));
|
||||
r_item->set_selectable(0, false);
|
||||
} else {
|
||||
if (can_instantiate && !ClassDB::is_virtual(p_type)) {
|
||||
r_item->set_icon(0, EditorNode::get_singleton()->get_class_icon(p_type, icon_fallback));
|
||||
} else {
|
||||
r_item->set_icon(0, EditorNode::get_singleton()->get_class_icon(p_type, "NodeDisabled"));
|
||||
r_item->set_custom_color(0, search_options->get_theme_color(SNAME("disabled_font_color"), SNAME("Editor")));
|
||||
r_item->set_selectable(0, false);
|
||||
}
|
||||
|
||||
bool is_deprecated = EditorHelp::get_doc_data()->class_list[p_type].is_deprecated;
|
||||
|
|
|
@ -570,13 +570,17 @@ void EditorResourcePicker::_get_allowed_types(bool p_with_convert, HashSet<Strin
|
|||
|
||||
for (int i = 0; i < size; i++) {
|
||||
String base = allowed_types[i].strip_edges();
|
||||
p_vector->insert(base);
|
||||
if (!ClassDB::is_virtual(base)) {
|
||||
p_vector->insert(base);
|
||||
}
|
||||
|
||||
// If we hit a familiar base type, take all the data from cache.
|
||||
if (allowed_types_cache.has(base)) {
|
||||
List<StringName> allowed_subtypes = allowed_types_cache[base];
|
||||
for (const StringName &subtype_name : allowed_subtypes) {
|
||||
p_vector->insert(subtype_name);
|
||||
if (!ClassDB::is_virtual(subtype_name)) {
|
||||
p_vector->insert(subtype_name);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
List<StringName> allowed_subtypes;
|
||||
|
@ -586,13 +590,17 @@ void EditorResourcePicker::_get_allowed_types(bool p_with_convert, HashSet<Strin
|
|||
ClassDB::get_inheriters_from_class(base, &inheriters);
|
||||
}
|
||||
for (const StringName &subtype_name : inheriters) {
|
||||
p_vector->insert(subtype_name);
|
||||
if (!ClassDB::is_virtual(subtype_name)) {
|
||||
p_vector->insert(subtype_name);
|
||||
}
|
||||
allowed_subtypes.push_back(subtype_name);
|
||||
}
|
||||
|
||||
for (const StringName &subtype_name : global_classes) {
|
||||
if (EditorNode::get_editor_data().script_class_is_parent(subtype_name, base)) {
|
||||
p_vector->insert(subtype_name);
|
||||
if (!ClassDB::is_virtual(subtype_name)) {
|
||||
p_vector->insert(subtype_name);
|
||||
}
|
||||
allowed_subtypes.push_back(subtype_name);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue