]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Merge remote-tracking branch 'origin/KDE/4.12'
authorFrank Reininghaus <frank78ac@googlemail.com>
Sun, 22 Dec 2013 12:20:02 +0000 (13:20 +0100)
committerFrank Reininghaus <frank78ac@googlemail.com>
Sun, 22 Dec 2013 12:20:02 +0000 (13:20 +0100)
1  2 
src/kitemviews/kfileitemmodel.cpp

index 058248a189d9ad3a6ec032266860e4e35aa71fee,87006718a925e730422b0c91f54ebf9b3b8db902..b3c56e1c63b078e3ec5ac076d0871bec0dd9bffb
@@@ -21,6 -21,7 +21,6 @@@
  
  #include "kfileitemmodel.h"
  
 -#include <KDirModel>
  #include <KGlobalSettings>
  #include <KLocale>
  #include <KStringHandler>
@@@ -246,23 -247,9 +246,23 @@@ QMimeData* KFileItemModel::createMimeDa
      KUrl::List urls;
      KUrl::List mostLocalUrls;
      bool canUseMostLocalUrls = true;
 +    const ItemData* lastAddedItem = 0;
  
      foreach (int index, indexes) {
 -        const KFileItem item = fileItem(index);
 +        const ItemData* itemData = m_itemData.at(index);
 +        const ItemData* parent = itemData->parent;
 +
 +        while (parent && parent != lastAddedItem) {
 +            parent = parent->parent;
 +        }
 +
 +        if (parent && parent == lastAddedItem) {
 +            // A parent of 'itemData' has been added already.
 +            continue;
 +        }
 +
 +        lastAddedItem = itemData;
 +        const KFileItem& item = itemData->item;
          if (!item.isNull()) {
              urls << item.targetUrl();
  
      }
  
      const bool different = canUseMostLocalUrls && mostLocalUrls != urls;
 -    urls = KDirModel::simplifiedUrlList(urls); // TODO: Check if we still need KDirModel for this in KDE 5.0
      if (different) {
 -        mostLocalUrls = KDirModel::simplifiedUrlList(mostLocalUrls);
          urls.populateMimeData(mostLocalUrls, data);
      } else {
          urls.populateMimeData(data);
@@@ -424,6 -413,15 +424,15 @@@ void KFileItemModel::setRoles(const QSe
          kWarning() << "TODO: Emitting itemsChanged() with no information what has changed!";
          emit itemsChanged(KItemRangeList() << KItemRange(0, count()), QSet<QByteArray>());
      }
+     // Clear the 'values' of all filtered items. They will be re-populated with the
+     // correct roles the next time 'values' will be accessed via data(int).
+     QHash<KFileItem, ItemData*>::iterator filteredIt = m_filteredItems.begin();
+     const QHash<KFileItem, ItemData*>::iterator filteredEnd = m_filteredItems.end();
+     while (filteredIt != filteredEnd) {
+         (*filteredIt)->values.clear();
+         ++filteredIt;
+     }
  }
  
  QSet<QByteArray> KFileItemModel::roles() const
@@@ -969,6 -967,20 +978,20 @@@ void KFileItemModel::slotRefreshItems(c
              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);
+             }
          }
      }
  
@@@ -1044,6 -1056,7 +1067,7 @@@ void KFileItemModel::insertItems(QList<
  #endif
  
      m_groups.clear();
+     prepareItemsForSorting(newItems);
  
      if (m_sortRole == NameRole && m_naturalSorting) {
          // Natural sorting of items can be very slow. However, it becomes much
@@@ -1207,6 -1220,11 +1231,11 @@@ QList<KFileItemModel::ItemData*> KFileI
          itemDataList.append(itemData);
      }
  
+     return itemDataList;
+ }
+ void KFileItemModel::prepareItemsForSorting(QList<ItemData*>& itemDataList)
+ {
      switch (m_sortRole) {
      case PermissionsRole:
      case OwnerRole:
          // These roles can be determined with retrieveData, and they have to be stored
          // in the QHash "values" for the sorting.
          foreach (ItemData* itemData, itemDataList) {
-             itemData->values = retrieveData(itemData->item, parentItem);
+             if (itemData->values.isEmpty()) {
+                 itemData->values = retrieveData(itemData->item, itemData->parent);
+             }
          }
          break;
  
      case TypeRole:
          // At least store the data including the file type for items with known MIME type.
          foreach (ItemData* itemData, itemDataList) {
-             const KFileItem item = itemData->item;
-             if (item.isDir() || item.isMimeTypeKnown()) {
-                 itemData->values = retrieveData(itemData->item, parentItem);
+             if (itemData->values.isEmpty()) {
+                 const KFileItem item = itemData->item;
+                 if (item.isDir() || item.isMimeTypeKnown()) {
+                     itemData->values = retrieveData(itemData->item, itemData->parent);
+                 }
              }
          }
          break;
          // The other roles are either resolved by KFileItemModelRolesUpdater
          // (this includes the SizeRole for directories), or they do not need
          // to be stored in the QHash "values" for sorting because the data can
-         // be retrieved directly from the KFileItem (NameRole, SiezRole for files,
+         // be retrieved directly from the KFileItem (NameRole, SizeRole for files,
          // DateRole).
          break;
      }
-     return itemDataList;
  }
  
  int KFileItemModel::expandedParentsCount(const ItemData* data)