// Copyright 2018 yuzu emulator team // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #pragma once #include #include #include #include #include #include #include #include #include #include #include "common/common_types.h" #include "yuzu/compatibility_list.h" class QStandardItem; namespace FileSys { class NCA; class VfsFilesystem; } // namespace FileSys /** * Asynchronous worker object for populating the game list. * Communicates with other threads through Qt's signal/slot system. */ class GameListWorker : public QObject, public QRunnable { Q_OBJECT public: explicit GameListWorker(std::shared_ptr vfs, FileSys::ManualContentProvider* provider, QVector& game_dirs, const CompatibilityList& compatibility_list); ~GameListWorker() override; /// Starts the processing of directory tree information. void run() override; /// Tells the worker that it should no longer continue processing. Thread-safe. void Cancel(); signals: /** * The `EntryReady` signal is emitted once an entry has been prepared and is ready * to be added to the game list. * @param entry_items a list with `QStandardItem`s that make up the columns of the new * entry. */ void DirEntryReady(GameListDir* entry_items); void EntryReady(QList entry_items, GameListDir* parent_dir); /** * After the worker has traversed the game directory looking for entries, this signal is * emitted with a list of folders that should be watched for changes as well. */ void Finished(QStringList watch_list); private: void AddTitlesToGameList(GameListDir* parent_dir); enum class ScanTarget { FillManualContentProvider, PopulateGameList, }; void ScanFileSystem(ScanTarget target, const std::string& dir_path, bool deep_scan, GameListDir* parent_dir); std::shared_ptr vfs; FileSys::ManualContentProvider* provider; QVector& game_dirs; const CompatibilityList& compatibility_list; QStringList watch_list; std::atomic_bool stop_processing; };