浏览代码

Merge pull request #65050 from KoBeWi/suffix_b3gon3

Rémi Verschelde 3 年之前
父节点
当前提交
ac00cad299
共有 2 个文件被更改,包括 18 次插入5 次删除
  1. 17 5
      scene/gui/spin_box.cpp
  2. 1 0
      scene/gui/spin_box.h

+ 17 - 5
scene/gui/spin_box.cpp

@@ -40,12 +40,16 @@ Size2 SpinBox::get_minimum_size() const {
 
 void SpinBox::_value_changed(double) {
 	String value = String::num(get_value(), Math::range_step_decimals(get_step()));
-	if (prefix != "") {
-		value = prefix + " " + value;
-	}
-	if (suffix != "") {
-		value += " " + suffix;
+
+	if (!line_edit->has_focus()) {
+		if (prefix != "") {
+			value = prefix + " " + value;
+		}
+		if (suffix != "") {
+			value += " " + suffix;
+		}
 	}
+
 	line_edit->set_text(value);
 }
 
@@ -161,6 +165,12 @@ 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.
+	line_edit->set_cursor_position(col);
+}
+
 void SpinBox::_line_edit_focus_exit() {
 	// discontinue because the focus_exit was caused by right-click context menu
 	if (line_edit->get_menu()->is_visible()) {
@@ -253,6 +263,7 @@ void SpinBox::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_editable", "editable"), &SpinBox::set_editable);
 	ClassDB::bind_method(D_METHOD("is_editable"), &SpinBox::is_editable);
 	ClassDB::bind_method(D_METHOD("apply"), &SpinBox::apply);
+	ClassDB::bind_method(D_METHOD("_line_edit_focus_enter"), &SpinBox::_line_edit_focus_enter);
 	ClassDB::bind_method(D_METHOD("_line_edit_focus_exit"), &SpinBox::_line_edit_focus_exit);
 	ClassDB::bind_method(D_METHOD("get_line_edit"), &SpinBox::get_line_edit);
 	ClassDB::bind_method(D_METHOD("_line_edit_input"), &SpinBox::_line_edit_input);
@@ -273,6 +284,7 @@ SpinBox::SpinBox() {
 	line_edit->set_mouse_filter(MOUSE_FILTER_PASS);
 	//connect("value_changed",this,"_value_changed");
 	line_edit->connect("text_entered", this, "_text_entered", Vector<Variant>(), CONNECT_DEFERRED);
+	line_edit->connect("focus_entered", this, "_line_edit_focus_enter", Vector<Variant>(), CONNECT_DEFERRED);
 	line_edit->connect("focus_exited", this, "_line_edit_focus_exit", Vector<Variant>(), CONNECT_DEFERRED);
 	line_edit->connect("gui_input", this, "_line_edit_input");
 

+ 1 - 0
scene/gui/spin_box.h

@@ -60,6 +60,7 @@ class SpinBox : public Range {
 		float diff_y = 0;
 	} drag;
 
+	void _line_edit_focus_enter();
 	void _line_edit_focus_exit();
 
 	inline void _adjust_width_for_icon(const Ref<Texture> &icon);