diff --git a/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.cpp b/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.cpp index 9858942e09..17e19899d8 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.cpp @@ -3,11 +3,6 @@ #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" -#include -#include -#include -#include -#include #include "Utilities/rMsgBox.h" #include "Emu/SysCalls/lv2/sys_time.h" #include "cellSysutil.h" @@ -24,20 +19,53 @@ enum MsgDialogState }; std::atomic g_msg_dialog_state(msgDialogNone); -wxDialog* g_msg_dialog = nullptr; -wxGauge* m_gauge1 = nullptr; -wxGauge* m_gauge2 = nullptr; -wxStaticText* m_text1 = nullptr; -wxStaticText* m_text2 = nullptr; -u64 m_wait_until; +u64 g_msg_dialog_wait_until; +u32 g_msg_dialog_progress_bar_count; + +MsgDialogCreateCb MsgDialogCreate = nullptr; +MsgDialogDestroyCb MsgDialogDestroy = nullptr; +MsgDialogProgressBarSetMsgCb MsgDialogProgressBarSetMsg = nullptr; +MsgDialogProgressBarResetCb MsgDialogProgressBarReset = nullptr; +MsgDialogProgressBarIncCb MsgDialogProgressBarInc = nullptr; + +void SetMsgDialogCreateCallback(MsgDialogCreateCb cb) +{ + MsgDialogCreate = cb; +} + +void SetMsgDialogDestroyCallback(MsgDialogDestroyCb cb) +{ + MsgDialogDestroy = cb; +} + +void SetMsgDialogProgressBarSetMsgCallback(MsgDialogProgressBarSetMsgCb cb) +{ + MsgDialogProgressBarSetMsg = cb; +} + +void SetMsgDialogProgressBarResetCallback(MsgDialogProgressBarResetCb cb) +{ + MsgDialogProgressBarReset = cb; +} + +void SetMsgDialogProgressBarIncCallback(MsgDialogProgressBarIncCb cb) +{ + MsgDialogProgressBarInc = cb; +} + +void MsgDialogClose() +{ + g_msg_dialog_state = msgDialogClose; + g_msg_dialog_wait_until = get_system_time(); +} int cellMsgDialogOpen2(u32 type, mem_list_ptr_t msgString, mem_func_ptr_t callback, u32 userData, u32 extParam) { cellSysutil->Warning("cellMsgDialogOpen2(type=0x%x, msgString_addr=0x%x, callback_addr=0x%x, userData=0x%x, extParam=0x%x)", type, msgString.GetAddr(), callback.GetAddr(), userData, extParam); - //type |= CELL_MSGDIALOG_TYPE_PROGRESSBAR_SINGLE; - //type |= CELL_MSGDIALOG_TYPE_BUTTON_TYPE_YESNO; + //type |= CELL_MSGDIALOG_TYPE_PROGRESSBAR_SINGLE | CELL_MSGDIALOG_TYPE_BG_INVISIBLE; + //type |= CELL_MSGDIALOG_TYPE_BUTTON_TYPE_YESNO | CELL_MSGDIALOG_TYPE_DEFAULT_CURSOR_NO; MsgDialogState old = msgDialogNone; if (!g_msg_dialog_state.compare_exchange_strong(old, msgDialogOpen)) @@ -45,6 +73,15 @@ int cellMsgDialogOpen2(u32 type, mem_list_ptr_t msgString, mem_func_ptr_t msgString, mem_func_ptr_tSetExtraStyle(g_msg_dialog->GetExtraStyle() | wxWS_EX_TRANSIENT); - - wxSizer* sizer1 = new wxBoxSizer(wxVERTICAL); - - wxStaticText* m_text = new wxStaticText(g_msg_dialog, wxID_ANY, wxString(msgString.GetString(), wxConvUTF8)); - sizer1->Add(m_text, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT | wxTOP, 16); - - switch (type & CELL_MSGDIALOG_TYPE_PROGRESSBAR) - { - case CELL_MSGDIALOG_TYPE_PROGRESSBAR_DOUBLE: - m_gauge2 = new wxGauge(g_msg_dialog, wxID_ANY, 100, wxDefaultPosition, wxSize(300, -1), wxGA_HORIZONTAL | wxGA_SMOOTH); - m_text2 = new wxStaticText(g_msg_dialog, wxID_ANY, ""); - m_text2->SetAutoLayout(true); - - case CELL_MSGDIALOG_TYPE_PROGRESSBAR_SINGLE: - m_gauge1 = new wxGauge(g_msg_dialog, wxID_ANY, 100, wxDefaultPosition, wxSize(300, -1), wxGA_HORIZONTAL | wxGA_SMOOTH); - m_text1 = new wxStaticText(g_msg_dialog, wxID_ANY, ""); - m_text1->SetAutoLayout(true); - - case CELL_MSGDIALOG_TYPE_PROGRESSBAR_NONE: - break; - } - - if (m_gauge1) - { - sizer1->Add(m_text1, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT | wxTOP, 8); - sizer1->Add(m_gauge1, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT, 16); - m_gauge1->SetValue(0); - } - if (m_gauge2) - { - sizer1->Add(m_text2, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT | wxTOP, 8); - sizer1->Add(m_gauge2, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT, 16); - m_gauge2->SetValue(0); - } - - wxBoxSizer* buttons = new wxBoxSizer(wxHORIZONTAL); - - switch (type & CELL_MSGDIALOG_TYPE_BUTTON_TYPE) - { - case CELL_MSGDIALOG_TYPE_BUTTON_TYPE_NONE: - break; - - case CELL_MSGDIALOG_TYPE_BUTTON_TYPE_YESNO: - m_button_yes = new wxButton(g_msg_dialog, wxID_YES); - buttons->Add(m_button_yes, 0, wxALIGN_CENTER_HORIZONTAL | wxRIGHT, 8); - m_button_no = new wxButton(g_msg_dialog, wxID_NO); - buttons->Add(m_button_no, 0, wxALIGN_CENTER_HORIZONTAL, 16); - - sizer1->Add(buttons, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT | wxTOP, 16); - break; - - case CELL_MSGDIALOG_TYPE_BUTTON_TYPE_OK: - m_button_ok = new wxButton(g_msg_dialog, wxID_OK); - buttons->Add(m_button_ok, 0, wxALIGN_CENTER_HORIZONTAL, 16); - - sizer1->Add(buttons, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT | wxTOP, 16); - break; - } - - sizer1->AddSpacer(16); - - g_msg_dialog->SetSizerAndFit(sizer1); - g_msg_dialog->Centre(wxBOTH); - g_msg_dialog->Show(); - g_msg_dialog->Enable(); - - g_msg_dialog->Bind(wxEVT_BUTTON, [&](wxCommandEvent& event) - { - status = (event.GetId() == wxID_NO) ? CELL_MSGDIALOG_BUTTON_NO : CELL_MSGDIALOG_BUTTON_YES /* OK */; - g_msg_dialog->Hide(); - m_wait_until = get_system_time(); - g_msg_dialog_state = msgDialogClose; - }); - - - g_msg_dialog->Bind(wxEVT_CLOSE_WINDOW, [&](wxCloseEvent& event) - { - if (type & CELL_MSGDIALOG_TYPE_DISABLE_CANCEL) - { - } - else - { - status = CELL_MSGDIALOG_BUTTON_ESCAPE; - g_msg_dialog->Hide(); - m_wait_until = get_system_time(); - g_msg_dialog_state = msgDialogClose; - } - }); + MsgDialogCreate(type, (char*)msgString.GetPtr(), status); m_signal = true; }); @@ -186,7 +111,7 @@ int cellMsgDialogOpen2(u32 type, mem_list_ptr_t msgString, mem_func_ptr_t msgString, mem_func_ptr_t msgS return CELL_MSGDIALOG_ERROR_DIALOG_NOT_OPENED; } - if (progressBarIndex >= (m_gauge1 ? 1u : 0u) + (m_gauge2 ? 1u : 0u)) + if (progressBarIndex >= g_msg_dialog_progress_bar_count) { return CELL_MSGDIALOG_ERROR_PARAM; } @@ -373,13 +297,7 @@ int cellMsgDialogProgressBarSetMsg(u32 progressBarIndex, mem_list_ptr_t msgS CallAfter([text, progressBarIndex]() { - if (g_msg_dialog && !Emu.IsStopped()) - { - if (progressBarIndex == 0 && m_text1) m_text1->SetLabelText(fmt::FromUTF8(text)); - if (progressBarIndex == 1 && m_text2) m_text2->SetLabelText(fmt::FromUTF8(text)); - g_msg_dialog->Layout(); - g_msg_dialog->Fit(); - } + MsgDialogProgressBarSetMsg(progressBarIndex, text.c_str()); }); return CELL_OK; } @@ -393,18 +311,14 @@ int cellMsgDialogProgressBarReset(u32 progressBarIndex) return CELL_MSGDIALOG_ERROR_DIALOG_NOT_OPENED; } - if (progressBarIndex >= (m_gauge1 ? 1u : 0u) + (m_gauge2 ? 1u : 0u)) + if (progressBarIndex >= g_msg_dialog_progress_bar_count) { return CELL_MSGDIALOG_ERROR_PARAM; } CallAfter([=]() { - if (g_msg_dialog) - { - if (progressBarIndex == 0 && m_gauge1) m_gauge1->SetValue(0); - if (progressBarIndex == 1 && m_gauge2) m_gauge2->SetValue(0); - } + MsgDialogProgressBarReset(progressBarIndex); }); return CELL_OK; } @@ -418,18 +332,14 @@ int cellMsgDialogProgressBarInc(u32 progressBarIndex, u32 delta) return CELL_MSGDIALOG_ERROR_DIALOG_NOT_OPENED; } - if (progressBarIndex >= (m_gauge1 ? 1u : 0u) + (m_gauge2 ? 1u : 0u)) + if (progressBarIndex >= g_msg_dialog_progress_bar_count) { return CELL_MSGDIALOG_ERROR_PARAM; } CallAfter([=]() { - if (g_msg_dialog) - { - if (progressBarIndex == 0 && m_gauge1) m_gauge1->SetValue(m_gauge1->GetValue() + delta); - if (progressBarIndex == 1 && m_gauge2) m_gauge2->SetValue(m_gauge2->GetValue() + delta); - } + MsgDialogProgressBarInc(progressBarIndex, delta); }); return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.h b/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.h index 33b8ab667c..cc11500829 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.h +++ b/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.h @@ -88,4 +88,18 @@ int cellMsgDialogProgressBarSetMsg(u32 progressBarIndex, mem_list_ptr_t msgS int cellMsgDialogProgressBarReset(u32 progressBarIndex); int cellMsgDialogProgressBarInc(u32 progressBarIndex, u32 delta); int cellMsgDialogClose(float delay); -int cellMsgDialogAbort(); \ No newline at end of file +int cellMsgDialogAbort(); + +typedef void(*MsgDialogCreateCb)(u32 type, const char* msg, u64& status); +typedef void(*MsgDialogDestroyCb)(); +typedef void(*MsgDialogProgressBarSetMsgCb)(u32 progressBarIndex, const char* msg); +typedef void(*MsgDialogProgressBarResetCb)(u32 progressBarIndex); +typedef void(*MsgDialogProgressBarIncCb)(u32 progressBarIndex, u32 delta); + +void SetMsgDialogCreateCallback(MsgDialogCreateCb cb); +void SetMsgDialogDestroyCallback(MsgDialogDestroyCb cb); +void SetMsgDialogProgressBarSetMsgCallback(MsgDialogProgressBarSetMsgCb cb); +void SetMsgDialogProgressBarResetCallback(MsgDialogProgressBarResetCb cb); +void SetMsgDialogProgressBarIncCallback(MsgDialogProgressBarIncCb cb); + +void MsgDialogClose(); diff --git a/rpcs3/Gui/MsgDialog.cpp b/rpcs3/Gui/MsgDialog.cpp new file mode 100644 index 0000000000..8ede9a8531 --- /dev/null +++ b/rpcs3/Gui/MsgDialog.cpp @@ -0,0 +1,163 @@ +#include "stdafx_gui.h" +#include "Emu/Memory/Memory.h" + +#include "Emu/SysCalls/lv2/sys_time.h" +#include "Emu/SysCalls/Modules/cellMsgDialog.h" +#include "MsgDialog.h" + +wxDialog* m_dialog = nullptr; +wxGauge* m_gauge1 = nullptr; +wxGauge* m_gauge2 = nullptr; +wxStaticText* m_text1 = nullptr; +wxStaticText* m_text2 = nullptr; + +void MsgDialogCreate(u32 type, const char* msg, u64& status) +{ + wxWindow* parent = nullptr; // TODO: align it better + + m_gauge1 = nullptr; + m_gauge2 = nullptr; + m_text1 = nullptr; + m_text2 = nullptr; + wxButton* m_button_ok = nullptr; + wxButton* m_button_yes = nullptr; + wxButton* m_button_no = nullptr; + + m_dialog = new wxDialog(parent, wxID_ANY, type & CELL_MSGDIALOG_TYPE_SE_TYPE ? "" : "Error", wxDefaultPosition, wxDefaultSize); + + m_dialog->SetExtraStyle(m_dialog->GetExtraStyle() | wxWS_EX_TRANSIENT); + m_dialog->SetTransparent(127 + (type & CELL_MSGDIALOG_TYPE_BG) * (128 / CELL_MSGDIALOG_TYPE_BG_INVISIBLE)); + + wxSizer* sizer1 = new wxBoxSizer(wxVERTICAL); + + wxStaticText* m_text = new wxStaticText(m_dialog, wxID_ANY, wxString(msg, wxConvUTF8)); + sizer1->Add(m_text, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT | wxTOP, 16); + + switch (type & CELL_MSGDIALOG_TYPE_PROGRESSBAR) + { + case CELL_MSGDIALOG_TYPE_PROGRESSBAR_DOUBLE: + m_gauge2 = new wxGauge(m_dialog, wxID_ANY, 100, wxDefaultPosition, wxSize(300, -1), wxGA_HORIZONTAL | wxGA_SMOOTH); + m_text2 = new wxStaticText(m_dialog, wxID_ANY, ""); + m_text2->SetAutoLayout(true); + + case CELL_MSGDIALOG_TYPE_PROGRESSBAR_SINGLE: + m_gauge1 = new wxGauge(m_dialog, wxID_ANY, 100, wxDefaultPosition, wxSize(300, -1), wxGA_HORIZONTAL | wxGA_SMOOTH); + m_text1 = new wxStaticText(m_dialog, wxID_ANY, ""); + m_text1->SetAutoLayout(true); + + default: // ??? + break; + } + + if (m_gauge1) + { + sizer1->Add(m_text1, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT | wxTOP, 8); + sizer1->Add(m_gauge1, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT, 16); + m_gauge1->SetValue(0); + } + if (m_gauge2) + { + sizer1->Add(m_text2, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT | wxTOP, 8); + sizer1->Add(m_gauge2, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT, 16); + m_gauge2->SetValue(0); + } + + wxBoxSizer* buttons = new wxBoxSizer(wxHORIZONTAL); + + switch (type & CELL_MSGDIALOG_TYPE_BUTTON_TYPE) + { + case CELL_MSGDIALOG_TYPE_BUTTON_TYPE_NONE: + break; + + case CELL_MSGDIALOG_TYPE_BUTTON_TYPE_YESNO: + m_button_yes = new wxButton(m_dialog, wxID_YES); + buttons->Add(m_button_yes, 0, wxALIGN_CENTER_HORIZONTAL | wxRIGHT, 8); + m_button_no = new wxButton(m_dialog, wxID_NO); + buttons->Add(m_button_no, 0, wxALIGN_CENTER_HORIZONTAL, 16); + if ((type & CELL_MSGDIALOG_TYPE_DEFAULT_CURSOR) == CELL_MSGDIALOG_TYPE_DEFAULT_CURSOR_NO) + { + m_button_no->SetFocus(); + } + else + { + m_button_yes->SetFocus(); + } + + sizer1->Add(buttons, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT | wxTOP, 16); + break; + + case CELL_MSGDIALOG_TYPE_BUTTON_TYPE_OK: + m_button_ok = new wxButton(m_dialog, wxID_OK); + buttons->Add(m_button_ok, 0, wxALIGN_CENTER_HORIZONTAL, 16); + if ((type & CELL_MSGDIALOG_TYPE_DEFAULT_CURSOR) == CELL_MSGDIALOG_TYPE_DEFAULT_CURSOR_OK) + { + m_button_ok->SetFocus(); + } + + sizer1->Add(buttons, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT | wxTOP, 16); + break; + } + + sizer1->AddSpacer(16); + + m_dialog->SetSizerAndFit(sizer1); + m_dialog->Centre(wxBOTH); + m_dialog->Show(); + m_dialog->Enable(); + + m_dialog->Bind(wxEVT_BUTTON, [&](wxCommandEvent& event) + { + status = (event.GetId() == wxID_NO) ? CELL_MSGDIALOG_BUTTON_NO : CELL_MSGDIALOG_BUTTON_YES /* OK */; + m_dialog->Hide(); + MsgDialogClose(); + }); + + + m_dialog->Bind(wxEVT_CLOSE_WINDOW, [&](wxCloseEvent& event) + { + if (type & CELL_MSGDIALOG_TYPE_DISABLE_CANCEL) + { + } + else + { + status = CELL_MSGDIALOG_BUTTON_ESCAPE; + m_dialog->Hide(); + MsgDialogClose(); + } + }); +} + +void MsgDialogDestroy() +{ + delete m_dialog; + m_dialog = nullptr; +} + +void MsgDialogProgressBarSetMsg(u32 index, const char* msg) +{ + if (m_dialog) + { + if (index == 0 && m_text1) m_text1->SetLabelText(wxString(msg, wxConvUTF8)); + if (index == 1 && m_text2) m_text2->SetLabelText(wxString(msg, wxConvUTF8)); + m_dialog->Layout(); + m_dialog->Fit(); + } +} + +void MsgDialogProgressBarReset(u32 index) +{ + if (m_dialog) + { + if (index == 0 && m_gauge1) m_gauge1->SetValue(0); + if (index == 1 && m_gauge2) m_gauge2->SetValue(0); + } +} + +void MsgDialogProgressBarInc(u32 index, u32 delta) +{ + if (m_dialog) + { + if (index == 0 && m_gauge1) m_gauge1->SetValue(m_gauge1->GetValue() + delta); + if (index == 1 && m_gauge2) m_gauge2->SetValue(m_gauge2->GetValue() + delta); + } +} diff --git a/rpcs3/Gui/MsgDialog.h b/rpcs3/Gui/MsgDialog.h new file mode 100644 index 0000000000..2f669b9736 --- /dev/null +++ b/rpcs3/Gui/MsgDialog.h @@ -0,0 +1,7 @@ +#pragma once + +void MsgDialogCreate(u32 type, const char* msg, u64& status); +void MsgDialogDestroy(); +void MsgDialogProgressBarSetMsg(u32 index, const char* msg); +void MsgDialogProgressBarReset(u32 index); +void MsgDialogProgressBarInc(u32 index, u32 delta); diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 9860e3d596..b1ffe18464 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -413,9 +413,6 @@ - - - {C4A10229-4712-4BD2-B63E-50D93C67A038} emucore diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index d045709d83..b1500a5f15 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -1190,7 +1190,4 @@ Loader - - - \ No newline at end of file diff --git a/rpcs3/rpcs3.cpp b/rpcs3/rpcs3.cpp index 4588e8ca83..c5fb281606 100644 --- a/rpcs3/rpcs3.cpp +++ b/rpcs3/rpcs3.cpp @@ -1,4 +1,5 @@ #include "stdafx_gui.h" +#include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "rpcs3.h" #include "Ini.h" @@ -20,6 +21,9 @@ #include "Emu/Io/XInput/XInputPadHandler.h" #endif +#include "Emu/SysCalls/Modules/cellMsgDialog.h" +#include "Gui/MsgDialog.h" + #include "Gui/GLGSFrame.h" #include @@ -113,6 +117,11 @@ bool Rpcs3App::OnInit() { return new GLGSFrame(); }); + SetMsgDialogCreateCallback(MsgDialogCreate); + SetMsgDialogDestroyCallback(MsgDialogDestroy); + SetMsgDialogProgressBarSetMsgCallback(MsgDialogProgressBarSetMsg); + SetMsgDialogProgressBarResetCallback(MsgDialogProgressBarReset); + SetMsgDialogProgressBarIncCallback(MsgDialogProgressBarInc); TheApp = this; SetAppName(_PRGNAME_); diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 723c265201..e0a1cc7f00 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -175,6 +175,7 @@ + @@ -212,6 +213,7 @@ + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 2adfacee27..56cbf5be63 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -87,6 +87,9 @@ Gui + + Gui + @@ -176,5 +179,8 @@ Gui + + Gui + \ No newline at end of file