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 }