From c7ba2153106b3fdec1bc959c04051eef429d2b80 Mon Sep 17 00:00:00 2001 From: LuoZhihao Date: Thu, 6 Mar 2025 20:22:41 +0800 Subject: [PATCH] Colorize raw mode rgb sliders --- scene/gui/color_mode.cpp | 22 +++++++++------------- scene/gui/color_mode.h | 3 +-- scene/gui/color_picker.cpp | 37 +++++++++++++++++-------------------- scene/gui/color_picker.h | 2 -- 4 files changed, 27 insertions(+), 37 deletions(-) diff --git a/scene/gui/color_mode.cpp b/scene/gui/color_mode.cpp index 5fae32c17d41..121a588aaeb7 100644 --- a/scene/gui/color_mode.cpp +++ b/scene/gui/color_mode.cpp @@ -261,7 +261,15 @@ void ColorModeRAW::slider_draw(int p_which) { left_color.a = 0; right_color = color; right_color.a = 1; - + } else if (p_which != 3) { + left_color = Color( + p_which == 0 ? 0 : color.r, + p_which == 1 ? 0 : color.g, + p_which == 2 ? 0 : color.b); + right_color = Color( + p_which == 0 ? 1 : color.r, + p_which == 1 ? 1 : color.g, + p_which == 2 ? 1 : color.b); col.set(0, left_color); col.set(1, right_color); col.set(2, right_color); @@ -275,18 +283,6 @@ void ColorModeRAW::slider_draw(int p_which) { } } -bool ColorModeRAW::apply_theme() const { - for (int i = 0; i < ColorPicker::SLIDER_COUNT; i++) { - HSlider *slider = color_picker->get_slider(i); - slider->remove_theme_icon_override("grabber"); - slider->remove_theme_icon_override("grabber_highlight"); - slider->remove_theme_style_override("slider"); - slider->remove_theme_constant_override("grabber_offset"); - } - - return true; -} - void ColorModeOKHSL::_value_changed() { Vector values = color_picker->get_active_slider_values(); diff --git a/scene/gui/color_mode.h b/scene/gui/color_mode.h index 06b432d67437..d2103c150627 100644 --- a/scene/gui/color_mode.h +++ b/scene/gui/color_mode.h @@ -55,7 +55,7 @@ class ColorMode { virtual void _value_changed() {} virtual void slider_draw(int p_which) = 0; - virtual bool apply_theme() const { return false; } + virtual ColorPicker::PickerShapeType get_shape_override() const { return ColorPicker::SHAPE_MAX; } ColorMode(ColorPicker *p_color_picker); @@ -126,7 +126,6 @@ class ColorModeRAW : public ColorMode { virtual Color get_color() const override; virtual void slider_draw(int p_which) override; - virtual bool apply_theme() const override; ColorModeRAW(ColorPicker *p_color_picker) : ColorMode(p_color_picker) {} diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index a27a4dee41e9..5d5d6cf84a97 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -295,8 +295,6 @@ void ColorPicker::_update_controls() { } alpha_label->set_text("A"); - slider_theme_modified = modes[current_mode]->apply_theme(); - if (edit_alpha) { alpha_value->show(); alpha_slider->show(); @@ -446,6 +444,8 @@ void ColorPicker::_slider_value_changed() { sliders[1]->set_value_no_signal(color.g / multiplier); sliders[2]->set_value_no_signal(color.b / multiplier); sliders[3]->set_value_no_signal(Math::log2(multiplier)); + // The color slightly changes because of slider step. + color = modes[current_mode]->get_color(); } // Set intensity spinbox prefix. values[3]->set_prefix(sliders[3]->get_value() < 0 ? "" : "+"); @@ -624,7 +624,8 @@ void ColorPicker::_reset_sliders_theme() { style_box_flat->set_content_margin(SIDE_TOP, 16 * theme_cache.base_scale); style_box_flat->set_bg_color(Color(0.2, 0.23, 0.31).lerp(Color(0, 0, 0, 1), 0.3).clamp()); - for (int i = 0; i < SLIDER_COUNT; i++) { + // Skip intensity slider. + for (int i = 0; i < SLIDER_COUNT - 1; i++) { sliders[i]->begin_bulk_theme_override(); sliders[i]->add_theme_icon_override("grabber", theme_cache.bar_arrow); sliders[i]->add_theme_icon_override("grabber_highlight", theme_cache.bar_arrow); @@ -1180,10 +1181,6 @@ void ColorPicker::set_color_mode(ColorModeType p_mode) { return; } - if (slider_theme_modified) { - _reset_sliders_theme(); - } - mode_popup->set_item_checked(current_mode, false); mode_popup->set_item_checked(p_mode, true); @@ -1224,22 +1221,22 @@ void ColorPicker::set_colorize_sliders(bool p_colorize_sliders) { if (colorize_sliders) { Ref style_box_empty(memnew(StyleBoxEmpty)); - if (!slider_theme_modified) { - for (int i = 0; i < SLIDER_COUNT; i++) { - sliders[i]->add_theme_style_override("slider", style_box_empty); - } + // Skip intensity slider. + for (int i = 0; i < SLIDER_COUNT - 1; i++) { + sliders[i]->add_theme_style_override("slider", style_box_empty); } + alpha_slider->add_theme_style_override("slider", style_box_empty); } else { Ref style_box_flat(memnew(StyleBoxFlat)); style_box_flat->set_content_margin(SIDE_TOP, 16 * theme_cache.base_scale); style_box_flat->set_bg_color(Color(0.2, 0.23, 0.31).lerp(Color(0, 0, 0, 1), 0.3).clamp()); - if (!slider_theme_modified) { - for (int i = 0; i < SLIDER_COUNT; i++) { - sliders[i]->add_theme_style_override("slider", style_box_flat); - } + // Skip intensity slider. + for (int i = 0; i < SLIDER_COUNT - 1; i++) { + sliders[i]->add_theme_style_override("slider", style_box_flat); } + alpha_slider->add_theme_style_override("slider", style_box_flat); } } @@ -2271,10 +2268,10 @@ ColorPicker::ColorPicker() { shape_popup->set_item_checked(current_shape, true); shape_popup->connect(SceneStringName(id_pressed), callable_mp(this, &ColorPicker::set_picker_shape)); - add_mode(new ColorModeRGB(this)); - add_mode(new ColorModeHSV(this)); - add_mode(new ColorModeRAW(this)); - add_mode(new ColorModeOKHSL(this)); + add_mode(memnew(ColorModeRGB(this))); + add_mode(memnew(ColorModeHSV(this))); + add_mode(memnew(ColorModeRAW(this))); + add_mode(memnew(ColorModeOKHSL(this))); mode_hbc = memnew(HBoxContainer); real_vbox->add_child(mode_hbc); @@ -2452,7 +2449,7 @@ ColorPicker::ColorPicker() { ColorPicker::~ColorPicker() { for (int i = 0; i < modes.size(); i++) { - delete modes[i]; + memdelete(modes[i]); } } diff --git a/scene/gui/color_picker.h b/scene/gui/color_picker.h index 62ee4e5607c0..1166ad358ed4 100644 --- a/scene/gui/color_picker.h +++ b/scene/gui/color_picker.h @@ -129,8 +129,6 @@ class ColorPicker : public VBoxContainer { static const int MODE_BUTTON_COUNT = 3; const float WHEEL_RADIUS = 0.42; - bool slider_theme_modified = true; - Vector modes; Popup *picker_window = nullptr;