diff options
-rw-r--r-- | src/templates/qquickrangeslider.cpp | 11 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_rangeslider.qml | 37 |
2 files changed, 45 insertions, 3 deletions
diff --git a/src/templates/qquickrangeslider.cpp b/src/templates/qquickrangeslider.cpp index 4bb320cf..5fae3ae5 100644 --- a/src/templates/qquickrangeslider.cpp +++ b/src/templates/qquickrangeslider.cpp @@ -323,10 +323,15 @@ static qreal valueAt(const QQuickRangeSlider *slider, qreal position) static qreal snapPosition(const QQuickRangeSlider *slider, qreal position) { - const qreal stepSize = slider->stepSize(); - if (qFuzzyIsNull(stepSize)) + const qreal range = slider->from() + (slider->to() - slider->from()); + if (qFuzzyIsNull(range)) return position; - return qRound(position / stepSize) * stepSize; + + const qreal effectiveStep = slider->stepSize() / range; + if (qFuzzyIsNull(effectiveStep)) + return position; + + return qRound(position / effectiveStep) * effectiveStep; } static qreal positionAt(const QQuickRangeSlider *slider, QQuickItem *handle, const QPoint &point) diff --git a/tests/auto/controls/data/tst_rangeslider.qml b/tests/auto/controls/data/tst_rangeslider.qml index 2a77d205..09ccb3be 100644 --- a/tests/auto/controls/data/tst_rangeslider.qml +++ b/tests/auto/controls/data/tst_rangeslider.qml @@ -586,4 +586,41 @@ TestCase { control.destroy() } + + function test_snapMode_data() { + return [ + { tag: "NoSnap", snapMode: Slider.NoSnap, values: [0, 0, 0.25], positions: [0, 0.1, 0.1] }, + { tag: "SnapAlways", snapMode: Slider.SnapAlways, values: [0, 0, 0.2], positions: [0, 0.1, 0.1] }, + { tag: "SnapOnRelease", snapMode: Slider.SnapOnRelease, values: [0, 0, 0.2], positions: [0, 0.1, 0.1] } + ] + } + + function test_snapMode(data) { + var control = sliderComponent.createObject(testCase, {snapMode: data.snapMode, from: 0, to: 2, stepSize: 0.2}) + verify(control) + + control.first.value = 0 + control.second.value = 2 + + function sliderCompare(left, right) { + return Math.abs(left - right) < 0.05 + } + + mousePress(control, control.first.handle.x, control.first.handle.y) + compare(control.first.pressed, true) + compare(control.first.value, data.values[0]) + compare(control.first.position, data.positions[0]) + + mouseMove(control, control.leftPadding + 0.15 * (control.availableWidth + control.first.handle.width / 2)) + compare(control.first.pressed, true) + verify(sliderCompare(control.first.value, data.values[1])) + verify(sliderCompare(control.first.position, data.positions[1])) + + mouseRelease(control, control.leftPadding + 0.15 * (control.availableWidth + control.first.handle.width / 2)) + compare(control.first.pressed, false) + verify(sliderCompare(control.first.value, data.values[2])) + verify(sliderCompare(control.first.position, data.positions[2])) + + control.destroy() + } } |