diff --git a/Source/Core/DolphinQt/GameList/GameList.cpp b/Source/Core/DolphinQt/GameList/GameList.cpp index 6dbe3e1211..b2e72ca43d 100644 --- a/Source/Core/DolphinQt/GameList/GameList.cpp +++ b/Source/Core/DolphinQt/GameList/GameList.cpp @@ -89,6 +89,11 @@ GameList::GameList(QWidget* parent) : QStackedWidget(parent) [this] { m_grid_proxy->invalidate(); }); } +void GameList::PurgeCache() +{ + m_model->PurgeCache(); +} + void GameList::MakeListView() { m_list = new QTableView(this); diff --git a/Source/Core/DolphinQt/GameList/GameList.h b/Source/Core/DolphinQt/GameList/GameList.h index dd2635ea4b..fac9932c3c 100644 --- a/Source/Core/DolphinQt/GameList/GameList.h +++ b/Source/Core/DolphinQt/GameList/GameList.h @@ -41,6 +41,8 @@ public: void resizeEvent(QResizeEvent* event) override; + void PurgeCache(); + signals: void GameSelected(); void NetPlayHost(const QString& game_id); diff --git a/Source/Core/DolphinQt/GameList/GameListModel.cpp b/Source/Core/DolphinQt/GameList/GameListModel.cpp index 17cd5a6334..4644a08ae3 100644 --- a/Source/Core/DolphinQt/GameList/GameListModel.cpp +++ b/Source/Core/DolphinQt/GameList/GameListModel.cpp @@ -362,3 +362,8 @@ void GameListModel::DeleteTag(const QString& name) Settings::GetQSettings().setValue(QStringLiteral("gamelist/tags"), m_tag_list); } + +void GameListModel::PurgeCache() +{ + m_tracker.PurgeCache(); +} diff --git a/Source/Core/DolphinQt/GameList/GameListModel.h b/Source/Core/DolphinQt/GameList/GameListModel.h index 9b7d06a421..7defb3f9cb 100644 --- a/Source/Core/DolphinQt/GameList/GameListModel.h +++ b/Source/Core/DolphinQt/GameList/GameListModel.h @@ -75,6 +75,8 @@ public: void NewTag(const QString& name); void DeleteTag(const QString& name); + void PurgeCache(); + private: // Index in m_games, or -1 if it isn't found int FindGame(const std::string& path) const; diff --git a/Source/Core/DolphinQt/GameList/GameTracker.cpp b/Source/Core/DolphinQt/GameList/GameTracker.cpp index 056bcf0e66..ea1b87e1fd 100644 --- a/Source/Core/DolphinQt/GameList/GameTracker.cpp +++ b/Source/Core/DolphinQt/GameList/GameTracker.cpp @@ -75,6 +75,9 @@ GameTracker::GameTracker(QObject* parent) : QFileSystemWatcher(parent) }); QueueOnObject(this, [this] { Settings::Instance().NotifyMetadataRefreshComplete(); }); break; + case CommandType::PurgeCache: + m_cache.Clear(UICommon::GameFileCache::DeleteOnDisk::Yes); + break; } }); @@ -322,3 +325,9 @@ void GameTracker::LoadGame(const QString& path) m_cache.Save(); } } + +void GameTracker::PurgeCache() +{ + m_load_thread.EmplaceItem(Command{CommandType::PurgeCache, {}}); + RefreshAll(); +} diff --git a/Source/Core/DolphinQt/GameList/GameTracker.h b/Source/Core/DolphinQt/GameList/GameTracker.h index d212d983a2..79a2678d33 100644 --- a/Source/Core/DolphinQt/GameList/GameTracker.h +++ b/Source/Core/DolphinQt/GameList/GameTracker.h @@ -41,6 +41,7 @@ public: void AddDirectory(const QString& dir); void RemoveDirectory(const QString& dir); void RefreshAll(); + void PurgeCache(); signals: void GameLoaded(const std::shared_ptr& game); @@ -70,7 +71,8 @@ private: RemoveDirectory, UpdateDirectory, UpdateFile, - UpdateMetadata + UpdateMetadata, + PurgeCache }; struct Command diff --git a/Source/Core/DolphinQt/MainWindow.cpp b/Source/Core/DolphinQt/MainWindow.cpp index 6330fb7fcf..3228cf357b 100644 --- a/Source/Core/DolphinQt/MainWindow.cpp +++ b/Source/Core/DolphinQt/MainWindow.cpp @@ -385,6 +385,7 @@ void MainWindow::ConnectMenuBar() // View connect(m_menu_bar, &MenuBar::ShowList, m_game_list, &GameList::SetListView); connect(m_menu_bar, &MenuBar::ShowGrid, m_game_list, &GameList::SetGridView); + connect(m_menu_bar, &MenuBar::PurgeGameListCache, m_game_list, &GameList::PurgeCache); connect(m_menu_bar, &MenuBar::ToggleSearch, m_search_bar, &SearchBar::Toggle); connect(m_menu_bar, &MenuBar::ColumnVisibilityToggled, m_game_list, diff --git a/Source/Core/DolphinQt/MenuBar.cpp b/Source/Core/DolphinQt/MenuBar.cpp index 7ea1b66d47..c26c2e0ad7 100644 --- a/Source/Core/DolphinQt/MenuBar.cpp +++ b/Source/Core/DolphinQt/MenuBar.cpp @@ -457,6 +457,8 @@ void MenuBar::AddViewMenu() AddShowPlatformsMenu(view_menu); AddShowRegionsMenu(view_menu); + view_menu->addSeparator(); + view_menu->addAction(tr("Purge Game List Cache"), this, &MenuBar::PurgeGameListCache); view_menu->addSeparator(); view_menu->addAction(tr("Search"), this, &MenuBar::ToggleSearch, QKeySequence(QStringLiteral("Ctrl+F"))); diff --git a/Source/Core/DolphinQt/MenuBar.h b/Source/Core/DolphinQt/MenuBar.h index 858b5c0fde..eedee4b6d5 100644 --- a/Source/Core/DolphinQt/MenuBar.h +++ b/Source/Core/DolphinQt/MenuBar.h @@ -90,6 +90,7 @@ signals: // View void ShowList(); void ShowGrid(); + void PurgeGameListCache(); void ToggleSearch(); void ColumnVisibilityToggled(const QString& row, bool visible); void GameListPlatformVisibilityToggled(const QString& row, bool visible); diff --git a/Source/Core/UICommon/GameFileCache.cpp b/Source/Core/UICommon/GameFileCache.cpp index 282dcd0ee8..7fa558d889 100644 --- a/Source/Core/UICommon/GameFileCache.cpp +++ b/Source/Core/UICommon/GameFileCache.cpp @@ -58,8 +58,11 @@ size_t GameFileCache::GetSize() const return m_cached_files.size(); } -void GameFileCache::Clear() +void GameFileCache::Clear(DeleteOnDisk delete_on_disk) { + if (delete_on_disk != DeleteOnDisk::No) + File::Delete(m_path); + m_cached_files.clear(); } diff --git a/Source/Core/UICommon/GameFileCache.h b/Source/Core/UICommon/GameFileCache.h index 197cceb547..2e09c6da16 100644 --- a/Source/Core/UICommon/GameFileCache.h +++ b/Source/Core/UICommon/GameFileCache.h @@ -24,13 +24,19 @@ std::vector FindAllGamePaths(const std::vector& direct class GameFileCache { public: + enum class DeleteOnDisk + { + No = 0, + Yes = 1, + }; + GameFileCache(); // Uses the default path explicit GameFileCache(std::string path); void ForEach(std::function&)> f) const; size_t GetSize() const; - void Clear(); + void Clear(DeleteOnDisk delete_on_disk); // Returns nullptr if the file is invalid. std::shared_ptr AddOrGet(const std::string& path, bool* cache_changed);