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>
|
#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,8 +76,11 @@ 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(
|
||||||
const std::function<FileNode *(const Utils::FilePath &)> factory)
|
QPromise<Result> &promise,
|
||||||
|
const Utils::FilePath &directory,
|
||||||
|
const QDir::Filters &filter,
|
||||||
|
const std::function<FileNode *(const Utils::FilePath &)> factory)
|
||||||
{
|
{
|
||||||
QSet<QString> visited;
|
QSet<QString> visited;
|
||||||
promise.setProgressRange(0, 1000000);
|
promise.setProgressRange(0, 1000000);
|
||||||
@@ -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());
|
||||||
|
@@ -43,9 +43,10 @@ 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);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -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,24 +146,28 @@ 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.
|
||||||
if (filter && filter(mimeType, fn))
|
if (filter && filter(mimeType, fn))
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
// Type detection
|
// Type detection
|
||||||
FileType type = FileType::Unknown;
|
FileType type = FileType::Unknown;
|
||||||
if (factory)
|
if (factory)
|
||||||
type = factory(mimeType, fn);
|
type = factory(mimeType, fn);
|
||||||
|
|
||||||
return new FileNode(fn, type);
|
return new FileNode(fn, type);
|
||||||
});
|
});
|
||||||
|
|
||||||
Utils::sort(nodes, ProjectExplorer::Node::sortByPath);
|
Utils::sort(nodes, ProjectExplorer::Node::sortByPath);
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user