/* * Copyright (C) 2013 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "listviewwithpageheader.h" #include #include #include #include #include #include #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-pedantic" #include #include #include #pragma GCC diagnostic pop class StringListModel : public QAbstractListModel { public: StringListModel() { list << "A" << "B" << "C" << "D" << "E" << "F" << "G" << "H"; } int rowCount(const QModelIndex &parent) const { if (parent.isValid()) return 0; else return list.count(); } QVariant data(const QModelIndex &index, int role) const { if (role == Qt::SizeHintRole) return 50; else if (role == Qt::DisplayRole) return list[index.row()]; return QVariant(); } QHash roleNames() const { QHash hash; hash.insert(Qt::DisplayRole, "type"); hash.insert(Qt::SizeHintRole, "size"); return hash; } void moveLastToFirst() { const int last = list.count() - 1; beginMoveRows(QModelIndex(), last, last, QModelIndex(), 0); list.move(last, 0); endMoveRows(); } QStringList list; }; class ListViewWithPageHeaderTestSection : public QObject { Q_OBJECT private: void verifyItem(int visibleIndex, qreal pos, qreal height, bool culled, const QString §ionHeader, bool sectionHeaderCulled) { QTRY_VERIFY(visibleIndex < lvwph->m_visibleItems.count()); QTRY_COMPARE(lvwph->m_visibleItems[visibleIndex]->y(), pos); QTRY_COMPARE(lvwph->m_visibleItems[visibleIndex]->height(), height); QCOMPARE(QQuickItemPrivate::get(lvwph->m_visibleItems[visibleIndex]->m_item)->culled, culled); QCOMPARE(section(lvwph->m_visibleItems[visibleIndex]->sectionItem()), sectionHeader); if (!sectionHeader.isNull()) { QCOMPARE(QQuickItemPrivate::get(lvwph->m_visibleItems[visibleIndex]->sectionItem())->culled, sectionHeaderCulled); QCOMPARE(sectionDelegateIndex(lvwph->m_visibleItems[visibleIndex]->sectionItem()), lvwph->m_firstVisibleIndex + visibleIndex); } } void changeContentY(qreal change) { const qreal dest = lvwph->contentY() + change; if (dest > lvwph->contentY()) { const qreal jump = 25; while (lvwph->contentY() + jump < dest) { lvwph->setContentY(lvwph->contentY() + jump); QTest::qWait(1); } } else { const qreal jump = -25; while (lvwph->contentY() + jump > dest) { lvwph->setContentY(lvwph->contentY() + jump); QTest::qWait(1); } } lvwph->setContentY(dest); QTest::qWait(1); } void scrollToTop() { const qreal jump = -25; while (!lvwph->isAtYBeginning()) { if (lvwph->contentY() + jump > -lvwph->minYExtent()) { lvwph->setContentY(lvwph->contentY() + jump); } else { lvwph->setContentY(lvwph->contentY() - 1); } QTest::qWait(1); } } void scrollToBottom() { const qreal jump = 25; while (!lvwph->isAtYEnd()) { if (lvwph->contentY() + lvwph->height() + jump < lvwph->contentHeight()) { lvwph->setContentY(lvwph->contentY() + jump); } else { lvwph->setContentY(lvwph->contentY() + 1); } QTest::qWait(1); } } void verifyInitialTopPosition() { QTRY_COMPARE(lvwph->m_visibleItems.count(), 0); QCOMPARE(lvwph->m_firstVisibleIndex, -1); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 0.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled); } QString section(QQuickItem *item) { return item ? QQmlEngine::contextForObject(item)->parentContext()->contextProperty(QLatin1String("section")).toString() : QString(); } int sectionDelegateIndex(QQuickItem *item) { return item ? QQmlEngine::contextForObject(item)->parentContext()->contextProperty(QLatin1String("delegateIndex")).toInt() : -1; } private Q_SLOTS: void initTestCase() { } void init() { view = new QQuickView(); view->engine()->addImportPath(BUILT_PLUGINS_DIR); view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/listviewwithpageheadertestsectionexternalmodel.qml")); lvwph = dynamic_cast(view->rootObject()->findChild()); QVERIFY(lvwph); view->show(); QTest::qWaitForWindowExposed(view); verifyInitialTopPosition(); } void cleanup() { delete view; } void testCreationDeletion() { // Nothing, init/cleanup already tests this } void testMoveWithProxy() { StringListModel m; QSortFilterProxyModel proxy; proxy.setSourceModel(&m); lvwph->setModel(&proxy); QTRY_COMPARE(lvwph->m_visibleItems.count(), 8); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 90., false, "A", false); verifyItem(1, 140., 90., false, "B", false); verifyItem(2, 230., 90., false, "C", false); verifyItem(3, 320., 90., false, "D", false); verifyItem(4, 410., 90., false, "E", false); verifyItem(5, 500., 90., false, "F", false); verifyItem(6, 590., 90., true, "G", true); verifyItem(7, 680., 90., true, "H", true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 0.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled); m.moveLastToFirst(); QTRY_COMPARE(lvwph->m_visibleItems.count(), 8); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 90., false, "H", false); verifyItem(1, 140., 90., false, "A", false); verifyItem(2, 230., 90., false, "B", false); verifyItem(3, 320., 90., false, "C", false); verifyItem(4, 410., 90., false, "D", false); verifyItem(5, 500., 90., false, "E", false); verifyItem(6, 590., 90., true, "F", true); verifyItem(7, 680., 90., true, "G", true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 0.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled); } private: QQuickView *view; ListViewWithPageHeader *lvwph; }; QTEST_MAIN(ListViewWithPageHeaderTestSection) #include "listviewwithpageheadersectionexternalmodeltest.moc"