Browse Source

Merge pull request #55775 from timothyqiu/slider-drag

Rémi Verschelde 3 years ago
parent
commit
7640dc2c73
2 changed files with 21 additions and 0 deletions
  1. 13 0
      doc/classes/Slider.xml
  2. 8 0
      scene/gui/slider.cpp

+ 13 - 0
doc/classes/Slider.xml

@@ -25,4 +25,17 @@
 			If [code]true[/code], the slider will display ticks for minimum and maximum values.
 		</member>
 	</members>
+	<signals>
+		<signal name="drag_ended">
+			<argument index="0" name="value_changed" type="bool" />
+			<description>
+				Emitted when dragging stops. If [code]value_changed[/code] is true, [member Range.value] is different from the value when you started the dragging.
+			</description>
+		</signal>
+		<signal name="drag_started">
+			<description>
+				Emitted when dragging is started.
+			</description>
+		</signal>
+	</signals>
 </class>

+ 8 - 0
scene/gui/slider.cpp

@@ -70,8 +70,13 @@ void Slider::gui_input(const Ref<InputEvent> &p_event) {
 				}
 				grab.active = true;
 				grab.uvalue = get_as_ratio();
+
+				emit_signal(SNAME("drag_started"));
 			} else {
 				grab.active = false;
+
+				const bool value_changed = !Math::is_equal_approx((double)grab.uvalue, get_as_ratio());
+				emit_signal(SNAME("drag_ended"), value_changed);
 			}
 		} else if (scrollable) {
 			if (mb->is_pressed() && mb->get_button_index() == MouseButton::WHEEL_UP) {
@@ -264,6 +269,9 @@ void Slider::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_scrollable", "scrollable"), &Slider::set_scrollable);
 	ClassDB::bind_method(D_METHOD("is_scrollable"), &Slider::is_scrollable);
 
+	ADD_SIGNAL(MethodInfo("drag_started"));
+	ADD_SIGNAL(MethodInfo("drag_ended", PropertyInfo(Variant::BOOL, "value_changed")));
+
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "editable"), "set_editable", "is_editable");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "scrollable"), "set_scrollable", "is_scrollable");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "tick_count", PROPERTY_HINT_RANGE, "0,4096,1"), "set_ticks", "get_ticks");