From ba3b1116a03906e710c39eee8dd99ecfe61a7c7b Mon Sep 17 00:00:00 2001
From: Jens Bache-Wiig <jens.bache-wiig@digia.com>
Date: Mon, 4 Mar 2013 13:00:14 +0100
Subject: [PATCH] Fix Vertical slider

Task-number: 1303

Change-Id: Ic6cefcf456ef1a9801574096908cb475cbd51606
Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
---
 src/controls/Slider.qml                 | 31 ++++++++++++-------------
 src/private/qstyleitem.cpp              |  2 ++
 tests/auto/controls/data/tst_slider.qml |  8 +++++++
 3 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/src/controls/Slider.qml b/src/controls/Slider.qml
index 6f080beae..41042ae1b 100644
--- a/src/controls/Slider.qml
+++ b/src/controls/Slider.qml
@@ -167,6 +167,9 @@ Control {
     /*! \internal */
     property bool __containsMouse: mouseArea.containsMouse
 
+    /*! \internal */
+    property bool __horizontal: orientation === Qt.Horizontal
+
     Accessible.role: Accessible.Slider
     Accessible.name: value
 
@@ -195,10 +198,10 @@ Control {
         maximumValue: 1.0
         value: 0
         stepSize: 0.0
-        inverted: false
+        inverted: __horizontal ? false : true
 
         positionAtMinimum: 0
-        positionAtMaximum: slider.width
+        positionAtMaximum: __horizontal ? slider.width : slider.height
     }
 
     Item { id: fakeHandle }
@@ -213,7 +216,7 @@ Control {
         height: parent.height
 
         drag.target: fakeHandle
-        drag.axis: Drag.XAxis
+        drag.axis: __horizontal ? Drag.XAxis : Drag.YAxis
         drag.minimumX: range.positionAtMinimum
         drag.maximumX: range.positionAtMaximum
 
@@ -222,22 +225,19 @@ Control {
                 slider.focus = true;
 
             // Clamp the value
-            var newX = Math.max(mouse.x, drag.minimumX);
-            newX = Math.min(newX, drag.maximumX);
-
-            // Debounce the press: a press event inside the handler will not
-            // change its position, the user needs to drag it.
-
-            // Note this really messes up things for scrollbar
-            // if (Math.abs(newX - fakeHandle.x) > handleLoader.width / 2)
-            range.position = newX;
+            var current = __horizontal ? mouse.x : mouse.y
+            var minimum = __horizontal ? drag.minimumX : drag.minimumY
+            var maximum = __horizontal ? drag.maximumX : drag.maximumY
+            var newVal = Math.max(current, minimum);
+            newVal = Math.min(newVal, maximum);
+            range.position = newVal;
         }
 
         onReleased: {
             // If we don't update while dragging, this is the only
             // moment that the range is updated.
             if (!slider.updateValueWhileDragging)
-                range.position = fakeHandle.x;
+                range.position = __horizontal ? fakeHandle.x : fakeHandle.y;
         }
     }
 
@@ -250,7 +250,7 @@ Control {
         when: updateValueWhileDragging || !mouseArea.pressed
         target: range
         property: "position"
-        value: fakeHandle.x
+        value: __horizontal ? fakeHandle.x : fakeHandle.y
     }
 
     // During the drag, we simply ignore position set from the range, this
@@ -259,11 +259,10 @@ Control {
     Binding {
         when: !mouseArea.drag.active
         target: fakeHandle
-        property: "x"
+        property: __horizontal ? "x" : "y"
         value: range.position
     }
 
-
     WheelArea {
         id: wheelarea
         anchors.fill: parent
diff --git a/src/private/qstyleitem.cpp b/src/private/qstyleitem.cpp
index eb1888daa..744e616db 100644
--- a/src/private/qstyleitem.cpp
+++ b/src/private/qstyleitem.cpp
@@ -440,6 +440,8 @@ void QStyleItem::initStyleOption()
             m_styleoption = new QStyleOptionSlider();
 
         QStyleOptionSlider *opt = qstyleoption_cast<QStyleOptionSlider*>(m_styleoption);
+        opt->orientation = horizontal() ? Qt::Horizontal : Qt::Vertical;
+        opt->upsideDown = !horizontal();
         opt->minimum = minimum();
         opt->maximum = maximum();
         opt->sliderPosition = value();
diff --git a/tests/auto/controls/data/tst_slider.qml b/tests/auto/controls/data/tst_slider.qml
index 9767c177e..1cb65c672 100644
--- a/tests/auto/controls/data/tst_slider.qml
+++ b/tests/auto/controls/data/tst_slider.qml
@@ -48,6 +48,14 @@ TestCase {
     width:400
     height:400
 
+    function test_vertical() {
+        var slider = Qt.createQmlObject('import QtQuick.Controls 1.0; Slider {}', testCase, '');
+        verify(slider.height < slider.width)
+
+        slider.orientation = Qt.Vertical;
+        verify(slider.height > slider.width)
+    }
+
     function test_minimumvalue() {
         var slider = Qt.createQmlObject('import QtQuick.Controls 1.0; Slider {}', testCase, '');
 
-- 
GitLab