From 0733e173b2a9e2c33b6b53d8043cb9c87dadea25 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 4 Jan 2025 15:12:45 +1000 Subject: [PATCH] FullscreenUI: Add BackgroundProgressCallback --- src/core/fullscreen_ui.cpp | 69 ++++++++++++++++++++++++++++++++++++++ src/core/fullscreen_ui.h | 49 ++++++++++++++++++++------- 2 files changed, 106 insertions(+), 12 deletions(-) diff --git a/src/core/fullscreen_ui.cpp b/src/core/fullscreen_ui.cpp index 358ee290c..63b40f713 100644 --- a/src/core/fullscreen_ui.cpp +++ b/src/core/fullscreen_ui.cpp @@ -8525,6 +8525,75 @@ void FullscreenUI::OpenLeaderboardsWindow() }); } +FullscreenUI::BackgroundProgressCallback::BackgroundProgressCallback(std::string name) + : ProgressCallback(), m_name(std::move(name)) +{ + ImGuiFullscreen::OpenBackgroundProgressDialog(m_name.c_str(), "", 0, 100, 0); +} + +FullscreenUI::BackgroundProgressCallback::~BackgroundProgressCallback() +{ + ImGuiFullscreen::CloseBackgroundProgressDialog(m_name.c_str()); +} + +void FullscreenUI::BackgroundProgressCallback::SetStatusText(const std::string_view text) +{ + ProgressCallback::SetStatusText(text); + Redraw(true); +} + +void FullscreenUI::BackgroundProgressCallback::SetProgressRange(u32 range) +{ + const u32 last_range = m_progress_range; + + ProgressCallback::SetProgressRange(range); + + if (m_progress_range != last_range) + Redraw(false); +} + +void FullscreenUI::BackgroundProgressCallback::SetProgressValue(u32 value) +{ + const u32 last_value = m_progress_value; + + ProgressCallback::SetProgressValue(value); + + if (m_progress_value != last_value) + Redraw(false); +} + +void FullscreenUI::BackgroundProgressCallback::Redraw(bool force) +{ + const int percent = + static_cast((static_cast(m_progress_value) / static_cast(m_progress_range)) * 100.0f); + if (percent == m_last_progress_percent && !force) + return; + + m_last_progress_percent = percent; + ImGuiFullscreen::UpdateBackgroundProgressDialog(m_name.c_str(), m_status_text, 0, 100, percent); +} + +void FullscreenUI::BackgroundProgressCallback::ModalError(const std::string_view message) +{ + Host::ReportErrorAsync("Error", message); +} + +bool FullscreenUI::BackgroundProgressCallback::ModalConfirmation(const std::string_view message) +{ + return Host::ConfirmMessage("Confirm", message); +} + +void FullscreenUI::BackgroundProgressCallback::ModalInformation(const std::string_view message) +{ + Host::ReportErrorAsync("Information", message); +} + +void FullscreenUI::BackgroundProgressCallback::SetCancelled() +{ + if (m_cancellable) + m_cancelled = true; +} + #endif // __ANDROID__ LoadingScreenProgressCallback::LoadingScreenProgressCallback() diff --git a/src/core/fullscreen_ui.h b/src/core/fullscreen_ui.h index 7a7eb667c..0c36f2900 100644 --- a/src/core/fullscreen_ui.h +++ b/src/core/fullscreen_ui.h @@ -26,18 +26,6 @@ void OnSystemResumed(); void OnSystemDestroyed(); void OnRunningGameChanged(const std::string& path, const std::string& serial, const std::string& title, GameHash hash); -#ifndef __ANDROID__ -void OpenPauseMenu(); -void OpenCheatsMenu(); -void OpenDiscChangeMenu(); -void OpenAchievementsWindow(); -void OpenLeaderboardsWindow(); -void ReturnToMainWindow(); -void ReturnToPreviousWindow(); -void SetStandardSelectionFooterText(bool back_instead_of_cancel); -void UpdateRunIdleState(); -#endif - void Shutdown(bool clear_state); void Render(); void InvalidateCoverCache(); @@ -51,6 +39,43 @@ void UpdateLoadingScreen(std::string_view image, std::string_view message, s32 p s32 progress_value = -1); void CloseLoadingScreen(); +#ifndef __ANDROID__ + +void OpenPauseMenu(); +void OpenCheatsMenu(); +void OpenDiscChangeMenu(); +void OpenAchievementsWindow(); +void OpenLeaderboardsWindow(); +void ReturnToMainWindow(); +void ReturnToPreviousWindow(); +void SetStandardSelectionFooterText(bool back_instead_of_cancel); +void UpdateRunIdleState(); + +class BackgroundProgressCallback final : public ProgressCallback +{ +public: + BackgroundProgressCallback(std::string name); + ~BackgroundProgressCallback() override; + + void SetStatusText(const std::string_view text) override; + void SetProgressRange(u32 range) override; + void SetProgressValue(u32 value) override; + + void ModalError(const std::string_view message) override; + bool ModalConfirmation(const std::string_view message) override; + void ModalInformation(const std::string_view message) override; + + void SetCancelled(); + +private: + void Redraw(bool force); + + std::string m_name; + int m_last_progress_percent = -1; +}; + +#endif // __ANDROID__ + } // namespace FullscreenUI class LoadingScreenProgressCallback final : public ProgressCallback