diff --git a/doc/classes/Slider.xml b/doc/classes/Slider.xml
index 1434aedcb0f..cc2b7fc24d2 100644
--- a/doc/classes/Slider.xml
+++ b/doc/classes/Slider.xml
@@ -27,6 +27,19 @@
If [code]true[/code], the slider will display ticks for minimum and maximum values.
+
+
+
+
+ Emitted when dragging stops. If [code]value_changed[/code] is true, [member Range.value] is different from the value when you started the dragging.
+
+
+
+
+ Emitted when dragging is started.
+
+
+
diff --git a/scene/gui/slider.cpp b/scene/gui/slider.cpp
index dd460cdfdc3..b8c8275f9ec 100644
--- a/scene/gui/slider.cpp
+++ b/scene/gui/slider.cpp
@@ -68,8 +68,13 @@ void Slider::_gui_input(Ref p_event) {
}
grab.active = true;
grab.uvalue = get_as_ratio();
+
+ emit_signal("drag_started");
} else {
grab.active = false;
+
+ const bool value_changed = !Math::is_equal_approx((double)grab.uvalue, get_as_ratio());
+ emit_signal("drag_ended", value_changed);
}
} else if (scrollable) {
if (mb->is_pressed() && mb->get_button_index() == BUTTON_WHEEL_UP) {
@@ -263,6 +268,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");