From 6fdfde764968357422d6532424d73531429995f0 Mon Sep 17 00:00:00 2001 From: Vinicius Rangel Date: Wed, 4 Sep 2024 13:19:27 -0300 Subject: [PATCH] system/MsgDialog: Progress bar dialog --- src/core/libraries/system/msgdialog.cpp | 47 +++++++++++++++++----- src/core/libraries/system/msgdialog.h | 18 +++++++-- src/core/libraries/system/msgdialog_ui.cpp | 47 ++++++++++++++++++++-- 3 files changed, 96 insertions(+), 16 deletions(-) diff --git a/src/core/libraries/system/msgdialog.cpp b/src/core/libraries/system/msgdialog.cpp index 09b8f02ab..c41485b68 100644 --- a/src/core/libraries/system/msgdialog.cpp +++ b/src/core/libraries/system/msgdialog.cpp @@ -82,19 +82,48 @@ Error PS4_SYSV_ABI sceMsgDialogOpen(const Param* param) { return Error::OK; } -int PS4_SYSV_ABI sceMsgDialogProgressBarInc() { - LOG_ERROR(Lib_MsgDlg, "(STUBBED) called"); - return ORBIS_OK; +Error PS4_SYSV_ABI sceMsgDialogProgressBarInc(OrbisMsgDialogProgressBarTarget target, u32 delta) { + if (g_status != Status::RUNNING) { + return Error::NOT_RUNNING; + } + if (g_param.mode != MsgDialogMode::PROGRESS_BAR) { + return Error::NOT_SUPPORTED; + } + if (target != OrbisMsgDialogProgressBarTarget::DEFAULT) { + return Error::PARAM_INVALID; + } + g_msg_dialog_ui.SetProgressBarValue(delta, true); + return Error::OK; } -int PS4_SYSV_ABI sceMsgDialogProgressBarSetMsg() { - LOG_ERROR(Lib_MsgDlg, "(STUBBED) called"); - return ORBIS_OK; +Error PS4_SYSV_ABI sceMsgDialogProgressBarSetMsg(OrbisMsgDialogProgressBarTarget target, + const char* msg) { + if (g_status != Status::RUNNING) { + return Error::NOT_RUNNING; + } + if (g_param.mode != MsgDialogMode::PROGRESS_BAR) { + return Error::NOT_SUPPORTED; + } + if (target != OrbisMsgDialogProgressBarTarget::DEFAULT) { + return Error::PARAM_INVALID; + } + g_param.progBarParam->msg = msg; + return Error::OK; } -int PS4_SYSV_ABI sceMsgDialogProgressBarSetValue() { - LOG_ERROR(Lib_MsgDlg, "(STUBBED) called"); - return ORBIS_OK; +Error PS4_SYSV_ABI sceMsgDialogProgressBarSetValue(OrbisMsgDialogProgressBarTarget target, + u32 value) { + if (g_status != Status::RUNNING) { + return Error::NOT_RUNNING; + } + if (g_param.mode != MsgDialogMode::PROGRESS_BAR) { + return Error::NOT_SUPPORTED; + } + if (target != OrbisMsgDialogProgressBarTarget::DEFAULT) { + return Error::PARAM_INVALID; + } + g_msg_dialog_ui.SetProgressBarValue(value, false); + return Error::OK; } Error PS4_SYSV_ABI sceMsgDialogTerminate() { diff --git a/src/core/libraries/system/msgdialog.h b/src/core/libraries/system/msgdialog.h index 368445132..d2a34396c 100644 --- a/src/core/libraries/system/msgdialog.h +++ b/src/core/libraries/system/msgdialog.h @@ -56,6 +56,10 @@ enum class SystemMessageType : u32 { WARNING_PROFILE_PICTURE_AND_NAME_NOT_SHARED = 5, }; +enum class OrbisMsgDialogProgressBarTarget : u32 { + DEFAULT = 0, +}; + struct ButtonsParam { const char* msg1{}; const char* msg2{}; @@ -107,6 +111,7 @@ class MsgDialogUi final : public ImGui::Layer { const Param* param{}; CommonDialog::Status* status{}; MsgDialogResult* result{}; + u32 progress_bar_value{}; void DrawUser(); void DrawProgressBar(); @@ -120,7 +125,9 @@ public: MsgDialogUi(MsgDialogUi&& other) noexcept; MsgDialogUi& operator=(MsgDialogUi other); - void Finish(ButtonId buttonId); + void Finish(ButtonId buttonId, CommonDialog::Result r = CommonDialog::Result::OK); + + void SetProgressBarValue(u32 value, bool increment); void Draw() override; @@ -134,9 +141,12 @@ CommonDialog::Error PS4_SYSV_ABI sceMsgDialogGetResult(MsgDialogResult* result); CommonDialog::Status PS4_SYSV_ABI sceMsgDialogGetStatus(); CommonDialog::Error PS4_SYSV_ABI sceMsgDialogInitialize(); CommonDialog::Error PS4_SYSV_ABI sceMsgDialogOpen(const Param* param); -int PS4_SYSV_ABI sceMsgDialogProgressBarInc(); -int PS4_SYSV_ABI sceMsgDialogProgressBarSetMsg(); -int PS4_SYSV_ABI sceMsgDialogProgressBarSetValue(); +CommonDialog::Error PS4_SYSV_ABI sceMsgDialogProgressBarInc(OrbisMsgDialogProgressBarTarget, + u32 delta); +CommonDialog::Error PS4_SYSV_ABI sceMsgDialogProgressBarSetMsg(OrbisMsgDialogProgressBarTarget, + const char* msg); +CommonDialog::Error PS4_SYSV_ABI sceMsgDialogProgressBarSetValue(OrbisMsgDialogProgressBarTarget, + u32 value); CommonDialog::Error PS4_SYSV_ABI sceMsgDialogTerminate(); CommonDialog::Status PS4_SYSV_ABI sceMsgDialogUpdateStatus(); diff --git a/src/core/libraries/system/msgdialog_ui.cpp b/src/core/libraries/system/msgdialog_ui.cpp index 693955e9a..873a8bf83 100644 --- a/src/core/libraries/system/msgdialog_ui.cpp +++ b/src/core/libraries/system/msgdialog_ui.cpp @@ -12,6 +12,7 @@ using namespace Libraries::CommonDialog; using namespace Libraries::MsgDialog; static constexpr ImVec2 BUTTON_SIZE{100.0f, 30.0f}; +static constexpr float PROGRESS_BAR_WIDTH{0.8f}; struct { int count = 0; @@ -62,7 +63,16 @@ void MsgDialogUi::DrawUser() { if (count == 2) { PushID(2); if (Button(text2, BUTTON_SIZE)) { - Finish(ButtonId::BUTTON2); + switch (button_type) { + case ButtonType::OK_CANCEL: + case ButtonType::WAIT_CANCEL: + case ButtonType::OK_CANCEL_FOCUS_CANCEL: + Finish(ButtonId::INVALID, Result::USER_CANCELED); + break; + default: + Finish(ButtonId::BUTTON2); + break; + } } if (!focus_first) { SetItemDefaultNav(); @@ -83,7 +93,29 @@ void MsgDialogUi::DrawUser() { EndGroup(); } -void MsgDialogUi::DrawProgressBar() {} +void MsgDialogUi::DrawProgressBar() { + const auto& [bar_type, msg, _] = *param->progBarParam; + DrawCenteredText(msg); + const auto ws = GetWindowSize(); + SetCursorPos({ + ws.x * ((1 - PROGRESS_BAR_WIDTH) / 2.0f), + ws.y - 10.0f - BUTTON_SIZE.y, + }); + bool has_cancel = bar_type == ProgressBarType::PERCENTAGE_CANCEL; + float bar_width = PROGRESS_BAR_WIDTH * ws.x; + if (has_cancel) { + bar_width -= BUTTON_SIZE.x - 10.0f; + } + BeginGroup(); + ProgressBar((float)progress_bar_value / 100.0f, {bar_width, BUTTON_SIZE.y}); + if (has_cancel) { + SameLine(); + if (Button("Cancel", BUTTON_SIZE)) { + Finish(ButtonId::INVALID, Result::USER_CANCELED); + } + } + EndGroup(); +} void MsgDialogUi::DrawSystemMessage() {} @@ -120,8 +152,9 @@ MsgDialogUi& MsgDialogUi::operator=(MsgDialogUi other) { return *this; } -void MsgDialogUi::Finish(ButtonId buttonId) { +void MsgDialogUi::Finish(ButtonId buttonId, Result r) { if (result) { + result->result = r; result->buttonId = buttonId; } if (status) { @@ -133,6 +166,14 @@ void MsgDialogUi::Finish(ButtonId buttonId) { RemoveLayer(this); } +void MsgDialogUi::SetProgressBarValue(u32 value, bool increment) { + if (increment) { + progress_bar_value += value; + } else { + progress_bar_value = value; + } +} + void MsgDialogUi::Draw() { if (status == nullptr || *status != Status::RUNNING) { return;