#include "private/kfileitemmodeldirlister.h"
#include "private/kfileitemmodelsortalgorithm.h"
+#include <kio_version.h>
#include <KLocalizedString>
#include <KUrlMimeData>
#include <QMimeDatabase>
#include <QTimer>
#include <QWidget>
-#include <QMutex>
+#include <QRecursiveMutex>
#include <QIcon>
-Q_GLOBAL_STATIC_WITH_ARGS(QMutex, s_collatorMutex, (QMutex::Recursive))
+Q_GLOBAL_STATIC(QRecursiveMutex, s_collatorMutex)
// #define KFILEITEMMODEL_DEBUG
connect(m_dirLister, &KFileItemModelDirLister::started, this, &KFileItemModel::directoryLoadingStarted);
connect(m_dirLister, QOverload<>::of(&KCoreDirLister::canceled), this, &KFileItemModel::slotCanceled);
- connect(m_dirLister, QOverload<const QUrl&>::of(&KCoreDirLister::completed), this, &KFileItemModel::slotCompleted);
connect(m_dirLister, &KFileItemModelDirLister::itemsAdded, this, &KFileItemModel::slotItemsAdded);
connect(m_dirLister, &KFileItemModelDirLister::itemsDeleted, this, &KFileItemModel::slotItemsDeleted);
connect(m_dirLister, &KFileItemModelDirLister::refreshItems, this, &KFileItemModel::slotRefreshItems);
connect(m_dirLister, QOverload<const QUrl&, const QUrl&>::of(&KCoreDirLister::redirection), this, &KFileItemModel::directoryRedirection);
connect(m_dirLister, &KFileItemModelDirLister::urlIsFileError, this, &KFileItemModel::urlIsFileError);
+#if KIO_VERSION < QT_VERSION_CHECK(5, 79, 0)
+ connect(m_dirLister, QOverload<const QUrl&>::of(&KCoreDirLister::completed), this, &KFileItemModel::slotCompleted);
+#else
+ connect(m_dirLister, &KCoreDirLister::listingDirCompleted, this, &KFileItemModel::slotCompleted);
+#endif
+
// Apply default roles that should be determined
resetRoles();
m_requestRole[NameRole] = true;
}
}
- if (m_sortDirsFirst || m_sortRole == SizeRole) {
+ if (m_sortDirsFirst) {
const bool isDirA = a->item.isDir();
const bool isDirB = b->item.isDir();
if (isDirA && !isDirB) {
break;
case SizeRole: {
- if (itemA.isDir()) {
- // See "if (m_sortFoldersFirst || m_sortRole == SizeRole)" in KFileItemModel::lessThan():
- Q_ASSERT(itemB.isDir());
-
- QVariant valueA, valueB;
- if (DetailsModeSettings::directorySizeCount()) {
- valueA = a->values.value("count");
- valueB = b->values.value("count");
- } else {
- // use dir size then
- valueA = a->values.value("size");
- valueB = b->values.value("size");
- }
- if (valueA.isNull() && valueB.isNull()) {
- result = 0;
- } else if (valueA.isNull()) {
- result = -1;
- } else if (valueB.isNull()) {
- result = +1;
- } else {
- if (valueA.toLongLong() < valueB.toLongLong()) {
- return -1;
- } else {
+ if (DetailsModeSettings::directorySizeCount() && (itemA.isDir() || itemB.isDir())) {
+ // folders first then
+ if (itemA.isDir() && itemB.isDir()) {
+ auto valueA = a->values.value("count");
+ auto valueB = b->values.value("count");
+ if (valueA.isNull()) {
+ if (valueB.isNull()) {
+ return 0;
+ } else {
+ return -1;
+ }
+ } else if (valueB.isNull()) {
return +1;
+ } else {
+ if (valueA.toLongLong() < valueB.toLongLong()) {
+ return -1;
+ } else {
+ return +1;
+ }
}
- }
- } else {
- // See "if (m_sortFoldersFirst || m_sortRole == SizeRole)" in KFileItemModel::lessThan():
- Q_ASSERT(!itemB.isDir());
- const KIO::filesize_t sizeA = itemA.size();
- const KIO::filesize_t sizeB = itemB.size();
- if (sizeA > sizeB) {
- result = +1;
- } else if (sizeA < sizeB) {
- result = -1;
+ } else if (itemA.isDir()) {
+ return 1;
} else {
- result = 0;
+ return -1;
}
}
+ KIO::filesize_t sizeA = 0;
+ if (itemA.isDir()) {
+ sizeA = a->values.value("size").toULongLong();
+ } else {
+ sizeA = itemA.size();
+ }
+ KIO::filesize_t sizeB = 0;
+ if (itemB.isDir()) {
+ sizeB = b->values.value("size").toULongLong();
+ } else {
+ sizeB = itemB.size();
+ }
+ if (sizeA > sizeB) {
+ result = +1;
+ } else if (sizeA < sizeB) {
+ result = -1;
+ } else {
+ result = 0;
+ }
break;
}