mirror of https://github.com/RPCS3/rpcs3.git
cellOskDialogLoadAsync fix
Takes into account text limit and initial text
This commit is contained in:
parent
86ef07b166
commit
5681801b85
|
@ -83,7 +83,7 @@ public:
|
||||||
|
|
||||||
virtual ~MsgDialogBase();
|
virtual ~MsgDialogBase();
|
||||||
virtual void Create(const std::string& msg) = 0;
|
virtual void Create(const std::string& msg) = 0;
|
||||||
virtual void CreateOsk(const std::string& msg, char16_t* osk_text) = 0;
|
virtual void CreateOsk(const std::string& msg, char16_t* osk_text, u32 charlimit) = 0;
|
||||||
virtual void ProgressBarSetMsg(u32 progressBarIndex, const std::string& msg) = 0;
|
virtual void ProgressBarSetMsg(u32 progressBarIndex, const std::string& msg) = 0;
|
||||||
virtual void ProgressBarReset(u32 progressBarIndex) = 0;
|
virtual void ProgressBarReset(u32 progressBarIndex) = 0;
|
||||||
virtual void ProgressBarInc(u32 progressBarIndex, u32 delta) = 0;
|
virtual void ProgressBarInc(u32 progressBarIndex, u32 delta) = 0;
|
||||||
|
|
|
@ -14,14 +14,21 @@ s32 cellOskDialogLoadAsync(u32 container, vm::ptr<CellOskDialogParam> dialogPara
|
||||||
{
|
{
|
||||||
cellOskDialog.warning("cellOskDialogLoadAsync(container=0x%x, dialogParam=*0x%x, inputFieldInfo=*0x%x)", container, dialogParam, inputFieldInfo);
|
cellOskDialog.warning("cellOskDialogLoadAsync(container=0x%x, dialogParam=*0x%x, inputFieldInfo=*0x%x)", container, dialogParam, inputFieldInfo);
|
||||||
|
|
||||||
|
u32 maxLength = (inputFieldInfo->limit_length >= 512) ? 511 : (u32)inputFieldInfo->limit_length;
|
||||||
|
|
||||||
std::memset(s_osk_text, 0, sizeof(s_osk_text));
|
std::memset(s_osk_text, 0, sizeof(s_osk_text));
|
||||||
|
|
||||||
|
if (inputFieldInfo->init_text.addr() != 0)
|
||||||
|
for (u32 i = 0; (i < maxLength) && (inputFieldInfo->init_text[i] != 0); i++)
|
||||||
|
s_osk_text[i] = inputFieldInfo->init_text[i];
|
||||||
|
|
||||||
const auto osk = Emu.GetCallbacks().get_msg_dialog();
|
const auto osk = Emu.GetCallbacks().get_msg_dialog();
|
||||||
bool result = false;
|
bool result = false;
|
||||||
|
|
||||||
osk->on_close = [&](s32 status)
|
osk->on_close = [&](s32 status)
|
||||||
{
|
{
|
||||||
sysutil_send_system_cmd(status == CELL_MSGDIALOG_BUTTON_OK ? CELL_SYSUTIL_OSKDIALOG_FINISHED : CELL_SYSUTIL_OSKDIALOG_INPUT_CANCELED, 0);
|
if (status != CELL_MSGDIALOG_BUTTON_OK) sysutil_send_system_cmd(CELL_SYSUTIL_OSKDIALOG_INPUT_CANCELED, 0);
|
||||||
|
sysutil_send_system_cmd(CELL_SYSUTIL_OSKDIALOG_FINISHED, 0);
|
||||||
result = true;
|
result = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -32,7 +39,7 @@ s32 cellOskDialogLoadAsync(u32 container, vm::ptr<CellOskDialogParam> dialogPara
|
||||||
|
|
||||||
Emu.CallAfter([&]()
|
Emu.CallAfter([&]()
|
||||||
{
|
{
|
||||||
osk->CreateOsk("On Screen Keyboard", s_osk_text);
|
osk->CreateOsk("On Screen Keyboard", s_osk_text, maxLength);
|
||||||
});
|
});
|
||||||
|
|
||||||
sysutil_send_system_cmd(CELL_SYSUTIL_OSKDIALOG_LOADED, 0);
|
sysutil_send_system_cmd(CELL_SYSUTIL_OSKDIALOG_LOADED, 0);
|
||||||
|
|
|
@ -199,7 +199,7 @@ void msg_dialog_frame::Create(const std::string& msg)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void msg_dialog_frame::CreateOsk(const std::string& msg, char16_t* osk_text)
|
void msg_dialog_frame::CreateOsk(const std::string& msg, char16_t* osk_text, u32 charlimit)
|
||||||
{
|
{
|
||||||
static const auto& lineEditWidth = []() {return QLabel("This is the very length of the lineedit due to hidpi reasons.").sizeHint().width(); };
|
static const auto& lineEditWidth = []() {return QLabel("This is the very length of the lineedit due to hidpi reasons.").sizeHint().width(); };
|
||||||
|
|
||||||
|
@ -220,6 +220,8 @@ void msg_dialog_frame::CreateOsk(const std::string& msg, char16_t* osk_text)
|
||||||
//Text Input
|
//Text Input
|
||||||
QLineEdit* input = new QLineEdit(osk_dialog);
|
QLineEdit* input = new QLineEdit(osk_dialog);
|
||||||
input->setFixedWidth(lineEditWidth());
|
input->setFixedWidth(lineEditWidth());
|
||||||
|
input->setMaxLength(charlimit);
|
||||||
|
input->setText(QString::fromStdU16String(std::u16string(osk_text_return)));
|
||||||
input->setFocus();
|
input->setFocus();
|
||||||
|
|
||||||
//Ok Button
|
//Ok Button
|
||||||
|
@ -239,14 +241,14 @@ void msg_dialog_frame::CreateOsk(const std::string& msg, char16_t* osk_text)
|
||||||
osk_dialog->setLayout(layout);
|
osk_dialog->setLayout(layout);
|
||||||
|
|
||||||
//Events
|
//Events
|
||||||
connect(input, &QLineEdit::textChanged, [=] {
|
connect(input, &QLineEdit::textChanged, [=] { on_osk_input_entered(); });
|
||||||
std::memset(osk_text_return, 0, 512 * sizeof(char16_t)); // TODO: use max length instead of default 512
|
connect(input, &QLineEdit::returnPressed, osk_dialog, &QDialog::accept);
|
||||||
std::memcpy(osk_text_return, reinterpret_cast<const char16_t*>(input->text().constData()), input->text().size() * sizeof(char16_t));
|
connect(button_ok, &QAbstractButton::clicked, osk_dialog, &QDialog::accept);
|
||||||
on_osk_input_entered();
|
|
||||||
});
|
|
||||||
connect(input, &QLineEdit::returnPressed, [=] { on_close(CELL_MSGDIALOG_BUTTON_OK); osk_dialog->accept(); });
|
|
||||||
connect(button_ok, &QAbstractButton::clicked, [=] { on_close(CELL_MSGDIALOG_BUTTON_OK); osk_dialog->accept(); });
|
|
||||||
connect(osk_dialog, &QDialog::rejected, [=] {if (!type.disable_cancel) { on_close(CELL_MSGDIALOG_BUTTON_ESCAPE); }});
|
connect(osk_dialog, &QDialog::rejected, [=] {if (!type.disable_cancel) { on_close(CELL_MSGDIALOG_BUTTON_ESCAPE); }});
|
||||||
|
connect(osk_dialog, &QDialog::accepted, [=] {
|
||||||
|
std::memcpy(osk_text_return, reinterpret_cast<const char16_t*>(input->text().constData()), ((input->text()).size() + 1) * sizeof(char16_t));
|
||||||
|
on_close(CELL_MSGDIALOG_BUTTON_OK);
|
||||||
|
});
|
||||||
|
|
||||||
//Fix size
|
//Fix size
|
||||||
osk_dialog->layout()->setSizeConstraint(QLayout::SetFixedSize);
|
osk_dialog->layout()->setSizeConstraint(QLayout::SetFixedSize);
|
||||||
|
|
|
@ -54,7 +54,7 @@ public:
|
||||||
msg_dialog_frame(QWindow* taskbarTarget);
|
msg_dialog_frame(QWindow* taskbarTarget);
|
||||||
~msg_dialog_frame();
|
~msg_dialog_frame();
|
||||||
virtual void Create(const std::string& msg) override;
|
virtual void Create(const std::string& msg) override;
|
||||||
virtual void CreateOsk(const std::string& msg, char16_t* osk_text) override;
|
virtual void CreateOsk(const std::string& msg, char16_t* osk_text, u32 charlimit) override;
|
||||||
virtual void ProgressBarSetMsg(u32 progressBarIndex, const std::string& msg) override;
|
virtual void ProgressBarSetMsg(u32 progressBarIndex, const std::string& msg) override;
|
||||||
virtual void ProgressBarReset(u32 progressBarIndex) override;
|
virtual void ProgressBarReset(u32 progressBarIndex) override;
|
||||||
virtual void ProgressBarInc(u32 progressBarIndex, u32 delta) override;
|
virtual void ProgressBarInc(u32 progressBarIndex, u32 delta) override;
|
||||||
|
|
Loading…
Reference in New Issue