Added spinbox patch to godot
This commit is contained in:
175
src/patches/0005-spinbox-fix.patch
Normal file
175
src/patches/0005-spinbox-fix.patch
Normal file
@@ -0,0 +1,175 @@
|
||||
From 9ba74bdb924158dfe1644a6dd9dbf7712b025dd2 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 | 24 ++++++++++++++++++++++--
|
||||
scene/gui/range.h | 2 ++
|
||||
scene/gui/spin_box.cpp | 17 +++++++++++------
|
||||
scene/gui/spin_box.h | 2 +-
|
||||
4 files changed, 36 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/scene/gui/range.cpp b/scene/gui/range.cpp
|
||||
index 4d48cf307d..9d3ad6dec8 100644
|
||||
--- a/scene/gui/range.cpp
|
||||
+++ b/scene/gui/range.cpp
|
||||
@@ -76,16 +76,26 @@ void Range::Shared::emit_changed(const char *p_what) {
|
||||
}
|
||||
}
|
||||
|
||||
+void Range::Shared::redraw_owners() {
|
||||
+ for (Set<Range *>::Element *E = owners.front(); E; E = E->next()) {
|
||||
+ Range *r = E->get();
|
||||
+ if (!r->is_inside_tree()) {
|
||||
+ continue;
|
||||
+ }
|
||||
+ r->update();
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
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;
|
||||
}
|
||||
@@ -108,6 +118,16 @@ 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) {
|
||||
shared->min = p_min;
|
||||
set_value(shared->val);
|
||||
diff --git a/scene/gui/range.h b/scene/gui/range.h
|
||||
index f64f2620e1..ea5f882f17 100644
|
||||
--- a/scene/gui/range.h
|
||||
+++ b/scene/gui/range.h
|
||||
@@ -45,6 +45,7 @@ class Range : public Control {
|
||||
Set<Range *> owners;
|
||||
void emit_value_changed();
|
||||
void emit_changed(const char *p_what = "");
|
||||
+ void redraw_owners();
|
||||
};
|
||||
|
||||
Shared *shared;
|
||||
@@ -56,6 +57,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) {}
|
||||
diff --git a/scene/gui/spin_box.cpp b/scene/gui/spin_box.cpp
|
||||
index 15561cf172..452b2c0456 100644
|
||||
--- a/scene/gui/spin_box.cpp
|
||||
+++ b/scene/gui/spin_box.cpp
|
||||
@@ -38,7 +38,7 @@ Size2 SpinBox::get_minimum_size() const {
|
||||
return ms;
|
||||
}
|
||||
|
||||
-void SpinBox::_value_changed(double) {
|
||||
+void SpinBox::_update_text() {
|
||||
String value = String::num(get_value(), Math::range_step_decimals(get_step()));
|
||||
|
||||
if (!line_edit->has_focus()) {
|
||||
@@ -66,7 +66,7 @@ void SpinBox::_text_entered(const String &p_string) {
|
||||
if (value.get_type() != Variant::NIL) {
|
||||
set_value(value);
|
||||
}
|
||||
- _value_changed(0);
|
||||
+ _update_text();
|
||||
}
|
||||
|
||||
LineEdit *SpinBox::get_line_edit() {
|
||||
@@ -172,11 +172,15 @@ void SpinBox::_gui_input(const Ref<InputEvent> &p_event) {
|
||||
|
||||
void SpinBox::_line_edit_focus_enter() {
|
||||
int col = line_edit->get_cursor_position();
|
||||
- _value_changed(0); // Update the LineEdit's text.
|
||||
+ _update_text();
|
||||
line_edit->set_cursor_position(col);
|
||||
}
|
||||
|
||||
void SpinBox::_line_edit_focus_exit() {
|
||||
+ // discontinue because the focus_exit was caused by left-clicking the arrows.
|
||||
+ if (get_focus_owner() == get_line_edit()) {
|
||||
+ return;
|
||||
+ }
|
||||
// discontinue because the focus_exit was caused by right-click context menu
|
||||
if (line_edit->get_menu()->is_visible()) {
|
||||
return;
|
||||
@@ -196,6 +200,7 @@ inline void SpinBox::_adjust_width_for_icon(const Ref<Texture> &icon) {
|
||||
void SpinBox::_notification(int p_what) {
|
||||
if (p_what == NOTIFICATION_DRAW) {
|
||||
Ref<Texture> updown = get_icon("updown");
|
||||
+ _update_text();
|
||||
|
||||
_adjust_width_for_icon(updown);
|
||||
|
||||
@@ -208,7 +213,7 @@ void SpinBox::_notification(int p_what) {
|
||||
//_value_changed(0);
|
||||
} else if (p_what == NOTIFICATION_ENTER_TREE) {
|
||||
_adjust_width_for_icon(get_icon("updown"));
|
||||
- _value_changed(0);
|
||||
+ _update_text();
|
||||
} else if (p_what == NOTIFICATION_EXIT_TREE) {
|
||||
_release_mouse();
|
||||
} else if (p_what == NOTIFICATION_THEME_CHANGED) {
|
||||
@@ -227,7 +232,7 @@ LineEdit::Align SpinBox::get_align() const {
|
||||
|
||||
void SpinBox::set_suffix(const String &p_suffix) {
|
||||
suffix = p_suffix;
|
||||
- _value_changed(0);
|
||||
+ _update_text();
|
||||
}
|
||||
|
||||
String SpinBox::get_suffix() const {
|
||||
@@ -236,7 +241,7 @@ String SpinBox::get_suffix() const {
|
||||
|
||||
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 b308b41647..49101fd90f 100644
|
||||
--- a/scene/gui/spin_box.h
|
||||
+++ b/scene/gui/spin_box.h
|
||||
@@ -46,7 +46,7 @@ class SpinBox : public Range {
|
||||
void _release_mouse();
|
||||
|
||||
void _text_entered(const String &p_string);
|
||||
- virtual void _value_changed(double);
|
||||
+ void _update_text();
|
||||
String prefix;
|
||||
String suffix;
|
||||
double custom_arrow_step = 0.0;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
Reference in New Issue
Block a user