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 5b2c93f7b3..4dd3724a74 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 c2da6cfe3e..bdcb049b6c 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 99937aaf41..b151b285cb 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 8726181631..a8af55a2f5 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 29b9504776..63d239857d 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 84f77b2e83..6cc33e232b 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 f7ba440faf..ac46de7baa 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");