Ensure that the "Sort by Type" setting is respected

Before this commit, switching from, e.g., "Sort by Name" to "Sort by
Type" sometimes had no effect until the view was refreshed. The problem
was that the re-sorting was triggered before the type information was
actually added to the model.

BUG: 310705
BUG: 312014
FIXED-IN: 4.10.5
REVIEW: 111004
This commit is contained in:
Frank Reininghaus 2013-06-18 17:39:56 +02:00
parent 9cf54dcc02
commit 75ed1946f8
2 changed files with 45 additions and 4 deletions

View file

@ -644,11 +644,11 @@ void KFileItemModel::onSortRoleChanged(const QByteArray& current, const QByteArr
Q_UNUSED(previous);
m_sortRole = typeForRole(current);
#ifdef KFILEITEMMODEL_DEBUG
if (!m_requestRole[m_sortRole]) {
kWarning() << "The sort-role has been changed to a role that has not been received yet";
QSet<QByteArray> newRoles = m_roles;
newRoles << current;
setRoles(newRoles);
}
#endif
resortAllItems();
}

View file

@ -67,6 +67,7 @@ private slots:
void testSetData();
void testSetDataWithModifiedSortRole_data();
void testSetDataWithModifiedSortRole();
void testChangeSortRole();
void testModelConsistencyWhenInsertingItems();
void testItemRangeConsistencyWhenInsertingItems();
void testExpandItems();
@ -274,6 +275,8 @@ void KFileItemModelTest::testSetDataWithModifiedSortRole()
// Changing the value of a sort-role must result in
// a reordering of the items.
QCOMPARE(m_model->sortRole(), QByteArray("text"));
m_model->setSortRole("rating");
QCOMPARE(m_model->sortRole(), QByteArray("rating"));
QStringList files;
files << "a.txt" << "b.txt" << "c.txt";
@ -299,7 +302,6 @@ void KFileItemModelTest::testSetDataWithModifiedSortRole()
ratingC.insert("rating", 6);
m_model->setData(2, ratingC);
m_model->setSortRole("rating");
QCOMPARE(m_model->data(0).value("rating").toInt(), 2);
QCOMPARE(m_model->data(1).value("rating").toInt(), 4);
QCOMPARE(m_model->data(2).value("rating").toInt(), 6);
@ -320,6 +322,45 @@ void KFileItemModelTest::testSetDataWithModifiedSortRole()
QVERIFY(isModelConsistent());
}
void KFileItemModelTest::testChangeSortRole()
{
QCOMPARE(m_model->sortRole(), QByteArray("text"));
QStringList files;
files << "a.txt" << "b.jpg" << "c.txt";
m_testDir->createFiles(files);
m_model->loadDirectory(m_testDir->url());
QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(itemsInserted(KItemRangeList)), DefaultTimeout));
QCOMPARE(itemsInModel(), QStringList() << "a.txt" << "b.jpg" << "c.txt");
// Simulate that KFileItemModelRolesUpdater determines the mime type.
// Resorting the files by 'type' will only work immediately if their
// mime types are known.
for (int index = 0; index < m_model->count(); ++index) {
m_model->fileItem(index).determineMimeType();
}
// Now: sort by type.
QSignalSpy spyItemsMoved(m_model, SIGNAL(itemsMoved(KItemRange,QList<int>)));
m_model->setSortRole("type");
QCOMPARE(m_model->sortRole(), QByteArray("type"));
QVERIFY(!spyItemsMoved.isEmpty());
// The actual order of the files might depend on the translation of the
// result of KFileItem::mimeComment() in the user's language.
QStringList version1;
version1 << "b.jpg" << "a.txt" << "c.txt";
QStringList version2;
version2 << "a.txt" << "c.txt" << "b.jpg";
const bool ok1 = (itemsInModel() == version1);
const bool ok2 = (itemsInModel() == version2);
QVERIFY(ok1 || ok2);
}
void KFileItemModelTest::testModelConsistencyWhenInsertingItems()
{
//QSKIP("Temporary disabled", SkipSingle);