From 59cc316620a2169d48e00822c97a96bd03079eed Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Fri, 5 Dec 2014 16:08:28 +0300 Subject: Allow horizontal scrolling with a mouse wheel for QListView MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert vertical wheel events to horizontal for two cases of the items layout when vertical scrolling is impossible: 1) TopToBottom flow with wrapping 2) LeftToRight flow without wrapping Do it only for pure vertical events to avoid a mess for such devices as touchpads or Apple Mouse. [ChangeLog][QtWidgets][Important Behavior Changes] Allow horizontal scrolling with a vertical mouse wheel for QListView. Task-number: QTBUG-37007 Change-Id: Ie2525153fa7b443d27ca08cc5f5d4d7ecdb8c183 Reviewed-by: Thorbjørn Lund Martsum Reviewed-by: Giuseppe D'Angelo --- .../widgets/itemviews/qlistview/tst_qlistview.cpp | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'tests/auto/widgets') diff --git a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp index cea08435c9..22245707cc 100644 --- a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp +++ b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -148,6 +149,7 @@ private slots: void testScrollToWithHidden(); void testViewOptions(); void taskQTBUG_39902_mutualScrollBars(); + void horizontalScrollingByVerticalWheelEvents(); }; // Testing get/set functions @@ -2372,5 +2374,52 @@ void tst_QListView::taskQTBUG_39902_mutualScrollBars() QTest::qWait(100); } +void tst_QListView::horizontalScrollingByVerticalWheelEvents() +{ + QListView lv; + lv.setWrapping(true); + + TestDelegate *delegate = new TestDelegate(&lv); + delegate->m_sizeHint = QSize(100, 100); + lv.setItemDelegate(delegate); + + QtTestModel model; + model.colCount = 1; + model.rCount = 100; + + lv.setModel(&model); + + lv.resize(300, 300); + lv.show(); + QTest::qWaitForWindowExposed(&lv); + + QPoint globalPos = lv.geometry().center(); + QPoint pos = lv.viewport()->geometry().center(); + + QWheelEvent wheelDownEvent(pos, globalPos, QPoint(0, 0), QPoint(0, -120), -120, Qt::Vertical, 0, 0); + QWheelEvent wheelUpEvent(pos, globalPos, QPoint(0, 0), QPoint(0, 120), 120, Qt::Vertical, 0, 0); + QWheelEvent wheelLeftDownEvent(pos, globalPos, QPoint(0, 0), QPoint(120, -120), -120, Qt::Vertical, 0, 0); + + int hValue = lv.horizontalScrollBar()->value(); + QApplication::sendEvent(lv.viewport(), &wheelDownEvent); + QVERIFY(lv.horizontalScrollBar()->value() > hValue); + + QApplication::sendEvent(lv.viewport(), &wheelUpEvent); + QVERIFY(lv.horizontalScrollBar()->value() == hValue); + + QApplication::sendEvent(lv.viewport(), &wheelLeftDownEvent); + QVERIFY(lv.horizontalScrollBar()->value() == hValue); + + // ensure that vertical wheel events are not converted when vertical + // scroll bar is not visible but vertical scrolling is possible + lv.setWrapping(false); + lv.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + QApplication::processEvents(); + + int vValue = lv.verticalScrollBar()->value(); + QApplication::sendEvent(lv.viewport(), &wheelDownEvent); + QVERIFY(lv.verticalScrollBar()->value() > vValue); +} + QTEST_MAIN(tst_QListView) #include "tst_qlistview.moc" -- cgit v1.2.3