diff --git a/src/core/libraries/np/np_profile_dialog/np_profile_dialog.cpp b/src/core/libraries/np/np_profile_dialog/np_profile_dialog.cpp index 6163a7096..06b7af5d0 100644 --- a/src/core/libraries/np/np_profile_dialog/np_profile_dialog.cpp +++ b/src/core/libraries/np/np_profile_dialog/np_profile_dialog.cpp @@ -24,13 +24,13 @@ sceNpProfileDialogOpen(OrbisNpProfileDialogParam* param) { LOG_INFO(Lib_NpProfileDialog, "called without initialize"); return Libraries::CommonDialog::Error::INVALID_STATE; } - LOG_ERROR(Lib_NpProfileDialog, "(STUBBED) called"); // TODO open ui dialog + LOG_ERROR(Lib_NpProfileDialog, "(STUBBED) called"); NpProfileDialogState state{}; state.onlineId = std::string(param->targetOnlineId.data); state.userId = param->userId; g_state = state; g_status = Libraries::CommonDialog::Status::RUNNING; - g_profile_dialog_ui = NpProfileDialogUi(&g_state, &g_result); + g_profile_dialog_ui = NpProfileDialogUi(&g_state, &g_status, &g_result); return Libraries::CommonDialog::Error::OK; } @@ -39,7 +39,7 @@ Libraries::CommonDialog::Error PS4_SYSV_ABI sceNpProfileDialogClose() { if (g_status != Libraries::CommonDialog::Status::RUNNING) { return Libraries::CommonDialog::Error::NOT_RUNNING; } - LOG_INFO(Lib_NpProfileDialog, "TODO: close npprofile ui dialog"); // TODO close Ui dialog + g_profile_dialog_ui.Finish(0); return Libraries::CommonDialog::Error::OK; } @@ -87,10 +87,6 @@ Libraries::CommonDialog::Error PS4_SYSV_ABI sceNpProfileDialogTerminate() { } Libraries::CommonDialog::Status PS4_SYSV_ABI sceNpProfileDialogUpdateStatus() { - if (g_status == Libraries::CommonDialog::Status::RUNNING) { - g_status = Libraries::CommonDialog::Status::FINISHED; // TODO removed it when implementing - // real dialog - } LOG_TRACE(Lib_NpProfileDialog, "called status={}", magic_enum::enum_name(g_status)); return g_status; } diff --git a/src/core/libraries/np/np_profile_dialog/np_profile_dialog.h b/src/core/libraries/np/np_profile_dialog/np_profile_dialog.h index db27d1e3f..b09870f2e 100644 --- a/src/core/libraries/np/np_profile_dialog/np_profile_dialog.h +++ b/src/core/libraries/np/np_profile_dialog/np_profile_dialog.h @@ -48,7 +48,6 @@ struct OrbisNpProfileDialogParamA { }; }; - Libraries::CommonDialog::Error PS4_SYSV_ABI sceNpProfileDialogOpen(OrbisNpProfileDialogParam* param); Libraries::CommonDialog::Error PS4_SYSV_ABI sceNpProfileDialogClose(); diff --git a/src/core/libraries/np/np_profile_dialog/np_profile_dialog_ui.cpp b/src/core/libraries/np/np_profile_dialog/np_profile_dialog_ui.cpp index 1febed259..67a702910 100644 --- a/src/core/libraries/np/np_profile_dialog/np_profile_dialog_ui.cpp +++ b/src/core/libraries/np/np_profile_dialog/np_profile_dialog_ui.cpp @@ -1,21 +1,25 @@ -#include "common/logging/log.h" // optional, for debug -#include "np_profile_dialog_ui.h" +// SPDX-FileCopyrightText: Copyright 2025-2026 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + #include #include #include #include +#include "np_profile_dialog_ui.h" + using namespace ImGui; +using namespace Libraries::CommonDialog; namespace Libraries::Np::NpProfileDialog { static constexpr ImVec2 BUTTON_SIZE{100.0f, 30.0f}; -NpProfileDialogUi::NpProfileDialogUi(NpProfileDialogState* state, int* result) - : state(state), result(result) { - if (state) { +NpProfileDialogUi::NpProfileDialogUi(NpProfileDialogState* state, Status* status, int* result) + : state(state), status(status), result(result) { + if (status && *status == Status::RUNNING) { first_render = true; - AddLayer(this); // register in Layer system + AddLayer(this); } } @@ -24,16 +28,18 @@ NpProfileDialogUi::~NpProfileDialogUi() { } NpProfileDialogUi::NpProfileDialogUi(NpProfileDialogUi&& other) noexcept - : Layer(other), state(other.state), result(other.result) { + : Layer(other), state(other.state), status(other.status), result(other.result) { other.state = nullptr; + other.status = nullptr; other.result = nullptr; } NpProfileDialogUi& NpProfileDialogUi::operator=(NpProfileDialogUi other) { using std::swap; swap(state, other.state); + swap(status, other.status); swap(result, other.result); - if (state) { + if (status && *status == Status::RUNNING) { first_render = true; AddLayer(this); } @@ -42,16 +48,21 @@ NpProfileDialogUi& NpProfileDialogUi::operator=(NpProfileDialogUi other) { void NpProfileDialogUi::Finish(int result_code) { if (result) { - *result = result_code; // 0 = OK + *result = result_code; + } + if (status) { + *status = Status::FINISHED; } state = nullptr; + status = nullptr; result = nullptr; - RemoveLayer(this); // unregister from Layer system + RemoveLayer(this); } void NpProfileDialogUi::Draw() { - if (!state) + if (status == nullptr || *status != Status::RUNNING) { return; + } const auto& io = GetIO(); ImVec2 window_size{std::min(io.DisplaySize.x, 400.0f), std::min(io.DisplaySize.y, 200.0f)}; @@ -94,4 +105,4 @@ void NpProfileDialogUi::Draw() { first_render = false; } -} // namespace Libraries::Np::NpProfileDialog \ No newline at end of file +} // namespace Libraries::Np::NpProfileDialog diff --git a/src/core/libraries/np/np_profile_dialog/np_profile_dialog_ui.h b/src/core/libraries/np/np_profile_dialog/np_profile_dialog_ui.h index d3efd1346..1c5c5491b 100644 --- a/src/core/libraries/np/np_profile_dialog/np_profile_dialog_ui.h +++ b/src/core/libraries/np/np_profile_dialog/np_profile_dialog_ui.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + #pragma once #include @@ -17,21 +20,23 @@ struct NpProfileDialogState { class NpProfileDialogUi : public ImGui::Layer { public: - explicit NpProfileDialogUi(NpProfileDialogState* state = nullptr, int* result = nullptr); - ~NpProfileDialogUi(); + explicit NpProfileDialogUi(NpProfileDialogState* state = nullptr, + CommonDialog::Status* status = nullptr, int* result = nullptr); + ~NpProfileDialogUi() override; NpProfileDialogUi(const NpProfileDialogUi& other) = delete; NpProfileDialogUi(NpProfileDialogUi&& other) noexcept; NpProfileDialogUi& operator=(NpProfileDialogUi other); + void Finish(int result_code); + void Draw() override; private: - void Finish(int result_code); - NpProfileDialogState* state{}; + CommonDialog::Status* status{}; int* result{}; - bool first_render{true}; + bool first_render{false}; }; } // namespace Libraries::Np::NpProfileDialog