Warning, /frameworks/kirigami/autotests/wheelhandler/tst_scrolling.qml is written in an unsupported language. File is not indexed.

0001 /* SPDX-FileCopyrightText: 2021 Noah Davis <noahadvs@gmail.com>
0002  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0003  */
0004 
0005 import QtQuick 2.15
0006 import QtQuick.Controls 2.15 as QQC2
0007 import org.kde.kirigami 2.19 as Kirigami
0008 import QtTest 1.15
0009 
0010 TestCase {
0011     id: root
0012     readonly property real hstep: wheelHandler.horizontalStepSize
0013     readonly property real vstep: wheelHandler.verticalStepSize
0014     readonly property real pageWidth: flickable.width - flickable.leftMargin - flickable.rightMargin
0015     readonly property real pageHeight: flickable.height - flickable.topMargin - flickable.bottomMargin
0016     readonly property real contentWidth: flickable.contentWidth
0017     readonly property real contentHeight: flickable.contentHeight
0018     property alias wheelHandler: wheelHandler
0019     property alias flickable: flickable
0020 
0021     name: "WheelHandler scrolling"
0022     visible: true
0023     when: windowShown
0024     width: flickable.implicitWidth
0025     height: flickable.implicitHeight
0026 
0027     function wheelScrolling(angleDelta = 120) {
0028         let x = flickable.contentX
0029         let y = flickable.contentY
0030         const angleDeltaFactor = angleDelta / 120
0031         mouseWheel(flickable, flickable.leftMargin, 0, -angleDelta, -angleDelta, Qt.NoButton)
0032         verify(flickable.contentX === Math.round(x + hstep * angleDeltaFactor), "+xTick")
0033         x = flickable.contentX
0034         verify(flickable.contentY === Math.round(y + vstep * angleDeltaFactor), "+yTick")
0035         y = flickable.contentY
0036 
0037         mouseWheel(flickable, flickable.leftMargin, 0, angleDelta, angleDelta, Qt.NoButton)
0038         verify(flickable.contentX === Math.round(x - hstep * angleDeltaFactor), "-xTick")
0039         x = flickable.contentX
0040         verify(flickable.contentY === Math.round(y - vstep * angleDeltaFactor), "-yTick")
0041         y = flickable.contentY
0042 
0043         if (Qt.platform.pluginName !== "xcb") {
0044             mouseWheel(flickable, flickable.leftMargin, 0, 0, -angleDelta, Qt.NoButton, Qt.AltModifier)
0045             verify(flickable.contentX === Math.round(x + hstep * angleDeltaFactor), "+h_yTick")
0046             x = flickable.contentX
0047             verify(flickable.contentY === y, "no +yTick")
0048 
0049             mouseWheel(flickable, flickable.leftMargin, 0, 0, angleDelta, Qt.NoButton, Qt.AltModifier)
0050             verify(flickable.contentX === Math.round(x - hstep * angleDeltaFactor), "-h_yTick")
0051             x = flickable.contentX
0052             verify(flickable.contentY === y, "no -yTick")
0053         }
0054 
0055         mouseWheel(flickable, flickable.leftMargin, 0, -angleDelta, -angleDelta, Qt.NoButton, wheelHandler.pageScrollModifiers)
0056         verify(flickable.contentX === Math.round(x + pageWidth * angleDeltaFactor), "+xPage")
0057         x = flickable.contentX
0058         verify(flickable.contentY === Math.round(y + pageHeight * angleDeltaFactor), "+yPage")
0059         y = flickable.contentY
0060 
0061         mouseWheel(flickable, flickable.leftMargin, 0, angleDelta, angleDelta, Qt.NoButton, wheelHandler.pageScrollModifiers)
0062         verify(flickable.contentX === Math.round(x - pageWidth * angleDeltaFactor), "-xPage")
0063         x = flickable.contentX
0064         verify(flickable.contentY === Math.round(y - pageHeight * angleDeltaFactor), "-yPage")
0065         y = flickable.contentY
0066 
0067         if (Qt.platform.pluginName !== "xcb") {
0068             mouseWheel(flickable, flickable.leftMargin, 0, 0, -angleDelta, Qt.NoButton,
0069                     Qt.AltModifier | wheelHandler.pageScrollModifiers)
0070             verify(flickable.contentX === Math.round(x + pageWidth * angleDeltaFactor), "+h_yPage")
0071             x = flickable.contentX
0072             verify(flickable.contentY === y, "no +yPage")
0073 
0074             mouseWheel(flickable, flickable.leftMargin, 0, 0, angleDelta, Qt.NoButton,
0075                     Qt.AltModifier | wheelHandler.pageScrollModifiers)
0076             verify(flickable.contentX === Math.round(x - pageWidth * angleDeltaFactor), "-h_yPage")
0077             x = flickable.contentX
0078             verify(flickable.contentY === y, "no -yPage")
0079         }
0080     }
0081 
0082     function test_WheelScrolling() {
0083         // HID 1bcf:08a0 Mouse
0084         // Angle delta is 120, like most mice.
0085         wheelScrolling()
0086     }
0087 
0088     function test_HiResWheelScrolling() {
0089         // Logitech MX Master 3
0090         // Main wheel angle delta is at least 16, plus multiples of 8 when scrolling faster.
0091         wheelScrolling(16)
0092     }
0093 
0094     function test_TouchpadScrolling() {
0095         // UNIW0001:00 093A:0255 Touchpad
0096         // 2 finger scroll angle delta is at least 3, but larger increments are used when scrolling faster.
0097         wheelScrolling(3)
0098     }
0099 
0100     function keyboardScrolling() {
0101         const originalX = flickable.contentX
0102         const originalY = flickable.contentY
0103         let x = originalX
0104         let y = originalY
0105         keyClick(Qt.Key_Right)
0106         verify(flickable.contentX === x + hstep, "Key_Right")
0107         x = flickable.contentX
0108 
0109         keyClick(Qt.Key_Left)
0110         verify(flickable.contentX === x - hstep, "Key_Left")
0111         x = flickable.contentX
0112 
0113         keyClick(Qt.Key_Down)
0114         verify(flickable.contentY === y + vstep, "Key_Down")
0115         y = flickable.contentY
0116 
0117         keyClick(Qt.Key_Up)
0118         verify(flickable.contentY === y - vstep, "Key_Up")
0119         y = flickable.contentY
0120 
0121         keyClick(Qt.Key_PageDown)
0122         verify(flickable.contentY === y + pageHeight, "Key_PageDown")
0123         y = flickable.contentY
0124 
0125         keyClick(Qt.Key_PageUp)
0126         verify(flickable.contentY === y - pageHeight, "Key_PageUp")
0127         y = flickable.contentY
0128 
0129         keyClick(Qt.Key_End)
0130         verify(flickable.contentY === contentHeight - pageHeight, "Key_End")
0131         y = flickable.contentY
0132 
0133         keyClick(Qt.Key_Home)
0134         verify(flickable.contentY === originalY, "Key_Home")
0135         y = flickable.contentY
0136 
0137         keyClick(Qt.Key_PageDown, Qt.AltModifier)
0138         verify(flickable.contentX === x + pageWidth, "h_Key_PageDown")
0139         x = flickable.contentX
0140 
0141         keyClick(Qt.Key_PageUp, Qt.AltModifier)
0142         verify(flickable.contentX === x - pageWidth, "h_Key_PageUp")
0143         x = flickable.contentX
0144 
0145         keyClick(Qt.Key_End, Qt.AltModifier)
0146         verify(flickable.contentX === contentWidth - pageWidth, "h_Key_End")
0147         x = flickable.contentX
0148 
0149         keyClick(Qt.Key_Home, Qt.AltModifier)
0150         verify(flickable.contentX === originalX, "h_Key_Home")
0151     }
0152 
0153     function test_KeyboardScrolling() {
0154         keyboardScrolling()
0155     }
0156 
0157     function test_StepSize() {
0158         // 101 is a value unlikely to be used by any user's combination of settings and hardware
0159         wheelHandler.verticalStepSize = 101
0160         wheelHandler.horizontalStepSize = 101
0161         wheelScrolling()
0162         keyboardScrolling()
0163         // reset to default
0164         wheelHandler.verticalStepSize = undefined
0165         wheelHandler.horizontalStepSize = undefined
0166         verify(wheelHandler.verticalStepSize == 20 * Qt.styleHints.wheelScrollLines, "default verticalStepSize")
0167         verify(wheelHandler.horizontalStepSize == 20 * Qt.styleHints.wheelScrollLines, "default horizontalStepSize")
0168     }
0169 
0170     ScrollableFlickable {
0171         id: flickable
0172         focus: true
0173         anchors.fill: parent
0174         Kirigami.WheelHandler {
0175             id: wheelHandler
0176             target: flickable
0177             keyNavigationEnabled: true
0178         }
0179     }
0180 }