-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Redesign file browser searching (LMMS#7130)
- Loading branch information
1 parent
0f2866a
commit fe7efa9
Showing
10 changed files
with
403 additions
and
326 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
/* | ||
* FileSearch.h - File system search task | ||
* | ||
* Copyright (c) 2024 saker | ||
* | ||
* This file is part of LMMS - https://lmms.io | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public | ||
* License as published by the Free Software Foundation; either | ||
* version 2 of the License, or (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public | ||
* License along with this program (see COPYING); if not, write to the | ||
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||
* Boston, MA 02110-1301 USA. | ||
* | ||
*/ | ||
|
||
#ifndef LMMS_FILE_SEARCH_H | ||
#define LMMS_FILE_SEARCH_H | ||
|
||
#include <QDir> | ||
#include <QObject> | ||
#include <atomic> | ||
|
||
namespace lmms { | ||
//! A Qt object that encapsulates the operation of searching the file system. | ||
class FileSearch : public QObject | ||
{ | ||
Q_OBJECT | ||
public: | ||
//! Number of milliseconds the search waits before signaling a matching result. | ||
static constexpr int MillisecondsBetweenResults = 1; | ||
|
||
//! Create a `FileSearch` object that uses the specified string filter `filter` and extension filters in | ||
//! `extensions` to search within the given `paths`. | ||
//! `excludedPaths`, `dirFilters`, and `sortFlags` can optionally be specified to exclude certain directories, filter | ||
//! out certain types of entries, and sort the matches. | ||
FileSearch(const QString& filter, const QStringList& paths, const QStringList& extensions, | ||
const QStringList& excludedPaths = {}, QDir::Filters dirFilters = QDir::Filters{}, | ||
QDir::SortFlags sortFlags = QDir::SortFlags{}); | ||
|
||
//! Execute the search, emitting the `foundResult` signal when matches are found. | ||
void operator()(); | ||
|
||
//! Cancel the search. | ||
void cancel(); | ||
|
||
signals: | ||
//! Emitted when a result is found when searching the file system. | ||
void foundMatch(FileSearch* search, const QString& match); | ||
|
||
//! Emitted when the search completes. | ||
void searchCompleted(FileSearch* search); | ||
|
||
private: | ||
static auto isPathExcluded(const QString& path) -> bool; | ||
QString m_filter; | ||
QStringList m_paths; | ||
QStringList m_extensions; | ||
QStringList m_excludedPaths; | ||
QDir::Filters m_dirFilters; | ||
QDir::SortFlags m_sortFlags; | ||
std::atomic<bool> m_cancel = false; | ||
}; | ||
} // namespace lmms | ||
#endif // LMMS_FILE_SEARCH_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
/* | ||
* ThreadPool.h | ||
* | ||
* Copyright (c) 2024 saker | ||
* | ||
* This file is part of LMMS - https://lmms.io | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public | ||
* License as published by the Free Software Foundation; either | ||
* version 2 of the License, or (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public | ||
* License along with this program (see COPYING); if not, write to the | ||
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||
* Boston, MA 02110-1301 USA. | ||
* | ||
*/ | ||
|
||
#ifndef LMMS_THREAD_POOL_H | ||
#define LMMS_THREAD_POOL_H | ||
|
||
#include <atomic> | ||
#include <queue> | ||
#include <tuple> | ||
#include <type_traits> | ||
#include <vector> | ||
|
||
#ifdef __MINGW32__ | ||
#include <mingw.condition_variable.h> | ||
#include <mingw.future.h> | ||
#include <mingw.mutex.h> | ||
#include <mingw.thread.h> | ||
#else | ||
#include <condition_variable> | ||
#include <future> | ||
#include <mutex> | ||
#include <thread> | ||
#endif | ||
|
||
namespace lmms { | ||
//! A thread pool that can be used for asynchronous processing. | ||
class ThreadPool | ||
{ | ||
public: | ||
//! Destroys the `ThreadPool` object. | ||
//! This blocks until all workers have finished executing. | ||
~ThreadPool(); | ||
|
||
//! Enqueue function `fn` with arguments `args` to be ran asynchronously. | ||
template <typename Fn, typename... Args> | ||
auto enqueue(Fn&& fn, Args&&... args) -> std::future<std::invoke_result_t<Fn, Args...>> | ||
{ | ||
using ReturnType = std::invoke_result_t<Fn, Args...>; | ||
|
||
auto promise = std::make_shared<std::promise<ReturnType>>(); | ||
auto task = [promise, fn = std::forward<Fn>(fn), args = std::make_tuple(std::forward<Args>(args)...)] | ||
{ | ||
if constexpr (!std::is_same_v<ReturnType, void>) | ||
{ | ||
promise->set_value(std::apply(fn, args)); | ||
return; | ||
} | ||
std::apply(fn, args); | ||
promise->set_value(); | ||
}; | ||
|
||
{ | ||
const auto lock = std::unique_lock{m_runMutex}; | ||
m_queue.push(std::move(task)); | ||
} | ||
|
||
m_runCond.notify_one(); | ||
return promise->get_future(); | ||
} | ||
|
||
//! Return the number of worker threads used. | ||
auto numWorkers() const -> size_t; | ||
|
||
//! Return the global `ThreadPool` instance. | ||
static auto instance() -> ThreadPool&; | ||
|
||
private: | ||
ThreadPool(size_t numWorkers); | ||
void run(); | ||
std::vector<std::thread> m_workers; | ||
std::queue<std::function<void()>> m_queue; | ||
std::atomic<bool> m_done = false; | ||
std::condition_variable m_runCond; | ||
std::mutex m_runMutex; | ||
inline static size_t s_numWorkers = std::thread::hardware_concurrency(); | ||
}; | ||
} // namespace lmms | ||
|
||
#endif // LMMS_THREAD_POOL_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.