Move shaders to default theme and add shader_override related methods to Control class
This commit is contained in:
parent
dc7755ffcd
commit
1f3d6824c8
10 changed files with 282 additions and 59 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue