diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/widgets/dialogs/qfilesystemmodel.cpp | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/src/widgets/dialogs/qfilesystemmodel.cpp b/src/widgets/dialogs/qfilesystemmodel.cpp index 5446eca383..809024ae6d 100644 --- a/src/widgets/dialogs/qfilesystemmodel.cpp +++ b/src/widgets/dialogs/qfilesystemmodel.cpp @@ -48,6 +48,8 @@ #include <qmessagebox.h> #include <qapplication.h> +#include <algorithm> + #ifdef Q_OS_WIN # include <QtCore/QVarLengthArray> # include <qt_windows.h> @@ -1081,15 +1083,35 @@ public: r->fileName, Qt::CaseInsensitive) < 0; } case 1: + { // Directories go first - if (l->isDir() && !r->isDir()) - return true; - return l->size() < r->size(); + bool left = l->isDir(); + bool right = r->isDir(); + if (left ^ right) + return left; + + qint64 sizeDifference = l->size() - r->size(); + if (sizeDifference == 0) + return QFileSystemModelPrivate::naturalCompare(l->fileName, r->fileName, Qt::CaseInsensitive) < 0; + + return sizeDifference < 0; + } case 2: - return l->type() < r->type(); + { + int compare = QString::localeAwareCompare(l->type(), r->type()); + if (compare == 0) + return QFileSystemModelPrivate::naturalCompare(l->fileName, r->fileName, Qt::CaseInsensitive) < 0; + + return compare < 0; + } case 3: + { + if (l->lastModified() == r->lastModified()) + return QFileSystemModelPrivate::naturalCompare(l->fileName, r->fileName, Qt::CaseInsensitive) < 0; + return l->lastModified() < r->lastModified(); } + } Q_ASSERT(false); return false; } @@ -1129,7 +1151,7 @@ void QFileSystemModelPrivate::sortChildren(int column, const QModelIndex &parent i++; } QFileSystemModelSorter ms(column); - qStableSort(values.begin(), values.end(), ms); + std::sort(values.begin(), values.end(), ms); // First update the new visible list indexNode->visibleChildren.clear(); //No more dirty item we reset our internal dirty index |