diff --git a/src/plugins/projectexplorer/projectnodeshelper.h b/src/plugins/projectexplorer/projectnodeshelper.h index bcb5454fd89..e207b5c46fb 100644 --- a/src/plugins/projectexplorer/projectnodeshelper.h +++ b/src/plugins/projectexplorer/projectnodeshelper.h @@ -14,11 +14,6 @@ #include namespace ProjectExplorer { - -template -QList scanForFiles(QPromise &promise, const Utils::FilePath &directory, - const std::function factory); - namespace Internal { template @@ -27,6 +22,7 @@ QList scanForFilesRecursively( double progressStart, double progressRange, const Utils::FilePath &directory, + const QDir::Filters &filter, const std::function factory, QSet &visited, const QList &versionControls) @@ -41,8 +37,7 @@ QList 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(entries.count()); int lastIntProgress = 0; @@ -59,6 +54,7 @@ QList scanForFilesRecursively( progress, progressIncrement, entryName, + filter, factory, visited, versionControls)); @@ -80,8 +76,11 @@ QList scanForFilesRecursively( } // namespace Internal template -QList scanForFiles(QPromise &promise, const Utils::FilePath &directory, - const std::function factory) +QList scanForFiles( + QPromise &promise, + const Utils::FilePath &directory, + const QDir::Filters &filter, + const std::function factory) { QSet visited; promise.setProgressRange(0, 1000000); @@ -89,6 +88,7 @@ QList scanForFiles(QPromise &promise, const Utils::FilePath 0.0, 1000000.0, directory, + filter, factory, visited, Core::VcsManager::versionControls()); diff --git a/src/plugins/projectexplorer/treescanner.cpp b/src/plugins/projectexplorer/treescanner.cpp index 1eefc3baf42..dac83598fb7 100644 --- a/src/plugins/projectexplorer/treescanner.cpp +++ b/src/plugins/projectexplorer/treescanner.cpp @@ -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 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 nodes = ProjectExplorer::scanForFiles(promise, directory, - [&filter, &factory](const Utils::FilePath &fn) -> FileNode * { - const Utils::MimeType mimeType = Utils::mimeTypeForFile(fn); + QList 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); diff --git a/src/plugins/projectexplorer/treescanner.h b/src/plugins/projectexplorer/treescanner.h index f8d019121b9..6de26e399ad 100644 --- a/src/plugins/projectexplorer/treescanner.h +++ b/src/plugins/projectexplorer/treescanner.h @@ -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;