Просмотр исходного кода

Fix spinBox will reset text when redrawing

jsjtxietian 1 год назад
Родитель
Сommit
61be3eafc0
2 измененных файлов с 9 добавлено и 3 удалено
  1. 7 2
      scene/gui/spin_box.cpp
  2. 2 1
      scene/gui/spin_box.h

+ 7 - 2
scene/gui/spin_box.cpp

@@ -40,7 +40,7 @@ Size2 SpinBox::get_minimum_size() const {
 	return ms;
 }
 
-void SpinBox::_update_text() {
+void SpinBox::_update_text(bool p_keep_line_edit) {
 	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,12 @@ void SpinBox::_update_text() {
 		}
 	}
 
+	if (p_keep_line_edit && value == last_updated_text && value != line_edit->get_text()) {
+		return;
+	}
+
 	line_edit->set_text_with_selection(value);
+	last_updated_text = value;
 }
 
 void SpinBox::_text_submitted(const String &p_string) {
@@ -245,7 +250,7 @@ inline void SpinBox::_adjust_width_for_icon(const Ref<Texture2D> &icon) {
 void SpinBox::_notification(int p_what) {
 	switch (p_what) {
 		case NOTIFICATION_DRAW: {
-			_update_text();
+			_update_text(true);
 			_adjust_width_for_icon(theme_cache.updown_icon);
 
 			RID ci = get_canvas_item();

+ 2 - 1
scene/gui/spin_box.h

@@ -46,12 +46,13 @@ class SpinBox : public Range {
 	void _range_click_timeout();
 	void _release_mouse();
 
-	void _update_text();
+	void _update_text(bool p_keep_line_edit = false);
 	void _text_submitted(const String &p_string);
 	void _text_changed(const String &p_string);
 
 	String prefix;
 	String suffix;
+	String last_updated_text;
 	double custom_arrow_step = 0.0;
 
 	void _line_edit_input(const Ref<InputEvent> &p_event);