Proper inheritance checking when requesting theem resources

This commit is contained in:
Juan Linietsky 2017-01-11 18:29:59 -03:00
parent a29f942c6b
commit f698e2be4f
3 changed files with 127 additions and 25 deletions

View file

@ -258,12 +258,23 @@ void ClassDB::get_inheriters_from_class( const StringName& p_class,List<StringNa
}
StringName ClassDB::get_parent_class_nocheck(const StringName& p_class) {
OBJTYPE_RLOCK;
ClassInfo *ti = classes.getptr(p_class);
if (!ti)
return StringName();
return ti->inherits;
}
StringName ClassDB::get_parent_class(const StringName& p_class) {
OBJTYPE_RLOCK;
ClassInfo *ti = classes.getptr(p_class);
ERR_FAIL_COND_V(!ti,"");
ERR_FAIL_COND_V(!ti,StringName());
return ti->inherits;
}
@ -272,6 +283,7 @@ ClassDB::APIType ClassDB::get_api_type(const StringName &p_class) {
OBJTYPE_RLOCK;
ClassInfo *ti = classes.getptr(p_class);
ERR_FAIL_COND_V(!ti,API_NONE);
return ti->api;
}

View file

@ -239,6 +239,7 @@ public:
static void get_class_list( List<StringName> *p_classes);
static void get_inheriters_from_class( const StringName& p_class,List<StringName> *p_classes);
static StringName get_parent_class_nocheck(const StringName& p_class);
static StringName get_parent_class(const StringName& p_class);
static bool class_exists(const StringName &p_class);
static bool is_parent_class(const StringName &p_class,const StringName& p_inherits);

View file

