From d0933155e2dc179cde49b4306ff7feee9ca47697 Mon Sep 17 00:00:00 2001 From: Frank Reininghaus Date: Fri, 3 Feb 2012 19:09:42 +0100 Subject: [PATCH] Replace setExpanded(const QSet&) by expandParentItems(const KUrl&) The use case of this function (Folders Panel) requires the expansion of the parent items of a single URL, so it's not needed to handle a full set of URLs in this function. Moreover, the issue that not only the parents, but also the URLs themselves were expanded is fixed by this commit. (cherry picked from commit 89082ca391807abdc26d8985efe6b4c27183a9b1) --- src/kitemviews/kfileitemmodel.cpp | 21 +++++------- src/kitemviews/kfileitemmodel.h | 4 +-- src/panels/folders/folderspanel.cpp | 2 +- src/tests/kfileitemmodeltest.cpp | 52 +++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 16 deletions(-) diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index db9b71189..6cb7577f2 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -478,7 +478,7 @@ void KFileItemModel::restoreExpandedUrls(const QSet& urls) m_urlsToExpand = urls; } -void KFileItemModel::setExpanded(const QSet& urls) +void KFileItemModel::expandParentItems(const KUrl& url) { const KDirLister* dirLister = m_dirLister.data(); if (!dirLister) { @@ -487,20 +487,15 @@ void KFileItemModel::setExpanded(const QSet& urls) const int pos = dirLister->url().path().length(); - // Assure that each sub-path of the URLs that should be - // expanded is added to m_urlsToExpand too. KDirLister + // Assure that each sub-path of the URL that should be + // expanded is added to m_urlsToExpand. KDirLister // does not care whether the parent-URL has already been // expanded. - QSetIterator it1(urls); - while (it1.hasNext()) { - const KUrl& url = it1.next(); - - KUrl urlToExpand = dirLister->url(); - const QStringList subDirs = url.path().mid(pos).split(QDir::separator()); - for (int i = 0; i < subDirs.count(); ++i) { - urlToExpand.addPath(subDirs.at(i)); - m_urlsToExpand.insert(urlToExpand); - } + KUrl urlToExpand = dirLister->url(); + const QStringList subDirs = url.path().mid(pos).split(QDir::separator()); + for (int i = 0; i < subDirs.count() - 1; ++i) { + urlToExpand.addPath(subDirs.at(i)); + m_urlsToExpand.insert(urlToExpand); } // KDirLister::open() must called at least once to trigger an initial diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index ff816c85c..a792b089f 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -150,9 +150,9 @@ public: void restoreExpandedUrls(const QSet& urls); /** - * Expands all parent-items of each URL given by \a urls. + * Expands all parent-items of \a url. */ - void setExpanded(const QSet& urls); + void expandParentItems(const KUrl& url); void setNameFilter(const QString& nameFilter); QString nameFilter() const; diff --git a/src/panels/folders/folderspanel.cpp b/src/panels/folders/folderspanel.cpp index 2511d7e4b..3b24f5868 100644 --- a/src/panels/folders/folderspanel.cpp +++ b/src/panels/folders/folderspanel.cpp @@ -330,7 +330,7 @@ void FoldersPanel::loadTree(const KUrl& url) updateCurrentItem(index); } else { m_updateCurrentItem = true; - model->setExpanded(QSet() << url); + model->expandParentItems(url); // slotLoadingCompleted() will be invoked after the model has // expanded the url } diff --git a/src/tests/kfileitemmodeltest.cpp b/src/tests/kfileitemmodeltest.cpp index c3611ef73..d0accd68a 100644 --- a/src/tests/kfileitemmodeltest.cpp +++ b/src/tests/kfileitemmodeltest.cpp @@ -68,6 +68,7 @@ private slots: void testModelConsistencyWhenInsertingItems(); void testItemRangeConsistencyWhenInsertingItems(); void testExpandItems(); + void testExpandParentItems(); void testSorting(); void testExpansionLevelsCompare_data(); @@ -478,6 +479,57 @@ void KFileItemModelTest::testExpandItems() QCOMPARE(m_model->expandedUrls(), allFolders); } +void KFileItemModelTest::testExpandParentItems() +{ + // Create a tree structure of folders: + // a 1/ + // a 1/b1/ + // a 1/b1/c1/ + // a2/ + // a2/b2/ + // a2/b2/c2/ + // a2/b2/c2/d2/ + QSet modelRoles = m_model->roles(); + modelRoles << "isExpanded" << "isExpandable" << "expansionLevel"; + m_model->setRoles(modelRoles); + + QStringList files; + files << "a 1/b1/c1/file.txt" << "a2/b2/c2/d2/file.txt"; // missing folders are created automatically + m_testDir->createFiles(files); + + m_dirLister->openUrl(m_testDir->url()); + QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(itemsInserted(KItemRangeList)), DefaultTimeout)); + + // So far, the model contains only "a 1/" and "a2/". + QCOMPARE(m_model->count(), 2); + QVERIFY(m_model->expandedUrls().empty()); + + // Expand the parents of "a2/b2/c2". + m_model->expandParentItems(KUrl(m_testDir->name() + "a2/b2/c2")); + QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(loadingCompleted()), DefaultTimeout)); + + // The model should now contain "a 1/", "a2/", "a2/b2/", and "a2/b2/c2/". + // It's important that only the parents of "a1/b1/c1" are expanded. + QCOMPARE(m_model->count(), 4); + QVERIFY(!m_model->isExpanded(0)); + QVERIFY(m_model->isExpanded(1)); + QVERIFY(m_model->isExpanded(2)); + QVERIFY(!m_model->isExpanded(3)); + + // Expand the parents of "a 1/b1". + m_model->expandParentItems(KUrl(m_testDir->name() + "a 1/b1")); + QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(loadingCompleted()), DefaultTimeout)); + + // The model should now contain "a 1/", "a 1/b1/", "a2/", "a2/b2", and "a2/b2/c2/". + // It's important that only the parents of "a 1/b1/" and "a2/b2/c2/" are expanded. + QCOMPARE(m_model->count(), 5); + QVERIFY(m_model->isExpanded(0)); + QVERIFY(!m_model->isExpanded(1)); + QVERIFY(m_model->isExpanded(2)); + QVERIFY(m_model->isExpanded(3)); + QVERIFY(!m_model->isExpanded(4)); +} + void KFileItemModelTest::testSorting() { // Create some files with different sizes and modification times to check the different sorting options -- 2.47.3