]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Resort directory size count after refreshing
authorAkseli Lahtinen <akselmo@akselmo.dev>
Fri, 15 Dec 2023 13:07:12 +0000 (13:07 +0000)
committerMéven Car <meven.car@kdemail.net>
Fri, 15 Dec 2023 13:07:12 +0000 (13:07 +0000)
After refreshing the view when
size count is selected as the sortRole,
count is 0 at first. When the actual count is loaded,
the sorting is done according to the count being 0.
This can break the sort order and cause view and model
to be out of sync.

Making sure we always resort all items
when the directory size/item count is changed fixes this

BUG:473999

src/kitemviews/kfileitemmodel.cpp
src/kitemviews/kfileitemmodel.h
src/kitemviews/kfileitemmodelrolesupdater.cpp
src/tests/kfileitemmodeltest.cpp

index 4fd1ebd570a64447a0766605ef930b0e283a6546..8de22318bbc6ebe6f536e42c54d7b20ef68b5cd2 100644 (file)
@@ -260,6 +260,13 @@ void KFileItemModel::setShowTrashMime(bool show)
     }
 }
 
+void KFileItemModel::scheduleResortAllItems()
+{
+    if (!m_resortAllItemsTimer->isActive()) {
+        m_resortAllItemsTimer->start();
+    }
+}
+
 void KFileItemModel::setShowHiddenFiles(bool show)
 {
     m_dirLister->setShowHiddenFiles(show);
index 3c2721d8ffec9129113846299b93e6c5ffa37e97..f87d2d5437af262e7823f8acb38e51fbd1eb1fb8 100644 (file)
@@ -205,6 +205,8 @@ public:
     /** set to true to hide application/x-trash files */
     void setShowTrashMime(bool show);
 
+    void scheduleResortAllItems();
+
 Q_SIGNALS:
     /**
      * Is emitted if the loading of a directory has been started. It is
index e2d32265ef726b0acf2712d9db6b92fa45c84fef..070b958650e81896e22bbd3c2046d51fab18429f 100644 (file)
@@ -1346,6 +1346,9 @@ void KFileItemModelRolesUpdater::startDirectorySizeCounting(const KFileItem &ite
                 disconnect(m_model, &KFileItemModel::itemsChanged, this, &KFileItemModelRolesUpdater::slotItemsChanged);
                 m_model->setData(index, data);
                 connect(m_model, &KFileItemModel::itemsChanged, this, &KFileItemModelRolesUpdater::slotItemsChanged);
+                if (m_model->sortRole() == "size") {
+                    m_model->scheduleResortAllItems();
+                }
             }
         });
         return;
index 16189a0fc647199335723f7cc98d3d987782db5e..973b9c08c7fcb8396af01f185d3b48a77d9c3d9f 100644 (file)
@@ -92,6 +92,7 @@ private Q_SLOTS:
     void testDeleteFileMoreThanOnce();
     void testInsertAfterExpand();
     void testCurrentDirRemoved();
+    void testSizeSortingAfterRefresh();
 
 private:
     QStringList itemsInModel() const;
@@ -846,6 +847,108 @@ void KFileItemModelTest::testRemoveFilteredExpandedItems()
                            << "file");
 }
 
+void KFileItemModelTest::testSizeSortingAfterRefresh()
+{
+    // testDir structure is as follows
+    // ./
+    // ├─ a
+    // ├─ b
+    // ├─ c/
+    // │  ├─ c-2/
+    // │  │  ├─ c-3
+    // │  ├─ c-1
+    // ├─ d
+    // ├─ e
+
+    QSignalSpy itemsInsertedSpy(m_model, &KFileItemModel::itemsInserted);
+    QSignalSpy itemsMovedSpy(m_model, &KFileItemModel::itemsMoved);
+    QVERIFY(itemsMovedSpy.isValid());
+
+    // Create some files with different sizes and modification times to check the different sorting options
+    QDateTime now = QDateTime::currentDateTime();
+
+    QSet<QByteArray> roles;
+    roles.insert("text");
+    roles.insert("isExpanded");
+    roles.insert("isExpandable");
+    roles.insert("expandedParentsCount");
+    m_model->setRoles(roles);
+
+    m_testDir->createDir("c/c-2");
+    m_testDir->createFile("c/c-2/c-3");
+    m_testDir->createFile("c/c-1");
+
+    m_testDir->createFile("a", "A file", now.addDays(-3));
+    m_testDir->createFile("b", "A larger file", now.addDays(0));
+    m_testDir->createDir("c", now.addDays(-2));
+    m_testDir->createFile("d", "The largest file in this directory", now.addDays(-1));
+    m_testDir->createFile("e", "An even larger file", now.addDays(-4));
+
+    m_model->loadDirectory(m_testDir->url());
+    QVERIFY(itemsInsertedSpy.wait());
+
+    int index = m_model->index(QUrl(m_testDir->url().url() + "/c"));
+    m_model->setExpanded(index, true);
+    QVERIFY(itemsInsertedSpy.wait());
+
+    index = m_model->index(QUrl(m_testDir->url().url() + "/c/c-2"));
+    m_model->setExpanded(index, true);
+    QVERIFY(itemsInsertedSpy.wait());
+
+    // Default: Sort by Name, ascending
+    QCOMPARE(m_model->sortRole(), QByteArray("text"));
+    QCOMPARE(m_model->sortOrder(), Qt::AscendingOrder);
+    QCOMPARE(itemsInModel(),
+             QStringList() << "c"
+                           << "c-2"
+                           << "c-3"
+                           << "c-1"
+                           << "a"
+                           << "b"
+                           << "d"
+                           << "e");
+
+    // Sort by Size, ascending, before refresh
+    m_model->setSortRole("size");
+    QCOMPARE(m_model->sortRole(), QByteArray("size"));
+    QCOMPARE(m_model->sortOrder(), Qt::AscendingOrder);
+    QCOMPARE(itemsInModel(),
+             QStringList() << "c"
+                           << "c-2"
+                           << "c-3"
+                           << "c-1"
+                           << "a"
+                           << "b"
+                           << "e"
+                           << "d");
+
+    // Refresh directory
+    m_model->refreshDirectory(m_model->directory());
+    QVERIFY(itemsInsertedSpy.wait());
+
+    // Expand folders again
+    index = m_model->index(QUrl(m_testDir->url().url() + "/c"));
+    m_model->setExpanded(index, true);
+    QVERIFY(itemsInsertedSpy.wait());
+
+    index = m_model->index(QUrl(m_testDir->url().url() + "/c/c-2"));
+    m_model->setExpanded(index, true);
+    QVERIFY(itemsInsertedSpy.wait());
+
+    // Sort by Size, ascending, after refresh
+    QCOMPARE(m_model->sortRole(), QByteArray("size"));
+    QCOMPARE(m_model->sortOrder(), Qt::AscendingOrder);
+    QCOMPARE(itemsInModel(),
+             QStringList() << "c"
+                           << "c-2"
+                           << "c-3"
+                           << "c-1"
+                           << "a"
+                           << "b"
+                           << "e"
+                           << "d");
+}
+
 void KFileItemModelTest::testSorting()
 {
     // testDir structure is as follows