mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-07 07:21:25 +12:00
Minor progress dialog refactoring
Add rsx::overlays::progress_dialog class (identical to message_dialog). Don't use Emu.CallAfter() for native dialogs. Make g_progr_ptotal waitable.
This commit is contained in:
parent
963d150e93
commit
6f1f75bc8f
2 changed files with 42 additions and 30 deletions
|
@ -422,7 +422,7 @@ void spu_cache::initialize()
|
||||||
// Initialize progress dialog (wait for previous progress done)
|
// Initialize progress dialog (wait for previous progress done)
|
||||||
while (g_progr_ptotal)
|
while (g_progr_ptotal)
|
||||||
{
|
{
|
||||||
std::this_thread::sleep_for(5ms);
|
g_progr_ptotal.wait<atomic_wait::op_ne>(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_progr_ptotal += ::size32(func_list);
|
g_progr_ptotal += ::size32(func_list);
|
||||||
|
|
|
@ -333,6 +333,15 @@ void Emulator::Init(bool add_only)
|
||||||
g_fxo->init<patch_engine>()->append_global_patches();
|
g_fxo->init<patch_engine>()->append_global_patches();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace rsx::overlays
|
||||||
|
{
|
||||||
|
class progress_dialog : public message_dialog
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using message_dialog::message_dialog;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
struct progress_dialog_server
|
struct progress_dialog_server
|
||||||
|
@ -363,7 +372,7 @@ namespace
|
||||||
// Initialize message dialog
|
// Initialize message dialog
|
||||||
bool skip_this_one = false; // Workaround: do not open a progress dialog if there is already a cell message dialog open.
|
bool skip_this_one = false; // Workaround: do not open a progress dialog if there is already a cell message dialog open.
|
||||||
std::shared_ptr<MsgDialogBase> dlg;
|
std::shared_ptr<MsgDialogBase> dlg;
|
||||||
std::shared_ptr<rsx::overlays::message_dialog> native_dlg;
|
std::shared_ptr<rsx::overlays::progress_dialog> native_dlg;
|
||||||
|
|
||||||
if (const auto renderer = rsx::get_current_renderer();
|
if (const auto renderer = rsx::get_current_renderer();
|
||||||
renderer && renderer->is_inited)
|
renderer && renderer->is_inited)
|
||||||
|
@ -379,7 +388,7 @@ namespace
|
||||||
type.disable_cancel = true;
|
type.disable_cancel = true;
|
||||||
type.progress_bar_count = 1;
|
type.progress_bar_count = 1;
|
||||||
|
|
||||||
native_dlg = manager->create<rsx::overlays::message_dialog>(!!g_cfg.video.shader_preloading_dialog.use_custom_background);
|
native_dlg = manager->create<rsx::overlays::progress_dialog>(!!g_cfg.video.shader_preloading_dialog.use_custom_background);
|
||||||
native_dlg->show(false, text0, type, nullptr);
|
native_dlg->show(false, text0, type, nullptr);
|
||||||
native_dlg->progress_bar_set_message(0, "Please wait");
|
native_dlg->progress_bar_set_message(0, "Please wait");
|
||||||
}
|
}
|
||||||
|
@ -442,29 +451,30 @@ namespace
|
||||||
const u64 done = pdone * std::max<u64>(fdone, 1);
|
const u64 done = pdone * std::max<u64>(fdone, 1);
|
||||||
const double value = std::fmin(done * 100. / total, 100.);
|
const double value = std::fmin(done * 100. / total, 100.);
|
||||||
|
|
||||||
|
std::string progr = "Progress:";
|
||||||
|
|
||||||
|
if (ftotal)
|
||||||
|
fmt::append(progr, " file %u of %u%s", fdone, ftotal, ptotal ? "," : "");
|
||||||
|
if (ptotal)
|
||||||
|
fmt::append(progr, " module %u of %u", pdone, ptotal);
|
||||||
|
|
||||||
// Changes detected, send update
|
// Changes detected, send update
|
||||||
Emu.CallAfter([=]()
|
if (native_dlg)
|
||||||
{
|
{
|
||||||
std::string progr = "Progress:";
|
native_dlg->set_text(text_new ? text_new : "");
|
||||||
|
native_dlg->progress_bar_set_message(0, progr);
|
||||||
if (ftotal)
|
native_dlg->progress_bar_set_value(0, std::floor(value));
|
||||||
fmt::append(progr, " file %u of %u%s", fdone, ftotal, ptotal ? "," : "");
|
}
|
||||||
if (ptotal)
|
else if (dlg)
|
||||||
fmt::append(progr, " module %u of %u", pdone, ptotal);
|
{
|
||||||
|
Emu.CallAfter([=]()
|
||||||
if (native_dlg)
|
|
||||||
{
|
|
||||||
native_dlg->set_text(text_new ? text_new : "");
|
|
||||||
native_dlg->progress_bar_set_message(0, progr);
|
|
||||||
native_dlg->progress_bar_set_value(0, std::floor(value));
|
|
||||||
}
|
|
||||||
else if (dlg)
|
|
||||||
{
|
{
|
||||||
dlg->SetMsg(text_new ? text_new : "");
|
dlg->SetMsg(text_new ? text_new : "");
|
||||||
dlg->ProgressBarSetMsg(0, progr);
|
dlg->ProgressBarSetMsg(0, progr);
|
||||||
dlg->ProgressBarSetValue(0, std::floor(value));
|
dlg->ProgressBarSetValue(0, std::floor(value));
|
||||||
}
|
});
|
||||||
});
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!text_new)
|
if (!text_new)
|
||||||
|
@ -482,10 +492,10 @@ namespace
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
g_progr_ftotal -= ftotal;
|
|
||||||
g_progr_fdone -= fdone;
|
g_progr_fdone -= fdone;
|
||||||
g_progr_ptotal -= ptotal;
|
|
||||||
g_progr_pdone -= pdone;
|
g_progr_pdone -= pdone;
|
||||||
|
g_progr_ftotal -= ftotal;
|
||||||
|
g_progr_ptotal -= ptotal;
|
||||||
|
|
||||||
if (skip_this_one)
|
if (skip_this_one)
|
||||||
{
|
{
|
||||||
|
@ -493,17 +503,19 @@ namespace
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Emu.CallAfter([=]()
|
if (native_dlg)
|
||||||
{
|
{
|
||||||
if (native_dlg)
|
native_dlg->close(false, false);
|
||||||
{
|
}
|
||||||
native_dlg->close(false, false);
|
else if (dlg)
|
||||||
}
|
{
|
||||||
else if (dlg)
|
Emu.CallAfter([=]()
|
||||||
{
|
{
|
||||||
dlg->Close(true);
|
dlg->Close(true);
|
||||||
}
|
});
|
||||||
});
|
}
|
||||||
|
|
||||||
|
g_progr_ptotal.notify_all();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue