]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Merge remote-tracking branch 'origin/KDE/4.11'
authorFrank Reininghaus <frank78ac@googlemail.com>
Sat, 24 Aug 2013 18:27:30 +0000 (20:27 +0200)
committerFrank Reininghaus <frank78ac@googlemail.com>
Sat, 24 Aug 2013 18:27:30 +0000 (20:27 +0200)
1  2 
src/kitemviews/kfileitemmodel.cpp

index eb7b1646135b822ea0b26cf7c61aad269ab77dac,7bbc1d17f46d1736bc0aa4c48db80e63f8a7880f..37a30519af74277a985d977cd2acbc0eb8bb3618
@@@ -711,6 -711,7 +711,6 @@@ void KFileItemModel::resortAllItems(
          oldUrls.append(itemData->item.url());
      }
  
 -    m_groups.clear();
      m_items.clear();
  
      // Resort the items
          m_items.insert(m_itemData.at(i)->item.url(), i);
      }
  
 -    // Determine the indexes that have been moved
 -    QList<int> movedToIndexes;
 -    movedToIndexes.reserve(itemCount);
 -    for (int i = 0; i < itemCount; i++) {
 -        const int newIndex = m_items.value(oldUrls.at(i));
 -        movedToIndexes.append(newIndex);
 +    // Determine the first index that has been moved.
 +    int firstMovedIndex = 0;
 +    while (firstMovedIndex < itemCount
 +           && firstMovedIndex == m_items.value(oldUrls.at(firstMovedIndex))) {
 +        ++firstMovedIndex;
      }
  
 -    // Don't check whether items have really been moved and always emit a
 -    // itemsMoved() signal after resorting: In case of grouped items
 -    // the groups might change even if the items themselves don't change their
 -    // position. Let the receiver of the signal decide whether a check for moved
 -    // items makes sense.
 -    emit itemsMoved(KItemRange(0, itemCount), movedToIndexes);
 +    const bool itemsHaveMoved = firstMovedIndex < itemCount;
 +    if (itemsHaveMoved) {
 +        m_groups.clear();
 +
 +        int lastMovedIndex = itemCount - 1;
 +        while (lastMovedIndex > firstMovedIndex
 +               && lastMovedIndex == m_items.value(oldUrls.at(lastMovedIndex))) {
 +            --lastMovedIndex;
 +        }
 +
 +        Q_ASSERT(firstMovedIndex <= lastMovedIndex);
 +
 +        // Create a list movedToIndexes, which has the property that
 +        // movedToIndexes[i] is the new index of the item with the old index
 +        // firstMovedIndex + i.
 +        const int movedItemsCount = lastMovedIndex - firstMovedIndex + 1;
 +        QList<int> movedToIndexes;
 +        movedToIndexes.reserve(movedItemsCount);
 +        for (int i = firstMovedIndex; i <= lastMovedIndex; ++i) {
 +            const int newIndex = m_items.value(oldUrls.at(i));
 +            movedToIndexes.append(newIndex);
 +        }
 +
 +        emit itemsMoved(KItemRange(firstMovedIndex, movedItemsCount), movedToIndexes);
 +    } else if (groupedSorting()) {
 +        // The groups might have changed even if the order of the items has not.
 +        const QList<QPair<int, QVariant> > oldGroups = m_groups;
 +        m_groups.clear();
 +        if (groups() != oldGroups) {
 +            emit groupsChanged();
 +        }
 +    }
  
  #ifdef KFILEITEMMODEL_DEBUG
      kDebug() << "[TIME] Resorting of" << itemCount << "items:" << timer.elapsed();
@@@ -972,7 -948,7 +972,7 @@@ void KFileItemModel::slotRefreshItems(c
      emit itemsChanged(itemRangeList, changedRoles);
  
      if (changedRoles.contains(sortRole())) {
-         resortAllItems();
+         m_resortAllItemsTimer->start();
      }
  }
  
@@@ -1405,6 -1381,9 +1405,9 @@@ QHash<QByteArray, QVariant> KFileItemMo
          if (m_requestRole[TypeRole]) {
              data.insert(sharedValue("type"), item.mimeComment());
          }
+     } else if (m_requestRole[TypeRole] && isDir) {
+         static const QString folderMimeType = item.mimeComment();
+         data.insert(sharedValue("type"), folderMimeType);
      }
  
      return data;
@@@ -2011,7 -1990,15 +2014,15 @@@ void KFileItemModel::determineMimeTypes
      QElapsedTimer timer;
      timer.start();
      foreach (const KFileItem& item, items) { // krazy:exclude=foreach
-         item.determineMimeType();
+         // Only determine mime types for files here. For directories,
+         // KFileItem::determineMimeType() reads the .directory file inside to
+         // load the icon, but this is not necessary at all if we just need the
+         // type. Some special code for setting the correct mime type for
+         // directories is in retrieveData().
+         if (!item.isDir()) {
+             item.determineMimeType();
+         }
          if (timer.elapsed() > timeout) {
              // Don't block the user interface, let the remaining items
              // be resolved asynchronously.