diff options
| author | snowstormxd <214507868+snowstormxd@users.noreply.github.com> | 2026-11-01 20:56:44 +0000 |
|---|---|---|
| committer | snowstormxd <214507868+snowstormxd@users.noreply.github.com> | 2026-11-01 20:56:44 +0000 |
| commit | 021c9724371e45fa694c9ee3106b9011364d2853 (patch) | |
| tree | dcb89f363ebcc75ba99dba6ab6bc224b253c0255 /src | |
| parent | d5dd80ba30c51a8d5c80377546a7a212d0a65b3a (diff) | |
game_list: snapshot directory type before handing rows to the model
Flat-list mode deletes unused directory items as queued events are processed. Copy the directory type before queuing that handoff so the worker never reads a directory the GUI may have already deleted.
Assisted-by: Codex (review, implementation and automated validation)
Diffstat (limited to 'src')
| -rw-r--r-- | src/qt_common/game_list/worker.cpp | 11 | ||||
| -rw-r--r-- | src/qt_common/game_list/worker.h | 3 |
2 files changed, 8 insertions, 6 deletions
diff --git a/src/qt_common/game_list/worker.cpp b/src/qt_common/game_list/worker.cpp index 371f0e8e2d..533ba1beb4 100644 --- a/src/qt_common/game_list/worker.cpp +++ b/src/qt_common/game_list/worker.cpp @@ -343,7 +343,7 @@ void GameListWorker::RecordEvent(F&& func) { emit DataAvailable(); } -void GameListWorker::AddTitlesToGameList(GameListDir* parent_dir) { +void GameListWorker::AddTitlesToGameList(GameListDir* parent_dir, GameListItemType parent_type) { using namespace FileSys; const auto& cache = system.GetContentProviderUnion(); @@ -351,13 +351,13 @@ void GameListWorker::AddTitlesToGameList(GameListDir* parent_dir) { auto installed_games = cache.ListEntriesFilterOrigin(std::nullopt, TitleType::Application, ContentRecordType::Program); - if (parent_dir->type() == static_cast<int>(GameListItemType::SdmcDir)) { + if (parent_type == GameListItemType::SdmcDir) { installed_games = cache.ListEntriesFilterOrigin( ContentProviderUnionSlot::SDMC, TitleType::Application, ContentRecordType::Program); - } else if (parent_dir->type() == static_cast<int>(GameListItemType::UserNandDir)) { + } else if (parent_type == GameListItemType::UserNandDir) { installed_games = cache.ListEntriesFilterOrigin( ContentProviderUnionSlot::UserNAND, TitleType::Application, ContentRecordType::Program); - } else if (parent_dir->type() == static_cast<int>(GameListItemType::SysNandDir)) { + } else if (parent_type == GameListItemType::SysNandDir) { installed_games = cache.ListEntriesFilterOrigin( ContentProviderUnionSlot::SysNAND, TitleType::Application, ContentRecordType::Program); } @@ -547,6 +547,7 @@ void GameListWorker::run() { scan = true; } + const auto parent_type = static_cast<GameListItemType>(game_list_dir->type()); DirEntryReady(game_list_dir); if (scan) { const auto discovery = GameListDiscovery::Discover( @@ -566,7 +567,7 @@ void GameListWorker::run() { ScanFileSystem(ScanTarget::FillManualContentProvider, discovery.files, game_list_dir); ScanFileSystem(ScanTarget::PopulateGameList, discovery.files, game_list_dir); } else { - AddTitlesToGameList(game_list_dir); + AddTitlesToGameList(game_list_dir, parent_type); } } diff --git a/src/qt_common/game_list/worker.h b/src/qt_common/game_list/worker.h index d5bb5fbd7b..b627d9eb94 100644 --- a/src/qt_common/game_list/worker.h +++ b/src/qt_common/game_list/worker.h @@ -30,6 +30,7 @@ class System; class GameListDir; class GameListModel; class QStandardItem; +enum class GameListItemType; namespace FileSys { class NCA; @@ -75,7 +76,7 @@ private: void RecordEvent(F&& func); private: - void AddTitlesToGameList(GameListDir* parent_dir); + void AddTitlesToGameList(GameListDir* parent_dir, GameListItemType parent_type); enum class ScanTarget { FillManualContentProvider, |