@ -754,8 +754,16 @@ Ref<Texture> Control::get_icon(const StringName& p_name,const StringName& p_type
while(theme_owner) {
if (theme_owner->data.theme->has_icon(p_name, type ) )
return theme_owner->data.theme->get_icon(p_name, type );
StringName class_name = type;
while(class_name!=StringName()) {
if (theme_owner->data.theme->has_icon(p_name, class_name ) ) {
return theme_owner->data.theme->get_icon(p_name, class_name );
}
class_name = ClassDB::get_parent_class_nocheck(class_name);
}
Control *parent = theme_owner->get_parent()?theme_owner->get_parent()->cast_to<Control>():NULL;
if (parent)
@ -784,8 +792,16 @@ Ref<Shader> Control::get_shader(const StringName& p_name,const StringName& p_typ
while(theme_owner) {
if (theme_owner->data.theme->has_shader(p_name, type))
return theme_owner->data.theme->get_shader(p_name, type );
StringName class_name = type;
while(class_name!=StringName()) {
if (theme_owner->data.theme->has_shader(p_name, class_name ) ) {
return theme_owner->data.theme->get_shader(p_name, class_name );
}
class_name = ClassDB::get_parent_class_nocheck(class_name);
}
Control *parent = theme_owner->get_parent()?theme_owner->get_parent()->cast_to<Control>():NULL;
if (parent)
@ -813,9 +829,16 @@ Ref<StyleBox> Control::get_stylebox(const StringName& p_name,const StringName& p
while(theme_owner) {
if (theme_owner->data.theme->has_stylebox(p_name, type ) ) {
return theme_owner->data.theme->get_stylebox(p_name, type );
StringName class_name = type;
while(class_name!=StringName()) {
if (theme_owner->data.theme->has_stylebox(p_name, class_name ) ) {
return theme_owner->data.theme->get_stylebox(p_name, class_name );
}
class_name = ClassDB::get_parent_class_nocheck(class_name);
}
Control *parent = theme_owner->get_parent()?theme_owner->get_parent()->cast_to<Control>():NULL;
if (parent)
@ -842,8 +865,16 @@ Ref<Font> Control::get_font(const StringName& p_name,const StringName& p_type) c
while(theme_owner) {
if (theme_owner->data.theme->has_font(p_name, type ) )
return theme_owner->data.theme->get_font(p_name, type );
StringName class_name = type;
while(class_name!=StringName()) {
if (theme_owner->data.theme->has_font(p_name, class_name ) ) {
return theme_owner->data.theme->get_font(p_name, class_name );
}
class_name = ClassDB::get_parent_class_nocheck(class_name);
}
if (theme_owner->data.theme->get_default_theme_font().is_valid())
return theme_owner->data.theme->get_default_theme_font();
Control *parent = theme_owner->get_parent()?theme_owner->get_parent()->cast_to<Control>():NULL;
@ -872,8 +903,16 @@ Color Control::get_color(const StringName& p_name,const StringName& p_type) cons
while(theme_owner) {
if (theme_owner->data.theme->has_color(p_name, type ) )
return theme_owner->data.theme->get_color(p_name, type );
StringName class_name = type;
while(class_name!=StringName()) {
if (theme_owner->data.theme->has_color(p_name, class_name ) ) {
return theme_owner->data.theme->get_color(p_name, class_name );
}
class_name = ClassDB::get_parent_class_nocheck(class_name);
}
Control *parent = theme_owner->get_parent()?theme_owner->get_parent()->cast_to<Control>():NULL;
if (parent)
@ -901,8 +940,16 @@ int Control::get_constant(const StringName& p_name,const StringName& p_type) con
while(theme_owner) {
if (theme_owner->data.theme->has_constant(p_name, type ) )
return theme_owner->data.theme->get_constant(p_name, type );
StringName class_name = type;
while(class_name!=StringName()) {
if (theme_owner->data.theme->has_constant(p_name, class_name ) ) {
return theme_owner->data.theme->get_constant(p_name, class_name );
}
class_name = ClassDB::get_parent_class_nocheck(class_name);
}
Control *parent = theme_owner->get_parent()?theme_owner->get_parent()->cast_to<Control>():NULL;
if (parent)
@ -985,8 +1032,15 @@ bool Control::has_icon(const StringName& p_name,const StringName& p_type) const
while(theme_owner) {
if (theme_owner->data.theme->has_icon(p_name, type ) )
return true;
StringName class_name = type;
while(class_name!=StringName()) {
if (theme_owner->data.theme->has_icon(p_name, class_name ) ) {
return true;
}
class_name = ClassDB::get_parent_class_nocheck(class_name);
}
Control *parent = theme_owner->get_parent()?theme_owner->get_parent()->cast_to<Control>():NULL;
if (parent)
@ -1014,8 +1068,15 @@ bool Control::has_shader(const StringName &p_name, const StringName &p_type) con
while(theme_owner) {
if (theme_owner->data.theme->has_shader(p_name, type))
return true;
StringName class_name = type;
while(class_name!=StringName()) {
if (theme_owner->data.theme->has_shader(p_name, class_name ) ) {
return true;
}
class_name = ClassDB::get_parent_class_nocheck(class_name);
}
Control *parent = theme_owner->get_parent()?theme_owner->get_parent()->cast_to<Control>():NULL;
if (parent)
@ -1042,8 +1103,15 @@ bool Control::has_stylebox(const StringName& p_name,const StringName& p_type) co
while(theme_owner) {
if (theme_owner->data.theme->has_stylebox(p_name, type ) )
return true;
StringName class_name = type;
while(class_name!=StringName()) {
if (theme_owner->data.theme->has_stylebox(p_name, class_name ) ) {
return true;
}
class_name = ClassDB::get_parent_class_nocheck(class_name);
}
Control *parent = theme_owner->get_parent()?theme_owner->get_parent()->cast_to<Control>():NULL;
if (parent)
@ -1071,8 +1139,15 @@ bool Control::has_font(const StringName& p_name,const StringName& p_type) const
while(theme_owner) {
if (theme_owner->data.theme->has_font(p_name, type ) )
return true;
StringName class_name = type;
while(class_name!=StringName()) {
if (theme_owner->data.theme->has_font(p_name, class_name ) ) {
return true;
}
class_name = ClassDB::get_parent_class_nocheck(class_name);
}
Control *parent = theme_owner->get_parent()?theme_owner->get_parent()->cast_to<Control>():NULL;
if (parent)
@ -1100,8 +1175,15 @@ bool Control::has_color(const StringName& p_name, const StringName& p_type) cons
while(theme_owner) {
if (theme_owner->data.theme->has_color(p_name, type ) )
return true;
StringName class_name = type;
while(class_name!=StringName()) {
if (theme_owner->data.theme->has_color(p_name, class_name ) ) {
return true;
}
class_name = ClassDB::get_parent_class_nocheck(class_name);
}
Control *parent = theme_owner->get_parent()?theme_owner->get_parent()->cast_to<Control>():NULL;
if (parent)
@ -1130,8 +1212,15 @@ bool Control::has_constant(const StringName& p_name,const StringName& p_type) co
while(theme_owner) {
if (theme_owner->data.theme->has_constant(p_name, type ) )
return true;
StringName class_name = type;
while(class_name!=StringName()) {
if (theme_owner->data.theme->has_constant(p_name, class_name ) ) {
return true;
}
class_name = ClassDB::get_parent_class_nocheck(class_name);
}
Control *parent = theme_owner->get_parent()?theme_owner->get_parent()->cast_to<Control>():NULL;
if (parent)