Host: Add game list refresh/cancel calls

This commit is contained in:
Connor McLaughlin 2022-05-15 18:16:24 +10:00 committed by lightningterror
parent f260a8be66
commit 22bf3549b6
9 changed files with 82 additions and 7 deletions

View File

@ -905,6 +905,41 @@ void Host::RunOnCPUThread(std::function<void()> function, bool block /* = false
Q_ARG(const std::function<void()>&, std::move(function))); Q_ARG(const std::function<void()>&, std::move(function)));
} }
void Host::RefreshGameListAsync(bool invalidate_cache)
{
QMetaObject::invokeMethod(g_main_window, "refreshGameList", Qt::QueuedConnection,
Q_ARG(bool, invalidate_cache));
}
void Host::CancelGameListRefresh()
{
QMetaObject::invokeMethod(g_main_window, "cancelGameListRefresh", Qt::BlockingQueuedConnection);
}
void Host::RequestExit(bool save_state_if_running)
{
if (VMManager::HasValidVM())
g_emu_thread->shutdownVM(save_state_if_running);
QMetaObject::invokeMethod(g_main_window, "requestExit", Qt::QueuedConnection);
}
void Host::RequestVMShutdown(bool save_state)
{
if (VMManager::HasValidVM())
g_emu_thread->shutdownVM(save_state);
}
bool Host::IsFullscreen()
{
return g_emu_thread->isFullscreen();
}
void Host::SetFullscreen(bool enabled)
{
g_emu_thread->setFullscreen(enabled);
}
alignas(16) static SysMtgsThread s_mtgs_thread; alignas(16) static SysMtgsThread s_mtgs_thread;
SysMtgsThread& GetMTGS() SysMtgsThread& GetMTGS()

View File

@ -42,6 +42,7 @@ public:
static void stop(); static void stop();
__fi QEventLoop* getEventLoop() const { return m_event_loop; } __fi QEventLoop* getEventLoop() const { return m_event_loop; }
__fi bool isFullscreen() const { return m_is_fullscreen; }
bool isOnEmuThread() const; bool isOnEmuThread() const;

View File

@ -163,13 +163,7 @@ bool GameListWidget::getShowGridCoverTitles() const
void GameListWidget::refresh(bool invalidate_cache) void GameListWidget::refresh(bool invalidate_cache)
{ {
if (m_refresh_thread) cancelRefresh();
{
m_refresh_thread->cancel();
m_refresh_thread->wait();
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
pxAssertRel(!m_refresh_thread, "Game list thread should be unreferenced by now");
}
m_refresh_thread = new GameListRefreshThread(invalidate_cache); m_refresh_thread = new GameListRefreshThread(invalidate_cache);
connect(m_refresh_thread, &GameListRefreshThread::refreshProgress, this, &GameListWidget::onRefreshProgress, connect(m_refresh_thread, &GameListRefreshThread::refreshProgress, this, &GameListWidget::onRefreshProgress,
@ -179,6 +173,17 @@ void GameListWidget::refresh(bool invalidate_cache)
m_refresh_thread->start(); m_refresh_thread->start();
} }
void GameListWidget::cancelRefresh()
{
if (!m_refresh_thread)
return;
m_refresh_thread->cancel();
m_refresh_thread->wait();
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
pxAssertRel(!m_refresh_thread, "Game list thread should be unreferenced by now");
}
void GameListWidget::onRefreshProgress(const QString& status, int current, int total) void GameListWidget::onRefreshProgress(const QString& status, int current, int total)
{ {
// switch away from the placeholder while we scan, in case we find anything // switch away from the placeholder while we scan, in case we find anything

View File

@ -54,6 +54,7 @@ public:
void initialize(); void initialize();
void refresh(bool invalidate_cache); void refresh(bool invalidate_cache);
void cancelRefresh();
bool isShowingGameList() const; bool isShowingGameList() const;
bool isShowingGameGrid() const; bool isShowingGameGrid() const;

View File

@ -731,6 +731,11 @@ void MainWindow::refreshGameList(bool invalidate_cache)
m_game_list_widget->refresh(invalidate_cache); m_game_list_widget->refresh(invalidate_cache);
} }
void MainWindow::cancelGameListRefresh()
{
m_game_list_widget->cancelRefresh();
}
void MainWindow::invalidateSaveStateCache() void MainWindow::invalidateSaveStateCache()
{ {
m_save_states_invalidated = true; m_save_states_invalidated = true;

View File

@ -87,6 +87,7 @@ public:
public Q_SLOTS: public Q_SLOTS:
void checkForUpdates(bool display_message); void checkForUpdates(bool display_message);
void refreshGameList(bool invalidate_cache); void refreshGameList(bool invalidate_cache);
void cancelGameListRefresh();
void invalidateSaveStateCache(); void invalidateSaveStateCache();
void reportError(const QString& title, const QString& message); void reportError(const QString& title, const QString& message);
void runOnUIThread(const std::function<void()>& func); void runOnUIThread(const std::function<void()>& func);

View File

@ -116,6 +116,11 @@ std::vector<std::string> Host::GetStringListSetting(const char* section, const c
return s_layered_settings_interface.GetStringList(section, key); return s_layered_settings_interface.GetStringList(section, key);
} }
SettingsInterface* Host::Internal::GetBaseSettingsLayer()
{
return s_layered_settings_interface.GetLayer(LayeredSettingsInterface::LAYER_BASE);
}
void Host::Internal::SetBaseSettingsLayer(SettingsInterface* sif) void Host::Internal::SetBaseSettingsLayer(SettingsInterface* sif)
{ {
pxAssertRel(s_layered_settings_interface.GetLayer(LayeredSettingsInterface::LAYER_BASE) == nullptr, "Base layer has not been set"); pxAssertRel(s_layered_settings_interface.GetLayer(LayeredSettingsInterface::LAYER_BASE) == nullptr, "Base layer has not been set");

View File

@ -47,6 +47,9 @@ namespace Host
namespace Internal namespace Internal
{ {
/// Retrieves the base settings layer. Must call with lock held.
SettingsInterface* GetBaseSettingsLayer();
/// Sets the base settings layer. Should be called by the host at initialization time. /// Sets the base settings layer. Should be called by the host at initialization time.
void SetBaseSettingsLayer(SettingsInterface* sif); void SetBaseSettingsLayer(SettingsInterface* sif);

View File

@ -211,4 +211,23 @@ namespace Host
/// Safely executes a function on the VM thread. /// Safely executes a function on the VM thread.
void RunOnCPUThread(std::function<void()> function, bool block = false); void RunOnCPUThread(std::function<void()> function, bool block = false);
/// Asynchronously starts refreshing the game list.
void RefreshGameListAsync(bool invalidate_cache);
/// Cancels game list refresh, if there is one in progress.
void CancelGameListRefresh();
/// Requests shut down and exit of the hosting application. This may not actually exit,
/// if the user cancels the shutdown confirmation.
void RequestExit(bool save_state_if_running);
/// Requests shut down of the current virtual machine.
void RequestVMShutdown(bool save_state);
/// Returns true if the hosting application is currently fullscreen.
bool IsFullscreen();
/// Alters fullscreen state of hosting application.
void SetFullscreen(bool enabled);
} }