ProjectExplorer: allow defining a dir filter in TreeScanner

This is going to be used to include hidden files in the result list of
the scanner.

Change-Id: I512465eba4c38c6d26107ae4022319f1c700b60c
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
David Schulz
2024-05-16 08:27:29 +02:00
parent 60f4822d5f
commit 79116f5557
3 changed files with 46 additions and 28 deletions

View File

@@ -14,11 +14,6 @@
#include <QPromise> #include <QPromise>
namespace ProjectExplorer { namespace ProjectExplorer {
template<typename Result>
QList<FileNode *> scanForFiles(QPromise<Result> &promise, const Utils::FilePath &directory,
const std::function<FileNode *(const Utils::FilePath &)> factory);
namespace Internal { namespace Internal {
template<typename Result> template<typename Result>
@@ -27,6 +22,7 @@ QList<FileNode *> scanForFilesRecursively(
double progressStart, double progressStart,
double progressRange, double progressRange,
const Utils::FilePath &directory, const Utils::FilePath &directory,
const QDir::Filters &filter,
const std::function<FileNode *(const Utils::FilePath &)> factory, const std::function<FileNode *(const Utils::FilePath &)> factory,
QSet<QString> &visited, QSet<QString> &visited,
const QList<Core::IVersionControl *> &versionControls) const QList<Core::IVersionControl *> &versionControls)
@@ -41,8 +37,7 @@ QList<FileNode *> scanForFilesRecursively(
if (visitedCount == visited.count()) if (visitedCount == visited.count())
return result; return result;
const QFileInfoList entries = baseDir.entryInfoList(QStringList(), const QFileInfoList entries = baseDir.entryInfoList(QStringList(), filter);
QDir::AllEntries | QDir::NoDotAndDotDot);
double progress = 0; double progress = 0;
const double progressIncrement = progressRange / static_cast<double>(entries.count()); const double progressIncrement = progressRange / static_cast<double>(entries.count());
int lastIntProgress = 0; int lastIntProgress = 0;
@@ -59,6 +54,7 @@ QList<FileNode *> scanForFilesRecursively(
progress, progress,
progressIncrement, progressIncrement,
entryName, entryName,
filter,
factory, factory,
visited, visited,
versionControls)); versionControls));
@@ -80,7 +76,10 @@ QList<FileNode *> scanForFilesRecursively(
} // namespace Internal } // namespace Internal
template<typename Result> template<typename Result>
QList<FileNode *> scanForFiles(QPromise<Result> &promise, const Utils::FilePath &directory, QList<FileNode *> scanForFiles(
QPromise<Result> &promise,
const Utils::FilePath &directory,
const QDir::Filters &filter,
const std::function<FileNode *(const Utils::FilePath &)> factory) const std::function<FileNode *(const Utils::FilePath &)> factory)
{ {
QSet<QString> visited; QSet<QString> visited;
@@ -89,6 +88,7 @@ QList<FileNode *> scanForFiles(QPromise<Result> &promise, const Utils::FilePath
0.0, 0.0,
1000000.0, 1000000.0,
directory, directory,
filter,
factory, factory,
visited, visited,
Core::VcsManager::versionControls()); Core::VcsManager::versionControls());

View File

@@ -43,8 +43,9 @@ bool TreeScanner::asyncScanForFiles(const Utils::FilePath &directory)
return false; return false;
m_scanFuture = Utils::asyncRun( m_scanFuture = Utils::asyncRun(
[directory, filter = m_filter, factory = m_factory] (Promise &promise) { [directory, filter = m_filter, dirFilter = m_dirFilter, factory = m_factory](
TreeScanner::scanForFiles(promise, directory, filter, factory); Promise &promise) {
TreeScanner::scanForFiles(promise, directory, filter, dirFilter, factory);
}); });
m_futureWatcher.setFuture(m_scanFuture); m_futureWatcher.setFuture(m_scanFuture);
@@ -57,6 +58,12 @@ void TreeScanner::setFilter(TreeScanner::FileFilter filter)
m_filter = filter; m_filter = filter;
} }
void TreeScanner::setDirFilter(QDir::Filters dirFilter)
{
if (isFinished())
m_dirFilter = dirFilter;
}
void TreeScanner::setTypeFactory(TreeScanner::FileTypeFactory factory) void TreeScanner::setTypeFactory(TreeScanner::FileTypeFactory factory)
{ {
if (isFinished()) if (isFinished())
@@ -139,11 +146,15 @@ static std::unique_ptr<FolderNode> createFolderNode(const Utils::FilePath &direc
return fileSystemNode; return fileSystemNode;
} }
void TreeScanner::scanForFiles(Promise &promise, const Utils::FilePath& directory, void TreeScanner::scanForFiles(
const FileFilter &filter, const FileTypeFactory &factory) Promise &promise,
const Utils::FilePath &directory,
const FileFilter &filter,
const QDir::Filters &dirFilter,
const FileTypeFactory &factory)
{ {
QList<FileNode *> nodes = ProjectExplorer::scanForFiles(promise, directory, QList<FileNode *> nodes = ProjectExplorer::scanForFiles(
[&filter, &factory](const Utils::FilePath &fn) -> FileNode * { promise, directory, dirFilter, [&filter, &factory](const Utils::FilePath &fn) -> FileNode * {
const Utils::MimeType mimeType = Utils::mimeTypeForFile(fn); const Utils::MimeType mimeType = Utils::mimeTypeForFile(fn);
// Skip some files during scan. // Skip some files during scan.

View File

@@ -45,6 +45,9 @@ public:
// Setup filter for ignored files // Setup filter for ignored files
void setFilter(FileFilter filter); void setFilter(FileFilter filter);
// Setup dir filters for scanned folders
void setDirFilter(QDir::Filters dirFilter);
// Setup factory for file types // Setup factory for file types
void setTypeFactory(FileTypeFactory factory); void setTypeFactory(FileTypeFactory factory);
@@ -69,11 +72,15 @@ signals:
void finished(); void finished();
private: private:
static void scanForFiles(Promise &fi, const Utils::FilePath &directory, static void scanForFiles(Promise &fi,
const FileFilter &filter, const FileTypeFactory &factory); const Utils::FilePath &directory,
const FileFilter &filter,
const QDir::Filters &dirFilter,
const FileTypeFactory &factory);
private: private:
FileFilter m_filter; FileFilter m_filter;
QDir::Filters m_dirFilter = QDir::AllEntries | QDir::NoDotAndDotDot;
FileTypeFactory m_factory; FileTypeFactory m_factory;
FutureWatcher m_futureWatcher; FutureWatcher m_futureWatcher;