From 9500f8e69ae798c070c4daca9c46beaf8db18bd4 Mon Sep 17 00:00:00 2001 From: pattlebass <49322676+pattlebass@users.noreply.github.com> Date: Mon, 2 Jan 2023 15:15:36 +0200 Subject: [PATCH] Fix Range-derived nodes not redrawing When using set_value_no_signal(), Range-derived nodes wouldn't redraw. Also added a dedicated method to SpinBox to update its text. --- scene/gui/range.cpp | 23 +++++++++++++++++++++-- scene/gui/range.h | 2 ++ scene/gui/spin_box.cpp | 19 +++++++++++-------- scene/gui/spin_box.h | 2 +- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/scene/gui/range.cpp b/scene/gui/range.cpp index 00c81c8616a5..8f337503e409 100644 --- a/scene/gui/range.cpp +++ b/scene/gui/range.cpp @@ -74,16 +74,26 @@ void Range::Shared::emit_changed(const char *p_what) { } } +void Range::Shared::redraw_owners() { + for (Range *E : owners) { + Range *r = E; + if (!r->is_inside_tree()) { + continue; + } + r->queue_redraw(); + } +} + void Range::set_value(double p_val) { double prev_val = shared->val; - set_value_no_signal(p_val); + _set_value_no_signal(p_val); if (shared->val != prev_val) { shared->emit_value_changed(); } } -void Range::set_value_no_signal(double p_val) { +void Range::_set_value_no_signal(double p_val) { if (shared->step > 0) { p_val = Math::round((p_val - shared->min) / shared->step) * shared->step + shared->min; } @@ -107,6 +117,15 @@ void Range::set_value_no_signal(double p_val) { shared->val = p_val; } +void Range::set_value_no_signal(double p_val) { + double prev_val = shared->val; + _set_value_no_signal(p_val); + + if (shared->val != prev_val) { + shared->redraw_owners(); + } +} + void Range::set_min(double p_min) { if (shared->min == p_min) { return; diff --git a/scene/gui/range.h b/scene/gui/range.h index 5267216f12d3..a923ae983885 100644 --- a/scene/gui/range.h +++ b/scene/gui/range.h @@ -48,6 +48,7 @@ class Range : public Control { HashSet owners; void emit_value_changed(); void emit_changed(const char *p_what = ""); + void redraw_owners(); }; Shared *shared = nullptr; @@ -59,6 +60,7 @@ class Range : public Control { void _value_changed_notify(); void _changed_notify(const char *p_what = ""); + void _set_value_no_signal(double p_val); protected: virtual void _value_changed(double p_value); diff --git a/scene/gui/spin_box.cpp b/scene/gui/spin_box.cpp index e15b3b7bd4ec..bd5aad4d8ad9 100644 --- a/scene/gui/spin_box.cpp +++ b/scene/gui/spin_box.cpp @@ -39,7 +39,7 @@ Size2 SpinBox::get_minimum_size() const { return ms; } -void SpinBox::_value_changed(double p_value) { +void SpinBox::_update_text() { String value = String::num(get_value(), Math::range_step_decimals(get_step())); if (is_localizing_numeral_system()) { value = TS->format_number(value); @@ -55,7 +55,6 @@ void SpinBox::_value_changed(double p_value) { } line_edit->set_text(value); - Range::_value_changed(p_value); } void SpinBox::_text_submitted(const String &p_string) { @@ -73,7 +72,7 @@ void SpinBox::_text_submitted(const String &p_string) { if (value.get_type() != Variant::NIL) { set_value(value); } - _value_changed(0); + _update_text(); } void SpinBox::_text_changed(const String &p_string) { @@ -192,7 +191,7 @@ void SpinBox::gui_input(const Ref &p_event) { void SpinBox::_line_edit_focus_enter() { int col = line_edit->get_caret_column(); - _value_changed(0); // Update the LineEdit's text. + _update_text(); line_edit->set_caret_column(col); // LineEdit text might change and it clears any selection. Have to re-select here. @@ -202,6 +201,10 @@ void SpinBox::_line_edit_focus_enter() { } void SpinBox::_line_edit_focus_exit() { + // Discontinue because the focus_exit was caused by left-clicking the arrows. + if (get_viewport()->gui_get_focus_owner() == get_line_edit()) { + return; + } // Discontinue because the focus_exit was caused by right-click context menu. if (line_edit->is_menu_visible()) { return; @@ -228,6 +231,7 @@ void SpinBox::_update_theme_item_cache() { void SpinBox::_notification(int p_what) { switch (p_what) { case NOTIFICATION_DRAW: { + _update_text(); _adjust_width_for_icon(theme_cache.updown_icon); RID ci = get_canvas_item(); @@ -242,7 +246,7 @@ void SpinBox::_notification(int p_what) { case NOTIFICATION_ENTER_TREE: { _adjust_width_for_icon(theme_cache.updown_icon); - _value_changed(0); + _update_text(); } break; case NOTIFICATION_EXIT_TREE: { @@ -250,7 +254,6 @@ void SpinBox::_notification(int p_what) { } break; case NOTIFICATION_TRANSLATION_CHANGED: { - _value_changed(0); queue_redraw(); } break; @@ -279,7 +282,7 @@ void SpinBox::set_suffix(const String &p_suffix) { } suffix = p_suffix; - _value_changed(0); + _update_text(); } String SpinBox::get_suffix() const { @@ -292,7 +295,7 @@ void SpinBox::set_prefix(const String &p_prefix) { } prefix = p_prefix; - _value_changed(0); + _update_text(); } String SpinBox::get_prefix() const { diff --git a/scene/gui/spin_box.h b/scene/gui/spin_box.h index 00f5a9569951..046aaf774fa1 100644 --- a/scene/gui/spin_box.h +++ b/scene/gui/spin_box.h @@ -46,8 +46,8 @@ class SpinBox : public Range { void _range_click_timeout(); void _release_mouse(); + void _update_text(); void _text_submitted(const String &p_string); - virtual void _value_changed(double p_value) override; void _text_changed(const String &p_string); String prefix;