forked from qt-creator/qt-creator
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:
@@ -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());
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user