mirror of
https://github.com/stenzek/duckstation.git
synced 2026-02-04 05:04:33 +00:00
Achievements: Add progress to progress database refresh
That way there's some indication in the UI that the operation is happening.
This commit is contained in:
@@ -2704,12 +2704,11 @@ void Achievements::FinishRefreshHashDatabase()
|
||||
|
||||
// update game list, we might have some new games that weren't in the seed database
|
||||
GameList::UpdateAllAchievementData();
|
||||
|
||||
Host::OnAchievementsAllProgressRefreshed();
|
||||
}
|
||||
|
||||
bool Achievements::RefreshAllProgressDatabase(Error* error)
|
||||
bool Achievements::RefreshAllProgressDatabase(ProgressCallback* progress, Error* error)
|
||||
{
|
||||
auto lock = GetLock();
|
||||
if (!IsLoggedIn())
|
||||
{
|
||||
Error::SetStringView(error, TRANSLATE_SV("Achievements", "User is not logged in."));
|
||||
@@ -2723,8 +2722,15 @@ bool Achievements::RefreshAllProgressDatabase(Error* error)
|
||||
}
|
||||
|
||||
// refresh in progress
|
||||
progress->SetStatusText(TRANSLATE_SV("Achievements", "Refreshing achievement progress..."));
|
||||
progress->SetProgressRange(0);
|
||||
progress->SetProgressValue(0);
|
||||
|
||||
std::pair<bool, Error*> result = {false, error};
|
||||
s_state.refresh_all_progress_request = rc_client_begin_fetch_all_user_progress(s_state.client, RC_CONSOLE_PLAYSTATION,
|
||||
RefreshAllProgressCallback, nullptr);
|
||||
RefreshAllProgressCallback, &result);
|
||||
while (s_state.refresh_all_progress_request)
|
||||
WaitForHTTPRequestsWithYield(lock);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -2735,11 +2741,16 @@ void Achievements::RefreshAllProgressCallback(int result, const char* error_mess
|
||||
{
|
||||
s_state.refresh_all_progress_request = nullptr;
|
||||
|
||||
std::pair<bool, Error*>* result_ud = static_cast<std::pair<bool, Error*>*>(callback_userdata);
|
||||
if (result != RC_OK)
|
||||
{
|
||||
Host::ReportErrorAsync(TRANSLATE_SV("Achievements", "Error"),
|
||||
fmt::format("{}: {}\n{}", TRANSLATE_SV("Achievements", "Refresh all progress failed"),
|
||||
rc_error_str(result), error_message));
|
||||
if (result_ud)
|
||||
{
|
||||
result_ud->first = false;
|
||||
result_ud->second->SetStringFmt("{}: {}\n{}", TRANSLATE_SV("Achievements", "Refresh all progress failed"),
|
||||
rc_error_str(result), error_message);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2748,10 +2759,8 @@ void Achievements::RefreshAllProgressCallback(int result, const char* error_mess
|
||||
|
||||
GameList::UpdateAllAchievementData();
|
||||
|
||||
Host::OnAchievementsAllProgressRefreshed();
|
||||
|
||||
FullscreenUI::ShowToast(OSDMessageType::Quick, {},
|
||||
TRANSLATE_STR("Achievements", "Updated achievement progress database."));
|
||||
if (result_ud)
|
||||
result_ud->first = true;
|
||||
}
|
||||
|
||||
void Achievements::BuildHashDatabase(const rc_client_hash_library_t* hashlib,
|
||||
|
||||
@@ -81,7 +81,7 @@ void UpdateSettings(const Settings& old_config);
|
||||
void Shutdown();
|
||||
|
||||
/// Call to refresh the all-progress database.
|
||||
bool RefreshAllProgressDatabase(Error* error);
|
||||
bool RefreshAllProgressDatabase(ProgressCallback* progress, Error* error);
|
||||
|
||||
/// Called when the system is start. Engages hardcore mode if enabled.
|
||||
void OnSystemStarting(CDImage* image, bool disable_hardcore_mode);
|
||||
@@ -219,9 +219,6 @@ void OnAchievementsActiveChanged(bool active);
|
||||
/// Called whenever hardcore mode is toggled.
|
||||
void OnAchievementsHardcoreModeChanged(bool enabled);
|
||||
|
||||
/// Called whenever all progress is manually refreshed and completed.
|
||||
void OnAchievementsAllProgressRefreshed();
|
||||
|
||||
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
|
||||
|
||||
/// Called when the RAIntegration menu changes.
|
||||
|
||||
@@ -98,6 +98,7 @@ static void DrawPatchesOrCheatsSettingsPage(bool cheats);
|
||||
|
||||
static void DrawCoverDownloaderWindow();
|
||||
static void DrawAchievementsLoginWindow();
|
||||
static void StartAchievementsProgressRefresh();
|
||||
static void StartAchievementsGameIconDownload();
|
||||
|
||||
static bool ShouldShowAdvancedSettings();
|
||||
@@ -4773,14 +4774,12 @@ void FullscreenUI::DrawAchievementsSettingsPage(std::unique_lock<std::mutex>& se
|
||||
|
||||
if (!IsEditingGameSettings(bsi))
|
||||
{
|
||||
if (MenuButton(FSUI_ICONVSTR(ICON_FA_ARROWS_ROTATE, "Update Progress"),
|
||||
MenuHeading(FSUI_VSTR("Operations"));
|
||||
|
||||
if (MenuButton(FSUI_ICONVSTR(ICON_FA_ARROWS_ROTATE, "Refresh Achievement Progress"),
|
||||
FSUI_VSTR("Updates the progress database for achievements shown in the game list.")))
|
||||
{
|
||||
Host::RunOnCPUThread([]() {
|
||||
Error error;
|
||||
if (!Achievements::RefreshAllProgressDatabase(&error))
|
||||
ShowToast(OSDMessageType::Error, FSUI_STR("Failed to update progress database"), error.TakeDescription());
|
||||
});
|
||||
StartAchievementsProgressRefresh();
|
||||
}
|
||||
|
||||
if (MenuButton(FSUI_ICONVSTR(ICON_FA_DOWNLOAD, "Download Game Icons"),
|
||||
@@ -4915,6 +4914,25 @@ void FullscreenUI::DrawAchievementsLoginWindow()
|
||||
EndFixedPopupDialog();
|
||||
}
|
||||
|
||||
void FullscreenUI::StartAchievementsProgressRefresh()
|
||||
{
|
||||
auto progress = OpenModalProgressDialog(FSUI_STR("Refresh Achievement Progress"));
|
||||
|
||||
System::QueueAsyncTask([progress = progress.release()]() {
|
||||
Error error;
|
||||
const bool result = Achievements::RefreshAllProgressDatabase(progress, &error);
|
||||
Host::RunOnCPUThread([error = std::move(error), progress, result]() mutable {
|
||||
GPUThread::RunOnThread([error = std::move(error), progress, result]() mutable {
|
||||
delete progress;
|
||||
if (result)
|
||||
ShowToast(OSDMessageType::Info, {}, FSUI_STR("Progress database updated."));
|
||||
else
|
||||
FullscreenUI::OpenInfoMessageDialog(FSUI_STR("Update Progress"), error.TakeDescription());
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
void FullscreenUI::StartAchievementsGameIconDownload()
|
||||
{
|
||||
auto progress = OpenModalProgressDialog(FSUI_STR("Download Game Icons"));
|
||||
|
||||
@@ -350,7 +350,6 @@ TRANSLATE_NOOP("FullscreenUI", "Failed to delete {}.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Failed to load '{}'.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Failed to load shader {}. It may be invalid.\nError was:");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Failed to save controller preset '{}'.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Failed to update progress database");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Fast Boot");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Fast Forward Boot");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Fast Forward Memory Card Access");
|
||||
@@ -553,6 +552,7 @@ TRANSLATE_NOOP("FullscreenUI", "Pressure");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Prevents the emulator from producing any audible sound.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Prevents the screen saver from activating and the host from sleeping while emulation is running.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Progress Indicators");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Progress database updated.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Provides vibration and LED control support over Bluetooth.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Purple Rain");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Push a controller button or axis now.");
|
||||
@@ -567,6 +567,7 @@ TRANSLATE_NOOP("FullscreenUI", "Reduces hitches in emulation by reading/decompre
|
||||
TRANSLATE_NOOP("FullscreenUI", "Reduces input latency by delaying the start of frame until closer to the presentation time.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Reduces polygon Z-fighting through depth testing. Low compatibility with games.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Reduces the size of save states by compressing the data before saving.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Refresh Achievement Progress");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Region");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Region: ");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Release Date: ");
|
||||
|
||||
@@ -1105,11 +1105,6 @@ void Host::OnAchievementsHardcoreModeChanged(bool enabled)
|
||||
// noop
|
||||
}
|
||||
|
||||
void Host::OnAchievementsAllProgressRefreshed()
|
||||
{
|
||||
// noop
|
||||
}
|
||||
|
||||
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
|
||||
|
||||
void Host::OnRAIntegrationMenuChanged()
|
||||
|
||||
@@ -96,7 +96,7 @@ AchievementSettingsWidget::AchievementSettingsWidget(SettingsWindow* dialog, QWi
|
||||
{
|
||||
connect(m_ui.loginButton, &QPushButton::clicked, this, &AchievementSettingsWidget::onLoginLogoutPressed);
|
||||
connect(m_ui.viewProfile, &QPushButton::clicked, this, &AchievementSettingsWidget::onViewProfilePressed);
|
||||
connect(m_ui.refreshProgress, &QPushButton::clicked, g_emu_thread, &EmuThread::refreshAchievementsAllProgress);
|
||||
connect(m_ui.refreshProgress, &QPushButton::clicked, g_main_window, &MainWindow::refreshAchievementProgress);
|
||||
connect(g_emu_thread, &EmuThread::achievementsRefreshed, this, &AchievementSettingsWidget::onAchievementsRefreshed);
|
||||
updateLoginState();
|
||||
|
||||
|
||||
@@ -2480,8 +2480,8 @@ void MainWindow::connectSignals()
|
||||
connect(m_ui.actionCoverDownloader, &QAction::triggered, this, &MainWindow::onToolsCoverDownloaderTriggered);
|
||||
connect(m_ui.actionToolsDownloadAchievementGameIcons, &QAction::triggered, this,
|
||||
&MainWindow::onToolsDownloadAchievementGameIconsTriggered);
|
||||
connect(m_ui.actionToolsRefreshAchievementProgress, &QAction::triggered, g_emu_thread,
|
||||
&EmuThread::refreshAchievementsAllProgress);
|
||||
connect(m_ui.actionToolsRefreshAchievementProgress, &QAction::triggered, g_main_window,
|
||||
&MainWindow::refreshAchievementProgress);
|
||||
connect(m_ui.actionMediaCapture, &QAction::triggered, this, &MainWindow::onToolsMediaCaptureTriggered);
|
||||
connect(m_ui.actionCaptureGPUFrame, &QAction::triggered, g_emu_thread, &EmuThread::captureGPUFrameDump);
|
||||
connect(m_ui.actionCPUDebugger, &QAction::triggered, this, &MainWindow::openCPUDebugger);
|
||||
@@ -2535,8 +2535,6 @@ void MainWindow::connectSignals()
|
||||
connect(g_emu_thread, &EmuThread::achievementsActiveChanged, this, &MainWindow::onAchievementsActiveChanged);
|
||||
connect(g_emu_thread, &EmuThread::achievementsHardcoreModeChanged, this,
|
||||
&MainWindow::onAchievementsHardcoreModeChanged);
|
||||
connect(g_emu_thread, &EmuThread::achievementsAllProgressRefreshed, this,
|
||||
&MainWindow::onAchievementsAllProgressRefreshed);
|
||||
connect(g_emu_thread, &EmuThread::onCreateAuxiliaryRenderWindow, this, &MainWindow::onCreateAuxiliaryRenderWindow,
|
||||
Qt::BlockingQueuedConnection);
|
||||
connect(g_emu_thread, &EmuThread::onDestroyAuxiliaryRenderWindow, this, &MainWindow::onDestroyAuxiliaryRenderWindow,
|
||||
@@ -3231,11 +3229,6 @@ void MainWindow::onAchievementsHardcoreModeChanged(bool enabled)
|
||||
updateEmulationActions();
|
||||
}
|
||||
|
||||
void MainWindow::onAchievementsAllProgressRefreshed()
|
||||
{
|
||||
m_ui.statusBar->showMessage(tr("RA: Updated achievement progress database."));
|
||||
}
|
||||
|
||||
bool MainWindow::onCreateAuxiliaryRenderWindow(RenderAPI render_api, qint32 x, qint32 y, quint32 width, quint32 height,
|
||||
const QString& title, const QString& icon_name,
|
||||
Host::AuxiliaryRenderWindowUserData userdata,
|
||||
@@ -3309,6 +3302,25 @@ void MainWindow::onToolsDownloadAchievementGameIconsTriggered()
|
||||
});
|
||||
}
|
||||
|
||||
void MainWindow::refreshAchievementProgress()
|
||||
{
|
||||
QtAsyncTaskWithProgressDialog::create(
|
||||
this, TRANSLATE_STR("MainWindow", "Refresh Achievement Progress"), {}, true, 0, 0, 0.0f,
|
||||
[](ProgressCallback* progress) {
|
||||
Error error;
|
||||
const bool result = Achievements::RefreshAllProgressDatabase(progress, &error);
|
||||
return [error = std::move(error), result]() {
|
||||
if (!result)
|
||||
{
|
||||
g_main_window->reportError(tr("Error"), QString::fromStdString(error.GetDescription()));
|
||||
}
|
||||
|
||||
g_main_window->m_ui.statusBar->showMessage(tr("RA: Updated achievement progress database."));
|
||||
g_main_window->refreshGameListModel();
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
void MainWindow::onToolsMediaCaptureTriggered(bool checked)
|
||||
{
|
||||
if (!s_locals.system_valid)
|
||||
|
||||
@@ -125,6 +125,7 @@ public:
|
||||
QIcon getIconForGame(const QString& path);
|
||||
void invalidateCoverCacheForPath(const std::string& path);
|
||||
void refreshGameGridCovers();
|
||||
void refreshAchievementProgress();
|
||||
|
||||
void runOnUIThread(const std::function<void()>& func);
|
||||
void requestShutdown(bool allow_confirm, bool allow_save_to_state, bool save_state, bool check_safety,
|
||||
@@ -245,7 +246,6 @@ private:
|
||||
void onAchievementsLoginSuccess(const QString& username, quint32 points, quint32 sc_points, quint32 unread_messages);
|
||||
void onAchievementsActiveChanged(bool active);
|
||||
void onAchievementsHardcoreModeChanged(bool enabled);
|
||||
void onAchievementsAllProgressRefreshed();
|
||||
bool onCreateAuxiliaryRenderWindow(RenderAPI render_api, qint32 x, qint32 y, quint32 width, quint32 height,
|
||||
const QString& title, const QString& icon_name,
|
||||
Host::AuxiliaryRenderWindowUserData userdata,
|
||||
|
||||
@@ -1673,22 +1673,6 @@ void EmuThread::saveScreenshot()
|
||||
System::SaveScreenshot();
|
||||
}
|
||||
|
||||
void EmuThread::refreshAchievementsAllProgress()
|
||||
{
|
||||
if (!isCurrentThread())
|
||||
{
|
||||
QMetaObject::invokeMethod(this, &EmuThread::refreshAchievementsAllProgress, Qt::QueuedConnection);
|
||||
return;
|
||||
}
|
||||
|
||||
Error error;
|
||||
if (!Achievements::RefreshAllProgressDatabase(&error))
|
||||
{
|
||||
emit errorReported(tr("Error"), QString::fromStdString(error.GetDescription()));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void Host::OnAchievementsLoginRequested(Achievements::LoginRequestReason reason)
|
||||
{
|
||||
emit g_emu_thread->achievementsLoginRequested(reason);
|
||||
@@ -1737,11 +1721,6 @@ void Host::OnAchievementsHardcoreModeChanged(bool enabled)
|
||||
emit g_emu_thread->achievementsHardcoreModeChanged(enabled);
|
||||
}
|
||||
|
||||
void Host::OnAchievementsAllProgressRefreshed()
|
||||
{
|
||||
emit g_emu_thread->achievementsAllProgressRefreshed();
|
||||
}
|
||||
|
||||
bool Host::ShouldPreferHostFileSelector()
|
||||
{
|
||||
#ifdef __linux__
|
||||
|
||||
@@ -123,7 +123,6 @@ Q_SIGNALS:
|
||||
void achievementsRefreshed(quint32 id, const QString& game_info_string);
|
||||
void achievementsActiveChanged(bool active);
|
||||
void achievementsHardcoreModeChanged(bool enabled);
|
||||
void achievementsAllProgressRefreshed();
|
||||
void mediaCaptureStarted();
|
||||
void mediaCaptureStopped();
|
||||
|
||||
@@ -148,7 +147,6 @@ public:
|
||||
void startFullscreenUI();
|
||||
void stopFullscreenUI();
|
||||
void exitFullscreenUI();
|
||||
void refreshAchievementsAllProgress();
|
||||
void bootSystem(std::shared_ptr<SystemBootParameters> params);
|
||||
void resumeSystemFromMostRecentState();
|
||||
void shutdownSystem(bool save_state, bool check_memcard_busy);
|
||||
|
||||
@@ -640,11 +640,6 @@ void Host::OnAchievementsHardcoreModeChanged(bool enabled)
|
||||
// noop
|
||||
}
|
||||
|
||||
void Host::OnAchievementsAllProgressRefreshed()
|
||||
{
|
||||
// noop
|
||||
}
|
||||
|
||||
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
|
||||
|
||||
void Host::OnRAIntegrationMenuChanged()
|
||||
|
||||
Reference in New Issue
Block a user