From 3160add2b0b030ae5b8ae0ad3c3b55d4367f2455 Mon Sep 17 00:00:00 2001 From: ajreckof Date: Tue, 19 Sep 2023 10:47:46 +0200 Subject: [PATCH] Fix ColorPicker deferred mode not working for sliders. --- scene/gui/color_picker.cpp | 25 ++++++++++++++++++------- scene/gui/color_picker.h | 5 ++++- scene/gui/range.h | 1 + scene/gui/slider.cpp | 3 +++ 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index 5ec0714b64f1..c2512bed664a 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -341,7 +341,11 @@ bool ColorPicker::is_editing_alpha() const { return edit_alpha; } -void ColorPicker::_value_changed(double) { +void ColorPicker::_slider_drag_started() { + currently_dragging = true; +} + +void ColorPicker::_slider_value_changed() { if (updating) { return; } @@ -357,7 +361,16 @@ void ColorPicker::_value_changed(double) { } _set_pick_color(color, false); - emit_signal(SNAME("color_changed"), color); + if (!deferred_mode_enabled || !currently_dragging) { + emit_signal(SNAME("color_changed"), color); + } +} + +void ColorPicker::_slider_drag_ended() { + currently_dragging = false; + if (deferred_mode_enabled) { + emit_signal(SNAME("color_changed"), color); + } } void ColorPicker::add_mode(ColorMode *p_mode) { @@ -388,7 +401,9 @@ void ColorPicker::create_slider(GridContainer *gc, int idx) { slider->set_h_size_flags(SIZE_EXPAND_FILL); - slider->connect("value_changed", callable_mp(this, &ColorPicker::_value_changed)); + slider->connect("drag_started", callable_mp(this, &ColorPicker::_slider_drag_started)); + slider->connect("value_changed", callable_mp(this, &ColorPicker::_slider_value_changed).unbind(1)); + slider->connect("drag_ended", callable_mp(this, &ColorPicker::_slider_drag_ended).unbind(1)); slider->connect("draw", callable_mp(this, &ColorPicker::_slider_draw).bind(idx)); slider->connect("gui_input", callable_mp(this, &ColorPicker::_slider_or_spin_input)); @@ -1242,7 +1257,6 @@ void ColorPicker::_uv_input(const Ref &p_event, Control *c) { _copy_hsv_to_color(); last_color = color; set_pick_color(color); - _update_color(); if (!deferred_mode_enabled) { emit_signal(SNAME("color_changed"), color); @@ -1293,7 +1307,6 @@ void ColorPicker::_uv_input(const Ref &p_event, Control *c) { _copy_hsv_to_color(); last_color = color; set_pick_color(color); - _update_color(); if (!deferred_mode_enabled) { emit_signal(SNAME("color_changed"), color); @@ -1321,7 +1334,6 @@ void ColorPicker::_w_input(const Ref &p_event) { _copy_hsv_to_color(); last_color = color; set_pick_color(color); - _update_color(); if (!bev->is_pressed() && bev->get_button_index() == MouseButton::LEFT) { add_recent_preset(color); @@ -1347,7 +1359,6 @@ void ColorPicker::_w_input(const Ref &p_event) { _copy_hsv_to_color(); last_color = color; set_pick_color(color); - _update_color(); if (!deferred_mode_enabled) { emit_signal(SNAME("color_changed"), color); diff --git a/scene/gui/color_picker.h b/scene/gui/color_picker.h index 96dbca9a0cf3..dc547c8b0c03 100644 --- a/scene/gui/color_picker.h +++ b/scene/gui/color_picker.h @@ -207,6 +207,7 @@ class ColorPicker : public VBoxContainer { bool hex_visible = true; bool line_edit_mouse_release = false; bool text_changed = false; + bool currently_dragging = false; float h = 0.0; float s = 0.0; @@ -254,7 +255,9 @@ class ColorPicker : public VBoxContainer { void create_slider(GridContainer *gc, int idx); void _reset_sliders_theme(); void _html_submitted(const String &p_html); - void _value_changed(double); + void _slider_drag_started(); + void _slider_value_changed(); + void _slider_drag_ended(); void _update_controls(); void _update_color(bool p_update_sliders = true); void _update_text_value(); diff --git a/scene/gui/range.h b/scene/gui/range.h index 9b4f0707e6f4..b1c2446deda3 100644 --- a/scene/gui/range.h +++ b/scene/gui/range.h @@ -64,6 +64,7 @@ class Range : public Control { protected: virtual void _value_changed(double p_value); + void _notify_shared_value_changed() { shared->emit_value_changed(); }; static void _bind_methods(); diff --git a/scene/gui/slider.cpp b/scene/gui/slider.cpp index b1a2f8017edd..8bb8eb1d3004 100644 --- a/scene/gui/slider.cpp +++ b/scene/gui/slider.cpp @@ -68,15 +68,18 @@ void Slider::gui_input(const Ref &p_event) { double grab_width = (double)grabber->get_width(); double grab_height = (double)grabber->get_height(); double max = orientation == VERTICAL ? get_size().height - grab_height : get_size().width - grab_width; + set_block_signals(true); if (orientation == VERTICAL) { set_as_ratio(1 - (((double)grab.pos - (grab_height / 2.0)) / max)); } else { set_as_ratio(((double)grab.pos - (grab_width / 2.0)) / max); } + set_block_signals(false); grab.active = true; grab.uvalue = get_as_ratio(); emit_signal(SNAME("drag_started")); + _notify_shared_value_changed(); } else { grab.active = false;