DolphinQt: Implement "Purge Game List Cache"

This is a missing feature from DolphinWX.
This commit is contained in:
JosJuice 2018-10-14 18:03:10 +02:00
parent 8d1e996f39
commit 8bbec31295
11 changed files with 41 additions and 3 deletions

View File

@ -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);

View File

@ -41,6 +41,8 @@ public:
void resizeEvent(QResizeEvent* event) override;
void PurgeCache();
signals:
void GameSelected();
void NetPlayHost(const QString& game_id);

View File

@ -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();
}

View File

@ -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;

View File

@ -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();
}

View File

@ -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<const UICommon::GameFile>& game);
@ -70,7 +71,8 @@ private:
RemoveDirectory,
UpdateDirectory,
UpdateFile,
UpdateMetadata
UpdateMetadata,
PurgeCache
};
struct Command

View File

@ -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,

View File

@ -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")));

View File

@ -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);

View File

@ -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();
}

View File

@ -24,13 +24,19 @@ std::vector<std::string> FindAllGamePaths(const std::vector<std::string>& 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<void(const std::shared_ptr<const GameFile>&)> f) const;
size_t GetSize() const;
void Clear();
void Clear(DeleteOnDisk delete_on_disk);
// Returns nullptr if the file is invalid.
std::shared_ptr<const GameFile> AddOrGet(const std::string& path, bool* cache_changed);