diff options
author | dinoplane <isacsac2017@gmail.com> | 2023-06-04 18:22:24 -0700 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2023-06-12 10:59:33 +0200 |
commit | a374c7d519fa2961190c2d49170e4300e5995ecc (patch) | |
tree | c7df1f63c1128e62e8a1ecc2e9f4a2bb4d2df837 | |
parent | 37d1dfef9d81aade27ab0c56fc6b6f12f6a08045 (diff) | |
download | redot-engine-a374c7d519fa2961190c2d49170e4300e5995ecc.tar.gz |
Use cached hue for color picker when saturation is 0
Fixes #76968.
-rw-r--r-- | scene/gui/color_mode.cpp | 13 | ||||
-rw-r--r-- | scene/gui/color_picker.cpp | 6 | ||||
-rw-r--r-- | scene/gui/color_picker.h | 2 |
3 files changed, 18 insertions, 3 deletions
diff --git a/scene/gui/color_mode.cpp b/scene/gui/color_mode.cpp index 123938f964..e95b2b9107 100644 --- a/scene/gui/color_mode.cpp +++ b/scene/gui/color_mode.cpp @@ -117,8 +117,13 @@ float ColorModeHSV::get_slider_max(int idx) const { float ColorModeHSV::get_slider_value(int idx) const { switch (idx) { - case 0: - return color_picker->get_pick_color().get_h() * 360.0; + case 0: { + if (color_picker->get_pick_color().get_s() > 0) { + return color_picker->get_pick_color().get_h() * 360.0; + } else { + return color_picker->get_cached_hue(); + } + } case 1: return color_picker->get_pick_color().get_s() * 100.0; case 2: @@ -165,7 +170,9 @@ void ColorModeHSV::slider_draw(int p_which) { Color v_col; s_col.set_hsv(color.get_h(), 0, color.get_v()); left_color = (p_which == 1) ? s_col : Color(0, 0, 0); - s_col.set_hsv(color.get_h(), 1, color.get_v()); + + float s_col_hue = (color.get_s() == 0.0) ? color_picker->get_cached_hue() / 360.0 : color.get_h(); + s_col.set_hsv(s_col_hue, 1, color.get_v()); v_col.set_hsv(color.get_h(), color.get_s(), 1); right_color = (p_which == 1) ? s_col : v_col; } diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index 2a03786471..768502c658 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -376,6 +376,12 @@ void ColorPicker::_value_changed(double) { color = modes[current_mode]->get_color(); + if (current_mode == MODE_HSV) { + if (sliders[1]->get_value() > 0 || sliders[0]->get_value() != cached_hue) { + cached_hue = sliders[0]->get_value(); + } + } + if (current_mode == MODE_HSV || current_mode == MODE_OKHSL) { h = sliders[0]->get_value() / 360.0; s = sliders[1]->get_value() / 100.0; diff --git a/scene/gui/color_picker.h b/scene/gui/color_picker.h index 711a371688..bc7eadf223 100644 --- a/scene/gui/color_picker.h +++ b/scene/gui/color_picker.h @@ -204,6 +204,7 @@ private: float h = 0.0; float s = 0.0; float v = 0.0; + float cached_hue = 0.0; Color last_color; struct ThemeCache { @@ -294,6 +295,7 @@ public: #ifdef TOOLS_ENABLED void set_editor_settings(Object *p_editor_settings); #endif + float get_cached_hue() { return cached_hue; }; HSlider *get_slider(int idx); Vector<float> get_active_slider_values(); |