2
0
Эх сурвалжийг харах

Merge pull request #21471 from RodZill4/issue_11893

Fixed issue #11893 (SpinBox capturing mouse)
Rémi Verschelde 6 жил өмнө
parent
commit
13d037b200

+ 11 - 23
scene/gui/spin_box.cpp

@@ -110,6 +110,9 @@ void SpinBox::_gui_input(const Ref<InputEvent> &p_event) {
 				range_click_timer->start();
 
 				line_edit->grab_focus();
+
+				drag.allowed = true;
+				drag.capture_pos = mb->get_position();
 			} break;
 			case BUTTON_RIGHT: {
 
@@ -133,14 +136,7 @@ void SpinBox::_gui_input(const Ref<InputEvent> &p_event) {
 		}
 	}
 
-	if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == 1) {
-
-		//set_default_cursor_shape(CURSOR_VSIZE);
-		Vector2 cpos = Vector2(mb->get_position().x, mb->get_position().y);
-		drag.mouse_pos = cpos;
-	}
-
-	if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == 1) {
+	if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
 
 		//set_default_cursor_shape(CURSOR_ARROW);
 		range_click_timer->stop();
@@ -150,32 +146,24 @@ void SpinBox::_gui_input(const Ref<InputEvent> &p_event) {
 			Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
 			warp_mouse(drag.capture_pos);
 		}
+		drag.allowed = false;
 	}
 
 	Ref<InputEventMouseMotion> mm = p_event;
 
-	if (mm.is_valid() && mm->get_button_mask() & 1) {
-
-		Vector2 cpos = mm->get_position();
+	if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT) {
 
 		if (drag.enabled) {
 
-			float diff_y = drag.mouse_pos.y - cpos.y;
-			diff_y = Math::pow(ABS(diff_y), 1.8f) * SGN(diff_y);
-			diff_y *= 0.1;
-
-			drag.mouse_pos = cpos;
-			drag.base_val = CLAMP(drag.base_val + get_step() * diff_y, get_min(), get_max());
-
-			set_value(drag.base_val);
-
-		} else if (drag.mouse_pos.distance_to(cpos) > 2) {
+			drag.diff_y += mm->get_relative().y;
+			float diff_y = -0.01 * Math::pow(ABS(drag.diff_y), 1.8f) * SGN(drag.diff_y);
+			set_value(CLAMP(drag.base_val + get_step() * diff_y, get_min(), get_max()));
+		} else if (drag.allowed && drag.capture_pos.distance_to(mm->get_position()) > 2) {
 
 			Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED);
 			drag.enabled = true;
 			drag.base_val = get_value();
-			drag.mouse_pos = cpos;
-			drag.capture_pos = cpos;
+			drag.diff_y = 0;
 		}
 	}
 }

+ 2 - 2
scene/gui/spin_box.h

@@ -54,10 +54,10 @@ class SpinBox : public Range {
 
 	struct Drag {
 		float base_val;
+		bool allowed;
 		bool enabled;
-		Vector2 from;
-		Vector2 mouse_pos;
 		Vector2 capture_pos;
+		float diff_y;
 	} drag;
 
 	void _line_edit_focus_exit();