┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaime Torres <[email protected]>2018-07-14 19:35:47 +0200
committerJaime Torres <[email protected]>2018-07-14 19:35:47 +0200
commitec89af677894377d58c9a179d7f43fc6a8cf67f0 (patch)
treebf0d6668c23c8ab9be305e9f8005f46e96d538ca
parent765cc968c9dfbd4350226b775377506135c0442d (diff)
Revert to change the commit message.
Summary: This reverts commit 765cc968c9dfbd4350226b775377506135c0442d. Test Plan: revert-hammer Reviewers: Subscribers:
-rw-r--r--src/kitemviews/kfileitemmodel.cpp54
-rw-r--r--src/kitemviews/kfileitemmodel.h1
2 files changed, 46 insertions, 9 deletions
diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp
index 56c21f51c..9db3a2e5a 100644
--- a/src/kitemviews/kfileitemmodel.cpp
+++ b/src/kitemviews/kfileitemmodel.cpp
@@ -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);
}
}
diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h
index a931a28cc..134c50245 100644
--- a/src/kitemviews/kfileitemmodel.h
+++ b/src/kitemviews/kfileitemmodel.h
@@ -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