summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorNoah Davis <noahadvs@gmail.com>2022-01-15 14:51:34 -0500
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-01-21 03:05:42 +0000
commit3b83168eb878a68d89a60618717a6f9aff9d4b60 (patch)
tree2c9457c0821462c3ad86696823080ea67ee3e9ce /tests
parente0d0905cfff0fbee94c8c3df427da3f9ebf57fd0 (diff)
QTabBar: Improve scrolling with high resolution mouse wheels
The current behavior for handling the angle delta of a wheel event changes index the instant there is a change in angle delta. This works fine for mouse wheels that send events with 120 angle delta units and there is also already behavior defined for devices with pixel deltas, but there is nothing good for handling events from high resolution mouse wheels that don't have pixel deltas. This patch makes it so that the current index doesn't change until the accumulated angle delta for the X or Y axis reaches 120. [ChangeLog][QtWidgets][QTabBar] Scrolling with a high resolution mouse wheel changes the current index at a rate more like a normal mouse wheel. Task-number: QTBUG-97844 Change-Id: I2e7fd88984a253f6ef8a0008deb7233e4cb4d84a Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> (cherry picked from commit f0371487ce4398e99943bd7dae0944941ef0d505) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp b/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp
index 630b5c1167..f51f0a23d5 100644
--- a/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp
+++ b/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp
@@ -103,6 +103,8 @@ private slots:
void mouseWheel();
void kineticWheel_data();
void kineticWheel();
+ void highResolutionWheel_data();
+ void highResolutionWheel();
void scrollButtons_data();
void scrollButtons();
@@ -1106,6 +1108,49 @@ void tst_QTabBar::kineticWheel()
}
}
+void tst_QTabBar::highResolutionWheel_data()
+{
+ QTest::addColumn<int>("angleDelta");
+ // Smallest angleDelta for a Logitech MX Master 3 with Linux/X11/Libinput
+ QTest::addRow("increment index") << -16;
+ QTest::addRow("decrement index") << 16;
+}
+
+void tst_QTabBar::highResolutionWheel()
+{
+ TabBar tabbar;
+ TabBarScrollingProxyStyle proxyStyle;
+ tabbar.setStyle(&proxyStyle);
+
+ tabbar.addTab("tab1");
+ tabbar.addTab("tab2");
+ QFETCH(int, angleDelta);
+ // Negative values increment, positive values decrement
+ int startIndex = angleDelta < 0 ? 0 : 1;
+ tabbar.setCurrentIndex(startIndex);
+
+ const auto systemId = QPointingDevice::primaryPointingDevice()->systemId() + 1;
+ QPointingDevice hiResWheel(
+ "test high resolution wheel", systemId, QInputDevice::DeviceType::Mouse,
+ QPointingDevice::PointerType::Generic,
+ QInputDevice::Capability::Position | QInputDevice::Capability::Scroll, 1, 3);
+
+ const QPoint wheelPoint = tabbar.rect().bottomRight();
+ QWheelEvent event(wheelPoint, tabbar.mapToGlobal(wheelPoint), QPoint(),
+ QPoint(angleDelta, angleDelta), Qt::NoButton, Qt::NoModifier,
+ Qt::NoScrollPhase, false, Qt::MouseEventSynthesizedByApplication,
+ &hiResWheel);
+
+ proxyStyle.scrolling = true;
+ for (int accumulated = 0; accumulated < QWheelEvent::DefaultDeltasPerStep;
+ accumulated += qAbs(angleDelta)) {
+ // verify that nothing has changed until the threshold has been reached
+ QVERIFY(tabbar.currentIndex() == startIndex);
+ QVERIFY(QApplication::sendEvent(&tabbar, &event));
+ }
+ QVERIFY(tabbar.currentIndex() != startIndex);
+}
+
#endif // QT_CONFIG(wheelevent)
void tst_QTabBar::scrollButtons_data()