on xenial help sign in
Fix showHeader animation when the header is half shown at top

. Approved by PS Jenkins bot, Gerry Boland, Michael Zanetti, Michał Sawicz.

commitbde28f10b0ecf40a3a74708f1425871c9e14cd5f authorAlbert Astals <albert.astals@canonical.com> dateTue 9 Jul 2013, 18:58 (13 years ago) parent39bacfa1aef4e8
3 files changed+125
plugins/ListViewWithPageHeader/listviewwithpageheader.cpp+13 tests/plugins/ListViewWithPageHeader/listviewwithpageheadertest.cpp+55 tests/plugins/ListViewWithPageHeader/listviewwithpageheadertestsection.cpp+57
plugins/ListViewWithPageHeader/listviewwithpageheader.cpp+13
@@ -347,6 +347,19 @@ void ListViewWithPageHeader::showHeader()
347347
348348 auto to = qMax(-minYExtent(), contentY() - m_headerItem->height() + m_headerItemShownHeight);
349349 if (to != contentY()) {
350+ const bool headerShownByItsOwn = contentY() < m_headerItem->y() + m_headerItem->height();
351+ if (headerShownByItsOwn && m_headerItemShownHeight == 0) {
352+ // We are not clipping since we are just at the top of the viewport
353+ // but because of the showHeader animation we will need to, so
354+ // enable the clipping without logically moving the items
355+ m_headerItemShownHeight = m_headerItem->y() + m_headerItem->height() - contentY();
356+ if (!m_visibleItems.isEmpty()) {
357+ updateClipItem();
358+ ListItem *firstItem = m_visibleItems.first();
359+ firstItem->setY(firstItem->y() - m_headerItemShownHeight);
360+ layout();
361+ }
362+ }
350363 m_headerShowAnimation->setTo(to);
351364 m_headerShowAnimation->start();
352365 }
tests/plugins/ListViewWithPageHeader/listviewwithpageheadertest.cpp+55
@@ -1248,6 +1248,61 @@ private Q_SLOTS:
12481248 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
12491249 }
12501250
1251+ void testShowHeaderHalfShown()
1252+ {
1253+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1254+ QSKIP("This test is extremely unstable in 5.0.x");
1255+#endif
1256+ changeContentY(20);
1257+
1258+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1259+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1260+ verifyItem(0, 30., 150., false);
1261+ verifyItem(1, 180, 200., false);
1262+ verifyItem(2, 380, 350., false);
1263+ verifyItem(3, 730, 350., true);
1264+ QCOMPARE(lvwph->m_minYExtent, 0.);
1265+ QCOMPARE(lvwph->m_clipItem->y(), 20.);
1266+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1267+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1268+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1269+ QCOMPARE(lvwph->contentY(), 20.);
1270+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);;
1271+
1272+ lvwph->showHeader();
1273+
1274+ QTRY_VERIFY(!lvwph->m_headerShowAnimation->isRunning());
1275+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1276+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1277+ verifyItem(0, -20., 150., false);
1278+ verifyItem(1, 130, 200., false);
1279+ verifyItem(2, 330, 350., false);
1280+ verifyItem(3, 680, 350., true);
1281+ QCOMPARE(lvwph->m_minYExtent, 20.);
1282+ QCOMPARE(lvwph->m_clipItem->y(), 50.);
1283+ QCOMPARE(lvwph->m_clipItem->clip(), true);
1284+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1285+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1286+ QCOMPARE(lvwph->contentY(), 0.);
1287+ QCOMPARE(lvwph->m_headerItemShownHeight, 50.);
1288+
1289+ scrollToTop();
1290+
1291+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1292+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1293+ verifyItem(0, 50., 150., false);
1294+ verifyItem(1, 200., 200., false);
1295+ verifyItem(2, 400., 350., false);
1296+ verifyItem(3, 750, 350., true);
1297+ QCOMPARE(lvwph->m_minYExtent, 20.);
1298+ QCOMPARE(lvwph->m_clipItem->y(), -20.);
1299+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1300+ QCOMPARE(lvwph->m_headerItem->y(), -20.);
1301+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1302+ QCOMPARE(lvwph->contentY(), -20.);
1303+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1304+ }
1305+
12511306 void testShowHeaderAtBottom()
12521307 {
12531308 scrollToBottom();
tests/plugins/ListViewWithPageHeader/listviewwithpageheadertestsection.cpp+57
@@ -1407,6 +1407,63 @@ private Q_SLOTS:
14071407 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
14081408 }
14091409
1410+ void testShowHeaderHalfShown()
1411+ {
1412+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1413+ QSKIP("This test is extremely unstable in 5.0.x");
1414+#endif
1415+ changeContentY(20);
1416+
1417+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1418+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1419+ verifyItem(0, 30., 190., false, "Agressive", false);
1420+ verifyItem(1, 220, 240., false, "Regular", false);
1421+ verifyItem(2, 460, 390., false, "Mild", false);
1422+ QCOMPARE(lvwph->m_minYExtent, 0.);
1423+ QCOMPARE(lvwph->m_clipItem->y(), 20.);
1424+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1425+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1426+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1427+ QCOMPARE(lvwph->contentY(), 20.);
1428+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);;
1429+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1430+
1431+ lvwph->showHeader();
1432+
1433+ QTRY_VERIFY(!lvwph->m_headerShowAnimation->isRunning());
1434+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1435+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1436+ verifyItem(0, -20., 190., false, "Agressive", true);
1437+ verifyItem(1, 170, 240., false, "Regular", false);
1438+ verifyItem(2, 410, 390., false, "Mild", false);
1439+ QCOMPARE(lvwph->m_minYExtent, 20.);
1440+ QCOMPARE(lvwph->m_clipItem->y(), 50.);
1441+ QCOMPARE(lvwph->m_clipItem->clip(), true);
1442+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1443+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1444+ QCOMPARE(lvwph->contentY(), 0.);
1445+ QCOMPARE(lvwph->m_headerItemShownHeight, 50.);
1446+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1447+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
1448+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1449+
1450+ scrollToTop();
1451+
1452+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1453+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1454+ verifyItem(0, 50., 190., false, "Agressive", false);
1455+ verifyItem(1, 240., 240., false, "Regular", false);
1456+ verifyItem(2, 480., 390., false, "Mild", false);
1457+ QCOMPARE(lvwph->m_minYExtent, 20.);
1458+ QCOMPARE(lvwph->m_clipItem->y(), -20.);
1459+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1460+ QCOMPARE(lvwph->m_headerItem->y(), -20.);
1461+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1462+ QCOMPARE(lvwph->contentY(), -20.);
1463+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1464+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1465+ }
1466+
14101467 void testShowHeaderCloseToTheTop()
14111468 {
14121469 changeContentY(375);