]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Revert to change the commit message.
authorJaime Torres <jtamate@gmail.com>
Sat, 14 Jul 2018 17:35:47 +0000 (19:35 +0200)
committerJaime Torres <jtamate@gmail.com>
Sat, 14 Jul 2018 17:35:47 +0000 (19:35 +0200)
Summary: This reverts commit 765cc968c9dfbd4350226b775377506135c0442d.

Test Plan: revert-hammer

Reviewers:

Subscribers:

src/kitemviews/kfileitemmodel.cpp
src/kitemviews/kfileitemmodel.h

index 56c21f51ca50329eeac5c18166154b0fb3da78b4..9db3a2e5a8d3f5ee531d00cb0d0279cc50f55be1 100644 (file)
@@ -826,9 +826,6 @@ 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()
@@ -1712,24 +1709,63 @@ 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
 {
-    auto lambdaLessThan = [&] (const KFileItemModel::ItemData* a, const KFileItemModel::ItemData* b)
-    {
-        return lessThan(a, b, m_collator);
-    };
+    KFileItemModelLessThan lessThan(this, 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, lambdaLessThan, numberOfThreads);
+        parallelMergeSort(begin, end, lessThan, 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, lambdaLessThan);
+        mergeSort(begin, end, lessThan);
     }
 }
 
index a931a28cc35d5b07954f72931d7fb50e93e42767..134c50245c897318467bdb4f2a21e5297b1f88d9 100644 (file)
@@ -499,6 +499,7 @@ private:
     // and done step after step in slotCompleted().
     QSet<QUrl> m_urlsToExpand;
 
+    friend class KFileItemModelLessThan;       // Accesses lessThan() method
     friend class KFileItemModelRolesUpdater;   // Accesses emitSortProgress() method
     friend class KFileItemModelTest;           // For unit testing
     friend class KFileItemModelBenchmark;      // For unit testing