aboutsummaryrefslogtreecommitdiff
path: root/src/qt_common/game_list/worker.cpp
diff options
context:
space:
mode:
authorsnowstormxd <214507868+snowstormxd@users.noreply.github.com>2026-11-01 20:56:44 +0000
committersnowstormxd <214507868+snowstormxd@users.noreply.github.com>2026-11-01 20:56:44 +0000
commit021c9724371e45fa694c9ee3106b9011364d2853 (patch)
treedcb89f363ebcc75ba99dba6ab6bc224b253c0255 /src/qt_common/game_list/worker.cpp
parentd5dd80ba30c51a8d5c80377546a7a212d0a65b3a (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/qt_common/game_list/worker.cpp')
-rw-r--r--src/qt_common/game_list/worker.cpp11
1 files changed, 6 insertions, 5 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);
}
}