From bfcf546675ce0731708e65949be94a50455c89ab Mon Sep 17 00:00:00 2001 From: Artem Sokolovskii Date: Tue, 3 Sep 2024 11:20:26 +0200 Subject: [PATCH] Utils: Add DirsFirst filter processing in dirEntries Change-Id: I4211a38874095e4965180e7fd3bf5c8a54cd2f53 Reviewed-by: hjk --- src/libs/utils/filepath.cpp | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/libs/utils/filepath.cpp b/src/libs/utils/filepath.cpp index 799af8e0972..0613395f2e6 100644 --- a/src/libs/utils/filepath.cpp +++ b/src/libs/utils/filepath.cpp @@ -640,10 +640,31 @@ FilePaths FilePath::dirEntries(const FileFilter &filter, QDir::SortFlags sort) c // FIXME: Not all flags supported here. const QDir::SortFlags sortBy = (sort & QDir::SortByMask); + + using Predicate = std::function; + + std::function sortWithFolders = + [](FilePaths &result, Predicate predicate) { Utils::sort(result, predicate); }; + + if (sort & QDir::DirsFirst) { + sortWithFolders = [](FilePaths &result, Predicate predicate) { + Predicate folderFilter = [predicate](const FilePath &path1, const FilePath &path2) { + if (path1.isDir() && !path2.isDir()) + return true; + if (!path1.isDir() && path2.isDir()) + return false; + return predicate(path1, path2); + }; + Utils::sort(result, folderFilter); + }; + } + if (sortBy == QDir::Name) { - Utils::sort(result); + sortWithFolders(result, [](const FilePath &path1, const FilePath &path2) { + return path1.fileName() < path2.fileName(); + }); } else if (sortBy == QDir::Time) { - Utils::sort(result, [](const FilePath &path1, const FilePath &path2) { + sortWithFolders(result, [](const FilePath &path1, const FilePath &path2) { return path1.lastModified() < path2.lastModified(); }); }