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,7 +76,10 @@ QList<FileNode *> scanForFilesRecursively(
} // namespace Internal
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)
{
QSet<QString> visited;
@@ -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,8 +43,9 @@ 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);
@@ -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,11 +146,15 @@ 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 * {
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.

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;