diff options
author | hjk <[email protected]> | 2022-01-21 13:11:39 +0100 |
---|---|---|
committer | hjk <[email protected]> | 2022-02-15 08:57:19 +0000 |
commit | f7a585fad9bcb8e1ce305c18cbbe1508b5f9f844 (patch) | |
tree | b2e0df9c91d061351c9f78f3cd4a2e2de65734ec /src/libs | |
parent | 4fb3eb8fd516bed168eb9d2a4c19196b4bee89ce (diff) |
FileUtils: Add some helper to handle ls-style output
Unix-ish device implementations would otherwise repeat that code.
Change-Id: I1265fe1a69e55409ab2875d0b6f6113ec92edd79
Reviewed-by: Eike Ziller <[email protected]>
Diffstat (limited to 'src/libs')
-rw-r--r-- | src/libs/utils/fileutils.cpp | 38 | ||||
-rw-r--r-- | src/libs/utils/fileutils.h | 6 |
2 files changed, 44 insertions, 0 deletions
diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 60a2d6e62fa..e0e207a9b22 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -42,6 +42,7 @@ #ifdef QT_GUI_LIB #include <QMessageBox> +#include <QRegularExpression> #endif #ifdef Q_OS_WIN @@ -493,6 +494,43 @@ FilePaths FileUtils::getOpenFilePaths(QWidget *parent, options); return transform(result, &FilePath::fromString); } + +// Used on 'ls' output on unix-like systems. +void FileUtils::iterateLsOutput(const FilePath &base, + const QStringList &entries, + const FileFilter &filter, + const std::function<bool (const FilePath &)> &callBack) +{ + QTC_CHECK(filter.iteratorFlags != QDirIterator::NoIteratorFlags); // FIXME: Not supported yet below. + + const QList<QRegularExpression> nameRegexps = + transform(filter.nameFilters, [](const QString &filter) { + QRegularExpression re; + re.setPattern(QRegularExpression::wildcardToRegularExpression(filter)); + QTC_CHECK(re.isValid()); + return re; + }); + + const auto nameMatches = [&nameRegexps](const QString &fileName) { + for (const QRegularExpression &re : nameRegexps) { + const QRegularExpressionMatch match = re.match(fileName); + if (match.hasMatch()) + return true; + } + return nameRegexps.isEmpty(); + }; + + // FIXME: Handle filters. For now bark on unsupported options. + QTC_CHECK(filter.fileFilters == QDir::NoFilter); + + for (const QString &entry : entries) { + if (!nameMatches(entry)) + continue; + if (!callBack(base.pathAppended(entry))) + break; + } +} + #endif // QT_WIDGETS_LIB } // namespace Utils diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 163e762e511..f76b621c484 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -144,6 +144,11 @@ public: static void setDeviceFileHooks(const DeviceFileHooks &hooks); + static void iterateLsOutput(const FilePath &base, + const QStringList &entries, + const FileFilter &filter, + const std::function<bool(const FilePath &)> &callBack); + #ifdef QT_WIDGETS_LIB static void setDialogParentGetter(const std::function<QWidget *()> &getter); @@ -173,6 +178,7 @@ public: QString *selectedFilter = nullptr, QFileDialog::Options options = {}); #endif + }; template<typename T> |