From 4632cfd4bde9f6f31c8b721fa61e8f0cda6770d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=B4ng=20V=C4=83n=20T=C3=ACnh?= Date: Sun, 18 Aug 2024 14:09:06 +0700 Subject: [PATCH] Allow modification of the color for the checkbox's checked and unchecked icons Occasionally, the default white color for the icon does not meet our needs, and we would like to change it. However, the CheckBox does not currently have a mechanism to modify this color. --- doc/classes/CheckBox.xml | 6 ++++++ doc/classes/CheckButton.xml | 6 ++++++ scene/gui/check_box.cpp | 7 +++++-- scene/gui/check_box.h | 3 +++ scene/gui/check_button.cpp | 7 +++++-- scene/gui/check_button.h | 3 +++ scene/theme/default_theme.cpp | 6 ++++++ 7 files changed, 34 insertions(+), 4 deletions(-) diff --git a/doc/classes/CheckBox.xml b/doc/classes/CheckBox.xml index 5b2c93f7b33..4dd3724a741 100644 --- a/doc/classes/CheckBox.xml +++ b/doc/classes/CheckBox.xml @@ -15,6 +15,12 @@ + + The color of the checked icon when the checkbox is pressed. + + + The color of the unchecked icon when the checkbox is not pressed. + The vertical offset used when rendering the check icons (in pixels). diff --git a/doc/classes/CheckButton.xml b/doc/classes/CheckButton.xml index c2da6cfe3e3..bdcb049b6c4 100644 --- a/doc/classes/CheckButton.xml +++ b/doc/classes/CheckButton.xml @@ -14,6 +14,12 @@ + + The color of the checked icon when the checkbox is pressed. + + + The color of the unchecked icon when the checkbox is not pressed. + The vertical offset used when rendering the toggle icons (in pixels). diff --git a/scene/gui/check_box.cpp b/scene/gui/check_box.cpp index 99937aaf41f..b151b285cb9 100644 --- a/scene/gui/check_box.cpp +++ b/scene/gui/check_box.cpp @@ -127,9 +127,9 @@ void CheckBox::_notification(int p_what) { ofs.y = int((get_size().height - get_icon_size().height) / 2) + theme_cache.check_v_offset; if (is_pressed()) { - on_tex->draw_rect(ci, Rect2(ofs, _fit_icon_size(on_tex->get_size()))); + on_tex->draw_rect(ci, Rect2(ofs, _fit_icon_size(on_tex->get_size())), false, theme_cache.checkbox_checked_color); } else { - off_tex->draw_rect(ci, Rect2(ofs, _fit_icon_size(off_tex->get_size()))); + off_tex->draw_rect(ci, Rect2(ofs, _fit_icon_size(off_tex->get_size())), false, theme_cache.checkbox_unchecked_color); } } break; } @@ -152,6 +152,9 @@ void CheckBox::_bind_methods() { BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, CheckBox, unchecked_disabled); BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, CheckBox, radio_checked_disabled); BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, CheckBox, radio_unchecked_disabled); + + BIND_THEME_ITEM(Theme::DATA_TYPE_COLOR, CheckBox, checkbox_checked_color); + BIND_THEME_ITEM(Theme::DATA_TYPE_COLOR, CheckBox, checkbox_unchecked_color); } CheckBox::CheckBox(const String &p_text) : diff --git a/scene/gui/check_box.h b/scene/gui/check_box.h index 87261816311..a8af55a2f5a 100644 --- a/scene/gui/check_box.h +++ b/scene/gui/check_box.h @@ -49,6 +49,9 @@ class CheckBox : public Button { Ref unchecked_disabled; Ref radio_checked_disabled; Ref radio_unchecked_disabled; + + Color checkbox_checked_color; + Color checkbox_unchecked_color; } theme_cache; protected: diff --git a/scene/gui/check_button.cpp b/scene/gui/check_button.cpp index 29b9504776f..63d239857d3 100644 --- a/scene/gui/check_button.cpp +++ b/scene/gui/check_button.cpp @@ -134,9 +134,9 @@ void CheckButton::_notification(int p_what) { ofs.y = (get_size().height - tex_size.height) / 2 + theme_cache.check_v_offset; if (is_pressed()) { - on_tex->draw_rect(ci, Rect2(ofs, _fit_icon_size(on_tex->get_size()))); + on_tex->draw_rect(ci, Rect2(ofs, _fit_icon_size(on_tex->get_size())), false, theme_cache.button_checked_color); } else { - off_tex->draw_rect(ci, Rect2(ofs, _fit_icon_size(off_tex->get_size()))); + off_tex->draw_rect(ci, Rect2(ofs, _fit_icon_size(off_tex->get_size())), false, theme_cache.button_unchecked_color); } } break; } @@ -155,6 +155,9 @@ void CheckButton::_bind_methods() { BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, CheckButton, unchecked_mirrored); BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, CheckButton, checked_disabled_mirrored); BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, CheckButton, unchecked_disabled_mirrored); + + BIND_THEME_ITEM(Theme::DATA_TYPE_COLOR, CheckButton, button_checked_color); + BIND_THEME_ITEM(Theme::DATA_TYPE_COLOR, CheckButton, button_unchecked_color); } CheckButton::CheckButton(const String &p_text) : diff --git a/scene/gui/check_button.h b/scene/gui/check_button.h index 84f77b2e834..6cc33e232b2 100644 --- a/scene/gui/check_button.h +++ b/scene/gui/check_button.h @@ -49,6 +49,9 @@ class CheckButton : public Button { Ref unchecked_mirrored; Ref checked_disabled_mirrored; Ref unchecked_disabled_mirrored; + + Color button_checked_color; + Color button_unchecked_color; } theme_cache; protected: diff --git a/scene/theme/default_theme.cpp b/scene/theme/default_theme.cpp index f7ba440faf7..ac46de7baad 100644 --- a/scene/theme/default_theme.cpp +++ b/scene/theme/default_theme.cpp @@ -326,6 +326,9 @@ void fill_default_theme(Ref &theme, const Ref &default_font, const theme->set_constant("check_v_offset", "CheckBox", 0); theme->set_constant("outline_size", "CheckBox", 0); + theme->set_color("checkbox_checked_color", "CheckBox", Color(1, 1, 1)); + theme->set_color("checkbox_unchecked_color", "CheckBox", Color(1, 1, 1)); + // CheckButton Ref cb_empty = memnew(StyleBoxEmpty); @@ -363,6 +366,9 @@ void fill_default_theme(Ref &theme, const Ref &default_font, const theme->set_constant("check_v_offset", "CheckButton", 0); theme->set_constant("outline_size", "CheckButton", 0); + theme->set_color("button_checked_color", "CheckButton", Color(1, 1, 1)); + theme->set_color("button_unchecked_color", "CheckButton", Color(1, 1, 1)); + // Button variations theme->set_type_variation(SceneStringName(FlatButton), "Button");