]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Update filtered items when the "refreshItems" signal is received
authorFrank Reininghaus <frank78ac@googlemail.com>
Sun, 22 Dec 2013 11:50:09 +0000 (12:50 +0100)
committerFrank Reininghaus <frank78ac@googlemail.com>
Sun, 22 Dec 2013 11:50:14 +0000 (12:50 +0100)
This fixes the problem that the new file name is not shown in the view
if an item is renamed while it is filtered.

BUG: 329118
FIXED-IN: 4.12.1
REVIEW: 114459

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

index 739384bf9f0431c8e6b6cd3f1f900247811746c8..87006718a925e730422b0c91f54ebf9b3b8db902 100644 (file)
@@ -967,6 +967,20 @@ void KFileItemModel::slotRefreshItems(const QList<QPair<KFileItem, KFileItem> >&
             m_items.remove(oldItem.url());
             m_items.insert(newItem.url(), index);
             indexes.append(index);
+        } else {
+            // Check if 'oldItem' is one of the filtered items.
+            QHash<KFileItem, ItemData*>::iterator it = m_filteredItems.find(oldItem);
+            if (it != m_filteredItems.end()) {
+                ItemData* itemData = it.value();
+                itemData->item = newItem;
+
+                // The data stored in 'values' might have changed. Therefore, we clear
+                // 'values' and re-populate it the next time it is requested via data(int).
+                itemData->values.clear();
+
+                m_filteredItems.erase(it);
+                m_filteredItems.insert(newItem, itemData);
+            }
         }
     }
 
index ede9a3d6e6c720cccfe68d8b739aa2b45fe8998b..9079e584ecb9b562ce932afa1c75d66b1facb637 100644 (file)
@@ -92,6 +92,7 @@ private slots:
     void testInconsistentModel();
     void testChangeRolesForFilteredItems();
     void testChangeSortRoleWhileFiltering();
+    void testRefreshFilteredItems();
 
 private:
     QStringList itemsInModel() const;
@@ -1561,6 +1562,35 @@ void KFileItemModelTest::testChangeSortRoleWhileFiltering()
     QCOMPARE(itemsInModel(), QStringList() << "c.txt" << "a.txt" << "b.txt");
 }
 
+void KFileItemModelTest::testRefreshFilteredItems()
+{
+    QStringList files;
+    files << "a.txt" << "b.txt" << "c.jpg" << "d.jpg";
+    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.txt" << "c.jpg" << "d.jpg");
+
+    const KFileItem fileItemC = m_model->fileItem(2);
+
+    // Show only the .txt files.
+    m_model->setNameFilter(".txt");
+    QCOMPARE(itemsInModel(), QStringList() << "a.txt" << "b.txt");
+
+    // Rename one of the .jpg files.
+    KFileItem fileItemE = fileItemC;
+    KUrl urlE = fileItemE.url();
+    urlE.setFileName("e.jpg");
+    fileItemE.setUrl(urlE);
+
+    m_model->slotRefreshItems(QList<QPair<KFileItem, KFileItem> >() << qMakePair(fileItemC, fileItemE));
+
+    // Show all files again, and verify that the model has updated the file name.
+    m_model->setNameFilter(QString());
+    QCOMPARE(itemsInModel(), QStringList() << "a.txt" << "b.txt" << "d.jpg" << "e.jpg");
+}
+
 QStringList KFileItemModelTest::itemsInModel() const
 {
     QStringList items;