diff options
-rw-r--r-- | src/quick/items/qquicklistview.cpp | 17 | ||||
-rw-r--r-- | src/quick/items/qquicklistview_p.h | 2 | ||||
-rw-r--r-- | tests/auto/quick/qquicklistview/tst_qquicklistview.cpp | 40 |
3 files changed, 59 insertions, 0 deletions
diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index 9206628716..4dbb2b792c 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -3608,6 +3608,23 @@ QQuickListViewAttached *QQuickListView::qmlAttachedProperties(QObject *obj) return new QQuickListViewAttached(obj); } +bool QQuickListView::contains(const QPointF &point) const +{ + bool ret = QQuickItemView::contains(point); + // QTBUG-74046: if a mouse press "falls through" a floating header or footer, don't allow dragging the list from there + if (ret) { + if (auto header = headerItem()) { + if (headerPositioning() != QQuickListView::InlineHeader && header->contains(mapToItem(header, point))) + ret = false; + } + if (auto footer = footerItem()) { + if (footerPositioning() != QQuickListView::InlineFooter && footer->contains(mapToItem(footer, point))) + ret = false; + } + } + return ret; +} + QT_END_NAMESPACE #include "moc_qquicklistview_p.cpp" diff --git a/src/quick/items/qquicklistview_p.h b/src/quick/items/qquicklistview_p.h index 1c72a10190..be21b93155 100644 --- a/src/quick/items/qquicklistview_p.h +++ b/src/quick/items/qquicklistview_p.h @@ -179,6 +179,8 @@ public: static QQuickListViewAttached *qmlAttachedProperties(QObject *); + bool contains(const QPointF &point) const override; + public Q_SLOTS: void incrementCurrentIndex(); void decrementCurrentIndex(); diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp index 646c54834a..4e21edbcb4 100644 --- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp +++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp @@ -282,6 +282,7 @@ private slots: void setPositionOnLayout(); void touchCancel(); void resizeAfterComponentComplete(); + void dragOverFloatingHeaderOrFooter(); void delegateWithRequiredProperties(); @@ -9336,6 +9337,45 @@ void tst_QQuickListView::reuse_checkThatItemsAreReused() } } +void tst_QQuickListView::dragOverFloatingHeaderOrFooter() // QTBUG-74046 +{ + QQuickView *window = getView(); + QQuickViewTestUtil::moveMouseAway(window); + window->setSource(testFileUrl("qtbug63974.qml")); + window->show(); + QVERIFY(QTest::qWaitForWindowExposed(window)); + + QQuickListView *listview = qmlobject_cast<QQuickListView *>(window->rootObject()); + QVERIFY(listview); + QCOMPARE(listview->contentY(), -20); + + // Drag downwards from the header: the list shouldn't move + QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, QPoint(10,10)); + for (int i = 0; i < 10; ++i) + QTest::mouseMove(window, QPoint(10, 10 + i * 10)); + QCOMPARE(listview->isMoving(), false); + QCOMPARE(listview->contentY(), -20); + QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier); + + // Drag upwards from the footer: the list shouldn't move + QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, QPoint(10,190)); + for (int i = 0; i < 10; ++i) + QTest::mouseMove(window, QPoint(10, 190 - i * 10)); + QCOMPARE(listview->isMoving(), false); + QCOMPARE(listview->contentY(), -20); + QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier); + + // Drag upwards from the middle: the list should move + QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, QPoint(10,100)); + for (int i = 0; i < 10 && listview->contentY() == -20; ++i) + QTest::mouseMove(window, QPoint(10, 100 - i * 10)); + QVERIFY(listview->isMoving()); + QVERIFY(listview->contentY() > -20); + QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier); + + releaseView(window); +} + QTEST_MAIN(tst_QQuickListView) #include "tst_qquicklistview.moc" |