Skip to content

Commit

Permalink
Merge pull request #47252 from KoBeWi/themecide
Browse files Browse the repository at this point in the history
Add methods to remove theme overrides
  • Loading branch information
akien-mga authored Mar 31, 2021
2 parents 8621c86 + 5950482 commit 5d0cc7c
Show file tree
Hide file tree
Showing 3 changed files with 127 additions and 34 deletions.
65 changes: 59 additions & 6 deletions doc/classes/Control.xml
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,6 @@
</argument>
<description>
Overrides the [Color] with given [code]name[/code] in the [member theme] resource the control uses.
[b]Note:[/b] Unlike other theme overrides, there is no way to undo a color override without manually assigning the previous color.
[b]Example of overriding a label's color and resetting it later:[/b]
[codeblocks]
[gdscript]
Expand Down Expand Up @@ -178,7 +177,7 @@
<argument index="1" name="constant" type="int">
</argument>
<description>
Overrides an integer constant with given [code]name[/code] in the [member theme] resource the control uses. If the [code]constant[/code] is [code]0[/code], the override is cleared and the constant from assigned [Theme] is used.
Overrides an integer constant with given [code]name[/code] in the [member theme] resource the control uses.
</description>
</method>
<method name="add_theme_font_override">
Expand All @@ -189,7 +188,7 @@
<argument index="1" name="font" type="Font">
</argument>
<description>
Overrides the font with given [code]name[/code] in the [member theme] resource the control uses. If [code]font[/code] is [code]null[/code] or invalid, the override is cleared and the font from assigned [Theme] is used.
Overrides the font with given [code]name[/code] in the [member theme] resource the control uses.
</description>
</method>
<method name="add_theme_font_size_override">
Expand All @@ -200,7 +199,7 @@
<argument index="1" name="font_size" type="int">
</argument>
<description>
Overrides the font size with given [code]name[/code] in the [member theme] resource the control uses. If [code]font_size[/code] is [code]-1[/code], the override is cleared and the font size from assigned [Theme] is used.
Overrides the font size with given [code]name[/code] in the [member theme] resource the control uses.
</description>
</method>
<method name="add_theme_icon_override">
Expand All @@ -211,7 +210,7 @@
<argument index="1" name="texture" type="Texture2D">
</argument>
<description>
Overrides the icon with given [code]name[/code] in the [member theme] resource the control uses. If [code]icon[/code] is [code]null[/code] or invalid, the override is cleared and the icon from assigned [Theme] is used.
Overrides the icon with given [code]name[/code] in the [member theme] resource the control uses.
</description>
</method>
<method name="add_theme_stylebox_override">
Expand All @@ -222,7 +221,7 @@
<argument index="1" name="stylebox" type="StyleBox">
</argument>
<description>
Overrides the [StyleBox] with given [code]name[/code] in the [member theme] resource the control uses. If [code]stylebox[/code] is empty or invalid, the override is cleared and the [StyleBox] from assigned [Theme] is used.
Overrides the [StyleBox] with given [code]name[/code] in the [member theme] resource the control uses.
[b]Example of modifying a property in a StyleBox by duplicating it:[/b]
[codeblocks]
[gdscript]
Expand Down Expand Up @@ -730,6 +729,60 @@
Give up the focus. No other control will be able to receive keyboard input.
</description>
</method>
<method name="remove_theme_color_override">
<return type="void">
</return>
<argument index="0" name="name" type="StringName">
</argument>
<description>
Removes a theme override for a [Color] with the given [code]name[/code].
</description>
</method>
<method name="remove_theme_constant_override">
<return type="void">
</return>
<argument index="0" name="name" type="StringName">
</argument>
<description>
Removes a theme override for a constant with the given [code]name[/code].
</description>
</method>
<method name="remove_theme_font_override">
<return type="void">
</return>
<argument index="0" name="name" type="StringName">
</argument>
<description>
Removes a theme override for a [Font] with the given [code]name[/code].
</description>
</method>
<method name="remove_theme_font_size_override">
<return type="void">
</return>
<argument index="0" name="name" type="StringName">
</argument>
<description>
Removes a theme override for a font size with the given [code]name[/code].
</description>
</method>
<method name="remove_theme_icon_override">
<return type="void">
</return>
<argument index="0" name="name" type="StringName">
</argument>
<description>
Removes a theme override for an icon with the given [code]name[/code].
</description>
</method>
<method name="remove_theme_stylebox_override">
<return type="void">
</return>
<argument index="0" name="name" type="StringName">
</argument>
<description>
Removes a theme override for a [StyleBox] with the given [code]name[/code].
</description>
</method>
<method name="set_anchor">
<return type="void">
</return>
Expand Down
89 changes: 61 additions & 28 deletions scene/gui/control.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,6 @@ bool Control::_get(const StringName &p_name, Variant &r_ret) const {
r_ret = data.color_override.has(name) ? Variant(data.color_override[name]) : Variant();
} else if (sname.begins_with("custom_constants/")) {
String name = sname.get_slicec('/', 1);

r_ret = data.constant_override.has(name) ? Variant(data.constant_override[name]) : Variant();
} else {
return false;
Expand Down Expand Up @@ -1776,53 +1775,38 @@ Rect2 Control::get_anchorable_rect() const {
}

void Control::add_theme_icon_override(const StringName &p_name, const Ref<Texture2D> &p_icon) {
ERR_FAIL_COND(!p_icon.is_valid());

if (data.icon_override.has(p_name)) {
data.icon_override[p_name]->disconnect("changed", callable_mp(this, &Control::_override_changed));
}

// clear if "null" is passed instead of an icon
if (p_icon.is_null()) {
data.icon_override.erase(p_name);
} else {
data.icon_override[p_name] = p_icon;
if (data.icon_override[p_name].is_valid()) {
data.icon_override[p_name]->connect("changed", callable_mp(this, &Control::_override_changed), Vector<Variant>(), CONNECT_REFERENCE_COUNTED);
}
}
data.icon_override[p_name] = p_icon;
data.icon_override[p_name]->connect("changed", callable_mp(this, &Control::_override_changed), Vector<Variant>(), CONNECT_REFERENCE_COUNTED);
notification(NOTIFICATION_THEME_CHANGED);
}

void Control::add_theme_style_override(const StringName &p_name, const Ref<StyleBox> &p_style) {
ERR_FAIL_COND(!p_style.is_valid());

if (data.style_override.has(p_name)) {
data.style_override[p_name]->disconnect("changed", callable_mp(this, &Control::_override_changed));
}

// clear if "null" is passed instead of a style
if (p_style.is_null()) {
data.style_override.erase(p_name);
} else {
data.style_override[p_name] = p_style;
if (data.style_override[p_name].is_valid()) {
data.style_override[p_name]->connect("changed", callable_mp(this, &Control::_override_changed), Vector<Variant>(), CONNECT_REFERENCE_COUNTED);
}
}
data.style_override[p_name] = p_style;
data.style_override[p_name]->connect("changed", callable_mp(this, &Control::_override_changed), Vector<Variant>(), CONNECT_REFERENCE_COUNTED);
notification(NOTIFICATION_THEME_CHANGED);
}

void Control::add_theme_font_override(const StringName &p_name, const Ref<Font> &p_font) {
ERR_FAIL_COND(!p_font.is_valid());

if (data.font_override.has(p_name)) {
data.font_override[p_name]->disconnect("changed", callable_mp(this, &Control::_override_changed));
}

// clear if "null" is passed instead of a font
if (p_font.is_null()) {
data.font_override.erase(p_name);
} else {
data.font_override[p_name] = p_font;
if (data.font_override[p_name].is_valid()) {
data.font_override[p_name]->connect("changed", callable_mp(this, &Control::_override_changed), Vector<Variant>(), CONNECT_REFERENCE_COUNTED);
}
}
data.font_override[p_name] = p_font;
data.font_override[p_name]->connect("changed", callable_mp(this, &Control::_override_changed), Vector<Variant>(), CONNECT_REFERENCE_COUNTED);
notification(NOTIFICATION_THEME_CHANGED);
}

Expand All @@ -1841,6 +1825,48 @@ void Control::add_theme_constant_override(const StringName &p_name, int p_consta
notification(NOTIFICATION_THEME_CHANGED);
}

void Control::remove_theme_icon_override(const StringName &p_name) {
if (data.icon_override.has(p_name)) {
data.icon_override[p_name]->disconnect("changed", callable_mp(this, &Control::_override_changed));
}

data.icon_override.erase(p_name);
notification(NOTIFICATION_THEME_CHANGED);
}

void Control::remove_theme_style_override(const StringName &p_name) {
if (data.style_override.has(p_name)) {
data.style_override[p_name]->disconnect("changed", callable_mp(this, &Control::_override_changed));
}

data.style_override.erase(p_name);
notification(NOTIFICATION_THEME_CHANGED);
}

void Control::remove_theme_font_override(const StringName &p_name) {
if (data.font_override.has(p_name)) {
data.font_override[p_name]->disconnect("changed", callable_mp(this, &Control::_override_changed));
}

data.font_override.erase(p_name);
notification(NOTIFICATION_THEME_CHANGED);
}

void Control::remove_theme_font_size_override(const StringName &p_name) {
data.font_size_override.erase(p_name);
notification(NOTIFICATION_THEME_CHANGED);
}

void Control::remove_theme_color_override(const StringName &p_name) {
data.color_override.erase(p_name);
notification(NOTIFICATION_THEME_CHANGED);
}

void Control::remove_theme_constant_override(const StringName &p_name) {
data.constant_override.erase(p_name);
notification(NOTIFICATION_THEME_CHANGED);
}

void Control::set_focus_mode(FocusMode p_focus_mode) {
ERR_FAIL_INDEX((int)p_focus_mode, 3);

Expand Down Expand Up @@ -2795,6 +2821,13 @@ void Control::_bind_methods() {
ClassDB::bind_method(D_METHOD("add_theme_color_override", "name", "color"), &Control::add_theme_color_override);
ClassDB::bind_method(D_METHOD("add_theme_constant_override", "name", "constant"), &Control::add_theme_constant_override);

ClassDB::bind_method(D_METHOD("remove_theme_icon_override", "name"), &Control::remove_theme_icon_override);
ClassDB::bind_method(D_METHOD("remove_theme_stylebox_override", "name"), &Control::remove_theme_style_override);
ClassDB::bind_method(D_METHOD("remove_theme_font_override", "name"), &Control::remove_theme_font_override);
ClassDB::bind_method(D_METHOD("remove_theme_font_size_override", "name"), &Control::remove_theme_font_size_override);
ClassDB::bind_method(D_METHOD("remove_theme_color_override", "name"), &Control::remove_theme_color_override);
ClassDB::bind_method(D_METHOD("remove_theme_constant_override", "name"), &Control::remove_theme_constant_override);

ClassDB::bind_method(D_METHOD("get_theme_icon", "name", "node_type"), &Control::get_theme_icon, DEFVAL(""));
ClassDB::bind_method(D_METHOD("get_theme_stylebox", "name", "node_type"), &Control::get_theme_stylebox, DEFVAL(""));
ClassDB::bind_method(D_METHOD("get_theme_font", "name", "node_type"), &Control::get_theme_font, DEFVAL(""));
Expand Down
7 changes: 7 additions & 0 deletions scene/gui/control.h
Original file line number Diff line number Diff line change
Expand Up @@ -459,6 +459,13 @@ class Control : public CanvasItem {
void add_theme_color_override(const StringName &p_name, const Color &p_color);
void add_theme_constant_override(const StringName &p_name, int p_constant);

void remove_theme_icon_override(const StringName &p_name);
void remove_theme_style_override(const StringName &p_name);
void remove_theme_font_override(const StringName &p_name);
void remove_theme_font_size_override(const StringName &p_name);
void remove_theme_color_override(const StringName &p_name);
void remove_theme_constant_override(const StringName &p_name);

Ref<Texture2D> get_theme_icon(const StringName &p_name, const StringName &p_node_type = StringName()) const;
Ref<StyleBox> get_theme_stylebox(const StringName &p_name, const StringName &p_node_type = StringName()) const;
Ref<Font> get_theme_font(const StringName &p_name, const StringName &p_node_type = StringName()) const;
Expand Down

0 comments on commit 5d0cc7c

Please sign in to comment.