From 468a2a2a65e2947e39455e5082cf109ffc414411 Mon Sep 17 00:00:00 2001 From: Haoyu Qiu Date: Sat, 11 Sep 2021 20:33:29 +0800 Subject: [PATCH] Expose enum related methods in ClassDB --- core/bind/core_bind.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ core/bind/core_bind.h | 5 +++++ core/class_db.cpp | 18 ++++++++++++++++++ core/class_db.h | 1 + doc/classes/ClassDB.xml | 35 +++++++++++++++++++++++++++++++++++ 5 files changed, 100 insertions(+) diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp index 3bbe26311a5..f2e2e734e69 100644 --- a/core/bind/core_bind.cpp +++ b/core/bind/core_bind.cpp @@ -2886,6 +2886,42 @@ StringName _ClassDB::get_category(const StringName &p_node) const { return ClassDB::get_category(p_node); } +bool _ClassDB::has_enum(const StringName &p_class, const StringName &p_name, bool p_no_inheritance) const { + return ClassDB::has_enum(p_class, p_name, p_no_inheritance); +} + +PoolStringArray _ClassDB::get_enum_list(const StringName &p_class, bool p_no_inheritance) const { + List enums; + ClassDB::get_enum_list(p_class, &enums, p_no_inheritance); + + PoolStringArray ret; + ret.resize(enums.size()); + int idx = 0; + for (List::Element *E = enums.front(); E; E = E->next()) { + ret.set(idx++, E->get()); + } + + return ret; +} + +PoolStringArray _ClassDB::get_enum_constants(const StringName &p_class, const StringName &p_enum, bool p_no_inheritance) const { + List constants; + ClassDB::get_enum_constants(p_class, p_enum, &constants, p_no_inheritance); + + PoolStringArray ret; + ret.resize(constants.size()); + int idx = 0; + for (List::Element *E = constants.front(); E; E = E->next()) { + ret.set(idx++, E->get()); + } + + return ret; +} + +StringName _ClassDB::get_integer_constant_enum(const StringName &p_class, const StringName &p_name, bool p_no_inheritance) const { + return ClassDB::get_integer_constant_enum(p_class, p_name, p_no_inheritance); +} + bool _ClassDB::is_class_enabled(StringName p_class) const { return ClassDB::is_class_enabled(p_class); } @@ -2916,6 +2952,11 @@ void _ClassDB::_bind_methods() { ClassDB::bind_method(D_METHOD("class_has_integer_constant", "class", "name"), &_ClassDB::has_integer_constant); ClassDB::bind_method(D_METHOD("class_get_integer_constant", "class", "name"), &_ClassDB::get_integer_constant); + ClassDB::bind_method(D_METHOD("class_has_enum", "class", "name", "no_inheritance"), &_ClassDB::has_enum, DEFVAL(false)); + ClassDB::bind_method(D_METHOD("class_get_enum_list", "class", "no_inheritance"), &_ClassDB::get_enum_list, DEFVAL(false)); + ClassDB::bind_method(D_METHOD("class_get_enum_constants", "class", "enum", "no_inheritance"), &_ClassDB::get_enum_constants, DEFVAL(false)); + ClassDB::bind_method(D_METHOD("class_get_integer_constant_enum", "class", "name", "no_inheritance"), &_ClassDB::get_integer_constant_enum, DEFVAL(false)); + ClassDB::bind_method(D_METHOD("class_get_category", "class"), &_ClassDB::get_category); ClassDB::bind_method(D_METHOD("is_class_enabled", "class"), &_ClassDB::is_class_enabled); } diff --git a/core/bind/core_bind.h b/core/bind/core_bind.h index 1383d4452a4..387d4cce392 100644 --- a/core/bind/core_bind.h +++ b/core/bind/core_bind.h @@ -741,6 +741,11 @@ public: int get_integer_constant(const StringName &p_class, const StringName &p_name) const; StringName get_category(const StringName &p_node) const; + bool has_enum(const StringName &p_class, const StringName &p_name, bool p_no_inheritance = false) const; + PoolStringArray get_enum_list(const StringName &p_class, bool p_no_inheritance = false) const; + PoolStringArray get_enum_constants(const StringName &p_class, const StringName &p_enum, bool p_no_inheritance = false) const; + StringName get_integer_constant_enum(const StringName &p_class, const StringName &p_name, bool p_no_inheritance = false) const; + bool is_class_enabled(StringName p_class) const; _ClassDB(); diff --git a/core/class_db.cpp b/core/class_db.cpp index 0ac0a20cf4b..04b359400f7 100644 --- a/core/class_db.cpp +++ b/core/class_db.cpp @@ -790,6 +790,24 @@ void ClassDB::get_enum_constants(const StringName &p_class, const StringName &p_ } } +bool ClassDB::has_enum(const StringName &p_class, const StringName &p_name, bool p_no_inheritance) { + OBJTYPE_RLOCK; + + ClassInfo *type = classes.getptr(p_class); + + while (type) { + if (type->enum_map.has(p_name)) { + return true; + } + if (p_no_inheritance) { + return false; + } + type = type->inherits_ptr; + } + + return false; +} + void ClassDB::add_signal(StringName p_class, const MethodInfo &p_signal) { OBJTYPE_WLOCK; diff --git a/core/class_db.h b/core/class_db.h index f3c02c4a117..19f5c26485a 100644 --- a/core/class_db.h +++ b/core/class_db.h @@ -360,6 +360,7 @@ public: static StringName get_integer_constant_enum(const StringName &p_class, const StringName &p_name, bool p_no_inheritance = false); static void get_enum_list(const StringName &p_class, List *p_enums, bool p_no_inheritance = false); static void get_enum_constants(const StringName &p_class, const StringName &p_enum, List *p_constants, bool p_no_inheritance = false); + static bool has_enum(const StringName &p_class, const StringName &p_name, bool p_no_inheritance = false); static Variant class_get_default_property_value(const StringName &p_class, const StringName &p_property, bool *r_valid = nullptr); diff --git a/doc/classes/ClassDB.xml b/doc/classes/ClassDB.xml index 3dda143d3df..57b3ffc8a6f 100644 --- a/doc/classes/ClassDB.xml +++ b/doc/classes/ClassDB.xml @@ -30,6 +30,23 @@ Returns a category associated with the class for use in documentation and the Asset Library. Debug mode required. + + + + + + + Returns an array with all the keys in [code]enum[/code] of [code]class[/code] or its ancestry. + + + + + + + + Returns an array with all the enums of [code]class[/code] or its ancestry. + + @@ -38,6 +55,15 @@ Returns the value of the integer constant [code]name[/code] of [code]class[/code] or its ancestry. Always returns 0 when the constant could not be found. + + + + + + + Returns which enum the integer constant [code]name[/code] of [code]class[/code] or its ancestry belongs to. + + @@ -87,6 +113,15 @@ Returns an array with all the signals of [code]class[/code] or its ancestry if [code]no_inheritance[/code] is [code]false[/code]. Every element of the array is a [Dictionary] as described in [method class_get_signal]. + + + + + + + Returns whether [code]class[/code] or its ancestry has an enum called [code]name[/code] or not. + +