]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kfileitemmodel.cpp
KFileItemModel: emit itemsChanged() signal
[dolphin.git] / src / kitemviews / kfileitemmodel.cpp
index 401ba218d1e1b323bb64e412e7a3c226d9abd161..ff0c4a02d9d0394832df493d42be6e0bd4392ded 100644 (file)
@@ -57,6 +57,7 @@ KFileItemModel::KFileItemModel(KDirLister* dirLister, QObject* parent) :
     connect(dirLister, SIGNAL(completed()), this, SLOT(slotCompleted()));
     connect(dirLister, SIGNAL(newItems(KFileItemList)), this, SLOT(slotNewItems(KFileItemList)));
     connect(dirLister, SIGNAL(itemsDeleted(KFileItemList)), this, SLOT(slotItemsDeleted(KFileItemList)));
+    connect(dirLister, SIGNAL(refreshItems(QList<QPair<KFileItem,KFileItem> >)), this, SLOT(slotRefreshItems(QList<QPair<KFileItem,KFileItem> >)));
     connect(dirLister, SIGNAL(clear()), this, SLOT(slotClear()));
     connect(dirLister, SIGNAL(clear(KUrl)), this, SLOT(slotClear(KUrl)));
 
@@ -204,13 +205,31 @@ KFileItem KFileItemModel::fileItem(int index) const
     return KFileItem();
 }
 
+KFileItem KFileItemModel::fileItem(const KUrl& url) const
+{
+    const int index = m_items.value(url, -1);
+    if (index >= 0) {
+        return m_sortedItems.at(index);
+    }
+    return KFileItem();
+}
+
 int KFileItemModel::index(const KFileItem& item) const
 {
     if (item.isNull()) {
         return -1;
     }
 
-    return m_items.value(item, -1);
+    return m_items.value(item.url(), -1);
+}
+
+KUrl KFileItemModel::rootDirectory() const
+{
+    const KDirLister* dirLister = m_dirLister.data();
+    if (dirLister) {
+        return dirLister->url();
+    }
+    return KUrl();
 }
 
 void KFileItemModel::clear()
@@ -351,7 +370,7 @@ void KFileItemModel::onSortRoleChanged(const QByteArray& current, const QByteArr
     int index = 0;
     foreach (const KFileItem& item, sortedItems) {
         m_sortedItems.append(item);
-        m_items.insert(item, index);
+        m_items.insert(item.url(), index);
         m_data.append(retrieveData(item));
 
         ++index;
@@ -399,6 +418,55 @@ void KFileItemModel::slotItemsDeleted(const KFileItemList& items)
     removeItems(items);
 }
 
+void KFileItemModel::slotRefreshItems(const QList<QPair<KFileItem, KFileItem> >& items)
+{
+    Q_ASSERT(!items.isEmpty());
+#ifdef KFILEITEMMODEL_DEBUG
+    kDebug() << "Refreshing" << items.count() << "items";
+#endif
+
+    // Get the indexes of all items that have been refreshed
+    QList<int> indexes;
+    indexes.reserve(items.count());
+
+    QListIterator<QPair<KFileItem, KFileItem> > it(items);
+    while (it.hasNext()) {
+        const QPair<KFileItem, KFileItem>& itemPair = it.next();
+        const int index = m_items.value(itemPair.second.url(), -1);
+        if (index >= 0) {
+            indexes.append(index);
+        }
+    }
+
+    // Extract the item-ranges out of the changed indexes
+    qSort(indexes);
+
+    KItemRangeList itemRangeList;
+    int rangeIndex = 0;
+    int rangeCount = 1;
+    int previousIndex = indexes.at(0);
+
+    const int maxIndex = indexes.count() - 1;
+    for (int i = 1; i <= maxIndex; ++i) {
+        const int currentIndex = indexes.at(i);
+        if (currentIndex == previousIndex + 1) {
+            ++rangeCount;
+        } else {
+            itemRangeList.append(KItemRange(rangeIndex, rangeCount));
+
+            rangeIndex = currentIndex;
+            rangeCount = 1;
+        }
+        previousIndex = currentIndex;
+    }
+
+    if (rangeCount > 0) {
+        itemRangeList.append(KItemRange(rangeIndex, rangeCount));
+    }
+
+    emit itemsChanged(itemRangeList, QSet<QByteArray>());
+}
+
 void KFileItemModel::slotClear()
 {
 #ifdef KFILEITEMMODEL_DEBUG
@@ -495,7 +563,7 @@ void KFileItemModel::insertItems(const KFileItemList& items)
     // The indexes of all m_items must be adjusted, not only the index
     // of the new items
     for (int i = 0; i < m_sortedItems.count(); ++i) {
-        m_items.insert(m_sortedItems.at(i), i);
+        m_items.insert(m_sortedItems.at(i).url(), i);
     }
 
     itemRanges << KItemRange(insertedAtIndex, insertedCount);
@@ -557,7 +625,7 @@ void KFileItemModel::removeItems(const KFileItemList& items)
     // Delete the items
     for (int i = indexesToRemove.count() - 1; i >= 0; --i) {
         const int indexToRemove = indexesToRemove.at(i);
-        m_items.remove(m_sortedItems.at(indexToRemove));
+        m_items.remove(m_sortedItems.at(indexToRemove).url());
         m_sortedItems.removeAt(indexToRemove);
         m_data.removeAt(indexToRemove);
     }
@@ -565,7 +633,7 @@ void KFileItemModel::removeItems(const KFileItemList& items)
     // The indexes of all m_items must be adjusted, not only the index
     // of the removed items
     for (int i = 0; i < m_sortedItems.count(); ++i) {
-        m_items.insert(m_sortedItems.at(i), i);
+        m_items.insert(m_sortedItems.at(i).url(), i);
     }
 
     if (count() <= 0) {