Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion include/FileSearchJob.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<QDir::Filter> dirFilters; //! The directory filter flag.
bool hidden; //! Include hidden entries.
};

//! Create a search job with the given @p parent (if any).
Expand Down Expand Up @@ -74,6 +74,7 @@ class FileSearchJob : public QObject

private:
void runSearch(Task task);
bool validEntry(QString entry, QStringList tokens, QStringList extensions);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
bool validEntry(QString entry, QStringList tokens, QStringList extensions);
bool validEntry(const QString& entry, const QStringList& tokens, const QStringList& extensions);

std::future<void> m_task;
std::atomic_flag m_stop = ATOMIC_FLAG_INIT;
};
Expand Down
5 changes: 1 addition & 4 deletions src/gui/FileBrowser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
32 changes: 20 additions & 12 deletions src/gui/FileSearchJob.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Comment thread
bratpeki marked this conversation as resolved.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
bool FileSearchJob::validEntry(QString entry, QStringList tokens, QStringList extensions)
bool FileSearchJob::validEntry(const QString& entry, const QStringList& tokens, const 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
Loading