]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kfileitemmodel.cpp
Compare UDS entry times directly instead of going through KFileItem
[dolphin.git] / src / kitemviews / kfileitemmodel.cpp
index 844954d6a3e8883239190213f7b4c16f60cf8d81..d2c8429ac3aa9404d777519cdbbe5c333591c5a4 100644 (file)
@@ -826,6 +826,9 @@ void KFileItemModel::loadSortingSettings()
     default:
         Q_UNREACHABLE();
     }
+    // Workaround for bug https://bugreports.qt.io/browse/QTBUG-69361
+    // Force the clean state of QCollator in single thread to avoid thread safety problems in sort
+    m_collator.compare(QString(), QString());
 }
 
 void KFileItemModel::resortAllItems()
@@ -1205,7 +1208,7 @@ void KFileItemModel::insertItems(QList<ItemData*>& newItems)
     } else {
         m_itemData.reserve(totalItemCount);
         for (int i = existingItemCount; i < totalItemCount; ++i) {
-            m_itemData.append(0);
+            m_itemData.append(nullptr);
         }
 
         // We build the new list m_itemData in reverse order to minimize
@@ -1275,7 +1278,7 @@ void KFileItemModel::removeItems(const KItemRangeList& itemRanges, RemoveItemsBe
                 delete m_itemData.at(index);
             }
 
-            m_itemData[index] = 0;
+            m_itemData[index] = nullptr;
         }
     }
 
@@ -1316,7 +1319,7 @@ QList<KFileItemModel::ItemData*> KFileItemModel::createItemDataList(const QUrl&
     }
 
     const int parentIndex = index(parentUrl);
-    ItemData* parentItem = parentIndex < 0 ? 0 : m_itemData.at(parentIndex);
+    ItemData* parentItem = parentIndex < 0 ? nullptr : m_itemData.at(parentIndex);
 
     QList<ItemData*> itemDataList;
     itemDataList.reserve(items.count());
@@ -1709,63 +1712,24 @@ bool KFileItemModel::lessThan(const ItemData* a, const ItemData* b, const QColla
     return (sortOrder() == Qt::AscendingOrder) ? result < 0 : result > 0;
 }
 
-/**
- * Helper class for KFileItemModel::sort().
- */
-class KFileItemModelLessThan
-{
-public:
-    KFileItemModelLessThan(const KFileItemModel* model, const QCollator& collator) :
-        m_model(model),
-        m_collator(collator)
-    {
-    }
-
-    KFileItemModelLessThan(const KFileItemModelLessThan& other) :
-        m_model(other.m_model),
-        m_collator()
-    {
-        m_collator.setCaseSensitivity(other.m_collator.caseSensitivity());
-        m_collator.setIgnorePunctuation(other.m_collator.ignorePunctuation());
-        m_collator.setLocale(other.m_collator.locale());
-        m_collator.setNumericMode(other.m_collator.numericMode());
-    }
-
-    ~KFileItemModelLessThan() = default;
-    //We do not delete m_model as the pointer was passed from outside ant it will be deleted elsewhere.
-
-    KFileItemModelLessThan& operator=(const KFileItemModelLessThan& other)
-    {
-        m_model = other.m_model;
-        m_collator = other.m_collator;
-        return *this;
-    }
-
-    bool operator()(const KFileItemModel::ItemData* a, const KFileItemModel::ItemData* b) const
-    {
-        return m_model->lessThan(a, b, m_collator);
-    }
-
-private:
-    const KFileItemModel* m_model;
-    QCollator m_collator;
-};
-
 void KFileItemModel::sort(QList<KFileItemModel::ItemData*>::iterator begin,
                           QList<KFileItemModel::ItemData*>::iterator end) const
 {
-    KFileItemModelLessThan lessThan(this, m_collator);
+    auto lambdaLessThan = [&] (const KFileItemModel::ItemData* a, const KFileItemModel::ItemData* b)
+    {
+        return lessThan(a, b, m_collator);
+    };
 
     if (m_sortRole == NameRole) {
         // Sorting by name can be expensive, in particular if natural sorting is
         // enabled. Use all CPU cores to speed up the sorting process.
         static const int numberOfThreads = QThread::idealThreadCount();
-        parallelMergeSort(begin, end, lessThan, numberOfThreads);
+        parallelMergeSort(begin, end, lambdaLessThan, numberOfThreads);
     } else {
         // Sorting by other roles is quite fast. Use only one thread to prevent
         // problems caused by non-reentrant comparison functions, see
         // https://bugs.kde.org/show_bug.cgi?id=312679
-        mergeSort(begin, end, lessThan);
+        mergeSort(begin, end, lambdaLessThan);
     }
 }
 
@@ -1814,8 +1778,8 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const
     }
 
     case ModificationTimeRole: {
-        const QDateTime dateTimeA = itemA.time(KFileItem::ModificationTime);
-        const QDateTime dateTimeB = itemB.time(KFileItem::ModificationTime);
+        const long long dateTimeA = itemA.entry().numberValue(KIO::UDSEntry::UDS_MODIFICATION_TIME, -1);
+        const long long dateTimeB = itemB.entry().numberValue(KIO::UDSEntry::UDS_MODIFICATION_TIME, -1);
         if (dateTimeA < dateTimeB) {
             result = -1;
         } else if (dateTimeA > dateTimeB) {
@@ -1825,8 +1789,8 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const
     }
 
     case CreationTimeRole: {
-        const QDateTime dateTimeA = itemA.time(KFileItem::CreationTime);
-        const QDateTime dateTimeB = itemB.time(KFileItem::CreationTime);
+        const long long dateTimeA = itemA.entry().numberValue(KIO::UDSEntry::UDS_CREATION_TIME, -1);
+        const long long dateTimeB = itemB.entry().numberValue(KIO::UDSEntry::UDS_CREATION_TIME, -1);
         if (dateTimeA < dateTimeB) {
             result = -1;
         } else if (dateTimeA > dateTimeB) {
@@ -1848,7 +1812,11 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const
 
     case RatingRole:
     case WidthRole:
-    case HeightRole: {
+    case HeightRole:
+    case WordCountRole:
+    case LineCountRole:
+    case TrackRole:
+    case ReleaseYearRole: {
         result = a->values.value(roleForType(m_sortRole)).toInt() - b->values.value(roleForType(m_sortRole)).toInt();
         break;
     }