From f785b39238e8b1cc8240e53161ff18259bf8a4d3 Mon Sep 17 00:00:00 2001 From: saker Date: Tue, 4 Feb 2025 20:16:54 -0500 Subject: [PATCH] Use tokenization instead of searching for an entire substring in the file name --- src/gui/FileBrowser.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/gui/FileBrowser.cpp b/src/gui/FileBrowser.cpp index 802efb05fe1..3d1714e0236 100644 --- a/src/gui/FileBrowser.cpp +++ b/src/gui/FileBrowser.cpp @@ -230,7 +230,9 @@ void FileBrowser::onSearch(const QString& filter) auto directoryFilters = QDir::AllEntries | QDir::NoDotAndDotDot; if (m_showHiddenContent) { directoryFilters |= QDir::Hidden; } - s_currentSearchTask = ThreadPool::instance().enqueue([this, directories, directoryFilters, filter] { + const auto keywords = filter.split(" "); + + s_currentSearchTask = ThreadPool::instance().enqueue([this, directories, directoryFilters, keywords] { for (const auto& path : directories) { auto dirIt = QDirIterator{path, directoryFilters, QDirIterator::IteratorFlag::Subdirectories | QDirIterator::IteratorFlag::FollowSymlinks}; @@ -238,7 +240,11 @@ void FileBrowser::onSearch(const QString& filter) while (dirIt.hasNext() && !s_cancelSearch) { const auto fileInfo = QFileInfo{dirIt.next()}; - if (!fileInfo.fileName().contains(filter, Qt::CaseInsensitive)) { continue; } + const auto fileName = fileInfo.fileName(); + const auto containsAllKeywords = std::all_of(keywords.begin(), keywords.end(), + [&](const auto& keyword) { return fileName.contains(keyword, Qt::CaseInsensitive); }); + + if (!containsAllKeywords) { continue; } // A delay to avoid bogging down Qt's event loop as we find results. std::this_thread::sleep_for(s_delayBetweenResults);