diff --git a/include/FileSearchJob.h b/include/FileSearchJob.h index 673c8d87178..f279678670b 100644 --- a/include/FileSearchJob.h +++ b/include/FileSearchJob.h @@ -43,7 +43,7 @@ class FileSearchJob : public QObject QString filter; //! The filter to be tokenized. QStringList paths; //! The list of paths to search recursively through. QStringList extensions; //! The list of allowed extensions. - QFlags dirFilters; //! The directory filter flag. + bool hidden; //! Include hidden entries. }; //! Create a search job with the given @p parent (if any). @@ -74,6 +74,7 @@ class FileSearchJob : public QObject private: void runSearch(Task task); + bool validEntry(QString entry, QStringList tokens, QStringList extensions); std::future m_task; std::atomic_flag m_stop = ATOMIC_FLAG_INIT; }; diff --git a/src/gui/FileBrowser.cpp b/src/gui/FileBrowser.cpp index bd30d22d16d..8a00971bedf 100644 --- a/src/gui/FileBrowser.cpp +++ b/src/gui/FileBrowser.cpp @@ -229,13 +229,10 @@ void FileBrowser::onSearch(const QString& filter) if (m_showFactoryContent && !m_showFactoryContent->isChecked()) { directories.removeAll(m_factoryDir); } if (directories.isEmpty()) { return; } - auto directoryFilters = QDir::AllEntries | QDir::NoDotAndDotDot; - if (m_showHiddenContent) { directoryFilters |= QDir::Hidden; } - const auto searchTask = FileSearchJob::Task{.filter = filter, .paths = directories, .extensions = FileItem::defaultFilters().split(" "), - .dirFilters = directoryFilters}; + .hidden = m_showHiddenContent->isChecked()}; m_searchTreeWidget->clear(); m_searchTreeWidget->show(); diff --git a/src/gui/FileSearchJob.cpp b/src/gui/FileSearchJob.cpp index 5c0f501a240..76ba7dcd5b4 100644 --- a/src/gui/FileSearchJob.cpp +++ b/src/gui/FileSearchJob.cpp @@ -79,25 +79,33 @@ void FileSearchJob::runSearch(Task task) for (const auto& path : task.paths) { - auto dirIt = QDirIterator{path, task.dirFilters, - QDirIterator::IteratorFlag::Subdirectories | QDirIterator::IteratorFlag::FollowSymlinks}; + if (validEntry(path, tokens, task.extensions)) { emit foundMatch(path); } + auto searchFilters = QDir::AllEntries | QDir::NoDotAndDotDot; + if (task.hidden) { searchFilters |= QDir::Hidden; } + + auto dirIt = QDirIterator{path, searchFilters, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks}; while (dirIt.hasNext() && !m_stop.test(std::memory_order_relaxed)) { - const auto fileInfo = QFileInfo{dirIt.next()}; - const auto fileName = fileInfo.fileName(); - const auto containsToken = std::all_of(tokens.begin(), tokens.end(), - [&](const auto& token) { return fileName.contains(token, Qt::CaseInsensitive); }); - - const auto validDir = fileInfo.isDir() && containsToken; - const auto validFile = fileInfo.isFile() && containsToken - && task.extensions.contains(QString{"*.%1"}.arg(fileInfo.completeSuffix()), Qt::CaseInsensitive); - - if (validDir || validFile) { emit foundMatch(fileInfo.filePath()); } + if (validEntry(dirIt.next(), tokens, task.extensions)) { emit foundMatch(dirIt.filePath()); } } } emit finished(); } +bool FileSearchJob::validEntry(QString entry, QStringList tokens, QStringList extensions) +{ + const auto fileInfo = QFileInfo{entry}; + const auto fileName = fileInfo.fileName(); + const auto containsToken = std::all_of( + tokens.begin(), tokens.end(), [&](const auto& token) { return fileName.contains(token, Qt::CaseInsensitive); }); + + const auto validDir = fileInfo.isDir() && containsToken; + const auto validFile = fileInfo.isFile() && containsToken + && extensions.contains(QString{"*.%1"}.arg(fileInfo.completeSuffix()), Qt::CaseInsensitive); + + return validDir || validFile; +} + } // namespace lmms::gui