浏览代码

Merge pull request #86377 from timothyqiu/slider-drag

Emit slider's `drag_started` signal before the first value change
Yuri Sizov 1 年之前
父节点
当前提交
b4fe310f7d
共有 3 个文件被更改,包括 6 次插入4 次删除
  1. 1 1
      doc/classes/Slider.xml
  2. 3 2
      scene/gui/slider.cpp
  3. 2 1
      scene/gui/slider.h

+ 1 - 1
doc/classes/Slider.xml

@@ -33,7 +33,7 @@
 		</signal>
 		<signal name="drag_started">
 			<description>
-				Emitted when dragging is started.
+				Emitted when dragging is started. This is emitted before the corresponding [signal Range.value_changed] signal.
 			</description>
 		</signal>
 	</signals>

+ 3 - 2
scene/gui/slider.cpp

@@ -64,6 +64,8 @@ void Slider::gui_input(const Ref<InputEvent> &p_event) {
 				}
 
 				grab.pos = orientation == VERTICAL ? mb->get_position().y : mb->get_position().x;
+				grab.value_before_dragging = get_as_ratio();
+				emit_signal(SNAME("drag_started"));
 
 				double grab_width = (double)grabber->get_width();
 				double grab_height = (double)grabber->get_height();
@@ -78,12 +80,11 @@ void Slider::gui_input(const Ref<InputEvent> &p_event) {
 				grab.active = true;
 				grab.uvalue = get_as_ratio();
 
-				emit_signal(SNAME("drag_started"));
 				_notify_shared_value_changed();
 			} else {
 				grab.active = false;
 
-				const bool value_changed = !Math::is_equal_approx((double)grab.uvalue, get_as_ratio());
+				const bool value_changed = !Math::is_equal_approx((double)grab.value_before_dragging, get_as_ratio());
 				emit_signal(SNAME("drag_ended"), value_changed);
 			}
 		} else if (scrollable) {

+ 2 - 1
scene/gui/slider.h

@@ -38,7 +38,8 @@ class Slider : public Range {
 
 	struct Grab {
 		int pos = 0;
-		double uvalue = 0.0;
+		double uvalue = 0.0; // Value at `pos`.
+		double value_before_dragging = 0.0;
 		bool active = false;
 	} grab;