Commit acec0e65 authored by Frank Reininghaus's avatar Frank Reininghaus

Remove filtered children if the parent folder is collapsed

This is analogous to commit e053ecdc,
which fixes the same problem for the case that the parent folder is
deleted.

BUG: 316335
FIXED-IN: 4.10.2
REVIEW: 109343
parent 2c0c4aaf
......@@ -438,6 +438,29 @@ bool KFileItemModel::setExpanded(int index, bool expanded)
itemsToRemove.append(m_itemData.at(index)->item);
++index;
}
QSet<KUrl> urlsToRemove;
urlsToRemove.reserve(itemsToRemove.count() + 1);
urlsToRemove.insert(url);
foreach (const KFileItem& item, itemsToRemove) {
KUrl url = item.url();
url.adjustPath(KUrl::RemoveTrailingSlash);
urlsToRemove.insert(url);
}
QSet<KFileItem>::iterator it = m_filteredItems.begin();
while (it != m_filteredItems.end()) {
const KUrl url = it->url();
KUrl parentUrl = url.upUrl();
parentUrl.adjustPath(KUrl::RemoveTrailingSlash);
if (urlsToRemove.contains(parentUrl)) {
it = m_filteredItems.erase(it);
} else {
++it;
}
}
removeItems(itemsToRemove);
}
......
......@@ -76,6 +76,7 @@ private slots:
void testNameFilter();
void testEmptyPath();
void testRemoveHiddenItems();
void collapseParentOfHiddenItems();
void removeParentOfHiddenItems();
private:
......@@ -850,6 +851,55 @@ void KFileItemModelTest::testRemoveHiddenItems()
m_model->setShowHiddenFiles(false);
}
/**
* Verify that filtered items are removed when their parent is collapsed.
*/
void KFileItemModelTest::collapseParentOfHiddenItems()
{
QSet<QByteArray> modelRoles = m_model->roles();
modelRoles << "isExpanded" << "isExpandable" << "expandedParentsCount";
m_model->setRoles(modelRoles);
QStringList files;
files << "a/1" << "a/b/1" << "a/b/c/1" << "a/b/c/d/1";
m_testDir->createFiles(files);
m_model->loadDirectory(m_testDir->url());
QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(itemsInserted(KItemRangeList)), DefaultTimeout));
QCOMPARE(m_model->count(), 1); // Only "a/"
// Expand "a/".
m_model->setExpanded(0, true);
QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(itemsInserted(KItemRangeList)), DefaultTimeout));
QCOMPARE(m_model->count(), 3); // 3 items: "a/", "a/b/", "a/1"
// Expand "a/b/".
m_model->setExpanded(1, true);
QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(itemsInserted(KItemRangeList)), DefaultTimeout));
QCOMPARE(m_model->count(), 5); // 5 items: "a/", "a/b/", "a/b/c", "a/b/1", "a/1"
// Expand "a/b/c/".
m_model->setExpanded(2, true);
QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(itemsInserted(KItemRangeList)), DefaultTimeout));
QCOMPARE(m_model->count(), 7); // 7 items: "a/", "a/b/", "a/b/c", "a/b/c/d/", "a/b/c/1", "a/b/1", "a/1"
// Set a name filter that matches nothing -> only the expanded folders remain.
m_model->setNameFilter("xyz");
QCOMPARE(m_model->count(), 3);
QCOMPARE(itemsInModel(), QStringList() << "a" << "b" << "c");
// Collapse the folder "a/".
QSignalSpy spyItemsRemoved(m_model, SIGNAL(itemsRemoved(KItemRangeList)));
m_model->setExpanded(0, false);
QCOMPARE(spyItemsRemoved.count(), 1);
QCOMPARE(m_model->count(), 1);
QCOMPARE(itemsInModel(), QStringList() << "a");
// Remove the filter -> no files should appear (and we should not get a crash).
m_model->setNameFilter(QString());
QCOMPARE(m_model->count(), 1);
}
/**
* Verify that filtered items are removed when their parent is deleted.
*/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment