From 8e8b0dbaec1868944e0a699a4474304b0cae65e9 Mon Sep 17 00:00:00 2001
From: J-P Nurmi <jpnurmi@theqtcompany.com>
Date: Fri, 7 Nov 2014 12:25:29 +0100
Subject: [PATCH] Slider: don't clamp to the initial press point

Change-Id: I5115bbab670f534dae44eb19c2208aff21293889
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
---
 src/controls/Slider.qml                 |  2 +-
 tests/auto/controls/data/tst_slider.qml | 25 +++++++++++++++++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/src/controls/Slider.qml b/src/controls/Slider.qml
index d43923c1b..89c1e7236 100644
--- a/src/controls/Slider.qml
+++ b/src/controls/Slider.qml
@@ -258,7 +258,7 @@ Control {
 
         onPositionChanged: {
             if (pressed)
-                updateHandlePosition(mouse)
+                updateHandlePosition(mouse, preventStealing)
 
             var point = mouseArea.mapToItem(fakeHandle, mouse.x, mouse.y)
             handleHovered = fakeHandle.contains(Qt.point(point.x, point.y))
diff --git a/tests/auto/controls/data/tst_slider.qml b/tests/auto/controls/data/tst_slider.qml
index 2b3a00a53..2541b1c58 100644
--- a/tests/auto/controls/data/tst_slider.qml
+++ b/tests/auto/controls/data/tst_slider.qml
@@ -41,6 +41,8 @@
 import QtQuick 2.2
 import QtTest 1.0
 import QtQuickControlsTests 1.0
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
 
 Item {
     id: container
@@ -305,5 +307,28 @@ Item {
             compare(slider.__handlePos, 50)
             slider.destroy()
         }
+
+        function test_dragThreshold() {
+            var control = Qt.createQmlObject('import QtQuick.Controls 1.2; Slider {x: 20; y: 20; width: 100; height: 50}', container, '')
+
+            var pt = { x: control.width/2, y: control.height/2 }
+
+            mousePress(control, pt.x, pt.y)
+            compare(control.value, 0.5)
+
+            // drag less than the threshold distance
+            mouseMove(control, pt.x + Settings.dragThreshold - 1, pt.y)
+            compare(control.value, 0.5)
+
+            // drag over the threshold
+            mouseMove(control, pt.x + Settings.dragThreshold + 1, pt.y)
+            verify(control.value > 0.5)
+
+            // move back close to the original press point, less than the threshold distance away
+            mouseMove(control, pt.x - Settings.dragThreshold / 2, pt.y)
+            verify(control.value < 0.5)
+
+            control.destroy()
+        }
     }
 }
-- 
GitLab