Move shaders to default theme and add shader_override related methods to Control class

This commit is contained in:
MarianoGNU 2015-12-20 18:21:53 -03:00
parent dc7755ffcd
commit 1f3d6824c8
10 changed files with 282 additions and 59 deletions

View file

@ -140,6 +140,11 @@ bool Control::_set(const StringName& p_name, const Variant& p_value) {
data.icon_override.erase(dname);
notification(NOTIFICATION_THEME_CHANGED);
update();
} else if (name.begins_with("custom_shaders/")) {
String dname = name.get_slicec('/',1);
data.shader_override.erase(dname);
notification(NOTIFICATION_THEME_CHANGED);
update();
} else if (name.begins_with("custom_styles/")) {
String dname = name.get_slicec('/',1);
data.style_override.erase(dname);
@ -168,6 +173,10 @@ bool Control::_set(const StringName& p_name, const Variant& p_value) {
String dname = name.get_slicec('/',1);
notification(NOTIFICATION_THEME_CHANGED);
add_icon_override(dname,p_value);
} else if (name.begins_with("custom_shaders/")) {
String dname = name.get_slicec('/',1);
add_shader_override(dname,p_value);
notification(NOTIFICATION_THEME_CHANGED);
} else if (name.begins_with("custom_styles/")) {
String dname = name.get_slicec('/',1);
add_style_override(dname,p_value);
@ -220,6 +229,10 @@ bool Control::_get(const StringName& p_name,Variant &r_ret) const {
String name = sname.get_slicec('/',1);
r_ret= data.icon_override.has(name)?Variant(data.icon_override[name]):Variant();
} else if (sname.begins_with("custom_shaders/")) {
String name = sname.get_slicec('/',1);
r_ret= data.shader_override.has(name)?Variant(data.shader_override[name]):Variant();
} else if (sname.begins_with("custom_styles/")) {
String name = sname.get_slicec('/',1);
@ -267,6 +280,18 @@ void Control::_get_property_list( List<PropertyInfo> *p_list) const {
p_list->push_back( PropertyInfo(Variant::OBJECT,"custom_icons/"+E->get(),PROPERTY_HINT_RESOURCE_TYPE, "Texture",hint) );
}
}
{
List<StringName> names;
theme->get_shader_list(get_type_name(),&names);
for(List<StringName>::Element *E=names.front();E;E=E->next()) {
uint32_t hint= PROPERTY_USAGE_EDITOR|PROPERTY_USAGE_CHECKABLE;
if (data.shader_override.has(E->get()))
hint|=PROPERTY_USAGE_STORAGE|PROPERTY_USAGE_CHECKED;
p_list->push_back( PropertyInfo(Variant::OBJECT,"custom_shaders/"+E->get(),PROPERTY_HINT_RESOURCE_TYPE, "CanvasItemShader,CanvasItemShaderGraph",hint) );
}
}
{
List<StringName> names;
theme->get_stylebox_list(get_type_name(),&names);
@ -1384,6 +1409,35 @@ Ref<Texture> Control::get_icon(const StringName& p_name,const StringName& p_type
}
Ref<Shader> Control::get_shader(const StringName& p_name,const StringName& p_type) const {
if (p_type==StringName()) {
const Ref<Shader>* sdr = data.shader_override.getptr(p_name);
if (sdr)
return *sdr;
}
StringName type = p_type?p_type:get_type_name();
// try with custom themes
Control *theme_owner = data.theme_owner;
while(theme_owner) {
if (theme_owner->data.theme->has_shader(p_name, type))
return data.theme_owner->data.theme->get_shader(p_name, type );
Control *parent = theme_owner->get_parent()?theme_owner->get_parent()->cast_to<Control>():NULL;
if (parent)
theme_owner=parent->data.theme_owner;
else
theme_owner=NULL;
}
return Theme::get_default()->get_shader( p_name, type );
}
Ref<StyleBox> Control::get_stylebox(const StringName& p_name,const StringName& p_type) const {
if (p_type==StringName()) {
@ -1530,7 +1584,37 @@ bool Control::has_icon(const StringName& p_name,const StringName& p_type) const
}
return Theme::get_default()->has_icon( p_name, type );
}
bool Control::has_shader(const StringName &p_name, const StringName &p_type) const
{
if (p_type==StringName()) {
const Ref<Shader>* sdr = data.shader_override.getptr(p_name);
if (sdr)
return true;
}
StringName type = p_type?p_type:get_type_name();
// try with custom themes
Control *theme_owner = data.theme_owner;
while(theme_owner) {
if (theme_owner->data.theme->has_shader(p_name, type))
return true;
Control *parent = theme_owner->get_parent()?theme_owner->get_parent()->cast_to<Control>():NULL;
if (parent)
theme_owner=parent->data.theme_owner;
else
theme_owner=NULL;
}
return Theme::get_default()->has_shader( p_name, type );
}
bool Control::has_stylebox(const StringName& p_name,const StringName& p_type) const {
@ -1996,7 +2080,14 @@ void Control::add_icon_override(const StringName& p_name, const Ref<Texture>& p_
data.icon_override[p_name]=p_icon;
notification(NOTIFICATION_THEME_CHANGED);
update();
}
void Control::add_shader_override(const StringName &p_name, const Ref<Shader> &p_shader) {
ERR_FAIL_COND(p_shader.is_null());
data.shader_override[p_name]=p_shader;
notification(NOTIFICATION_THEME_CHANGED);
update();
}
void Control::add_style_override(const StringName& p_name, const Ref<StyleBox>& p_style) {
@ -2837,8 +2928,9 @@ void Control::_bind_methods() {
ObjectTypeDB::bind_method(_MD("set_theme","theme:Theme"),&Control::set_theme);
ObjectTypeDB::bind_method(_MD("get_theme:Theme"),&Control::get_theme);
ObjectTypeDB::bind_method(_MD("add_icon_override","name","texture:Texture"),&Control::add_icon_override);
ObjectTypeDB::bind_method(_MD("add_shader_override","name","shader:Shader"),&Control::add_shader_override);
ObjectTypeDB::bind_method(_MD("add_style_override","name","stylebox:StyleBox"),&Control::add_style_override);
ObjectTypeDB::bind_method(_MD("add_font_override","name","font:Font"),&Control::add_font_override);
ObjectTypeDB::bind_method(_MD("add_color_override","name","color"),&Control::add_color_override);