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

View File

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

View File

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