qt: implement RequestExit for applets
This commit is contained in:
parent
950db851ea
commit
50a59487eb
38 changed files with 250 additions and 69 deletions
|
@ -596,27 +596,45 @@ void GMainWindow::RegisterMetaTypes() {
|
|||
|
||||
void GMainWindow::AmiiboSettingsShowDialog(const Core::Frontend::CabinetParameters& parameters,
|
||||
std::shared_ptr<Service::NFP::NfpDevice> nfp_device) {
|
||||
QtAmiiboSettingsDialog dialog(this, parameters, input_subsystem.get(), nfp_device);
|
||||
cabinet_applet =
|
||||
new QtAmiiboSettingsDialog(this, parameters, input_subsystem.get(), nfp_device);
|
||||
SCOPE_EXIT({
|
||||
cabinet_applet->deleteLater();
|
||||
cabinet_applet = nullptr;
|
||||
});
|
||||
|
||||
dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint |
|
||||
Qt::WindowTitleHint | Qt::WindowSystemMenuHint);
|
||||
dialog.setWindowModality(Qt::WindowModal);
|
||||
if (dialog.exec() == QDialog::Rejected) {
|
||||
cabinet_applet->setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint |
|
||||
Qt::WindowTitleHint | Qt::WindowSystemMenuHint);
|
||||
cabinet_applet->setWindowModality(Qt::WindowModal);
|
||||
|
||||
if (cabinet_applet->exec() == QDialog::Rejected) {
|
||||
emit AmiiboSettingsFinished(false, {});
|
||||
return;
|
||||
}
|
||||
|
||||
emit AmiiboSettingsFinished(true, dialog.GetName());
|
||||
emit AmiiboSettingsFinished(true, cabinet_applet->GetName());
|
||||
}
|
||||
|
||||
void GMainWindow::AmiiboSettingsRequestExit() {
|
||||
if (cabinet_applet) {
|
||||
cabinet_applet->reject();
|
||||
}
|
||||
}
|
||||
|
||||
void GMainWindow::ControllerSelectorReconfigureControllers(
|
||||
const Core::Frontend::ControllerParameters& parameters) {
|
||||
QtControllerSelectorDialog dialog(this, parameters, input_subsystem.get(), *system);
|
||||
controller_applet =
|
||||
new QtControllerSelectorDialog(this, parameters, input_subsystem.get(), *system);
|
||||
SCOPE_EXIT({
|
||||
controller_applet->deleteLater();
|
||||
controller_applet = nullptr;
|
||||
});
|
||||
|
||||
dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint |
|
||||
Qt::WindowTitleHint | Qt::WindowSystemMenuHint);
|
||||
dialog.setWindowModality(Qt::WindowModal);
|
||||
dialog.exec();
|
||||
controller_applet->setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint |
|
||||
Qt::WindowStaysOnTopHint | Qt::WindowTitleHint |
|
||||
Qt::WindowSystemMenuHint);
|
||||
controller_applet->setWindowModality(Qt::WindowModal);
|
||||
controller_applet->exec();
|
||||
|
||||
emit ControllerSelectorReconfigureFinished();
|
||||
|
||||
|
@ -627,19 +645,30 @@ void GMainWindow::ControllerSelectorReconfigureControllers(
|
|||
UpdateStatusButtons();
|
||||
}
|
||||
|
||||
void GMainWindow::ControllerSelectorRequestExit() {
|
||||
if (controller_applet) {
|
||||
controller_applet->reject();
|
||||
}
|
||||
}
|
||||
|
||||
void GMainWindow::ProfileSelectorSelectProfile() {
|
||||
QtProfileSelectionDialog dialog(system->HIDCore(), this);
|
||||
dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint |
|
||||
Qt::WindowTitleHint | Qt::WindowSystemMenuHint |
|
||||
Qt::WindowCloseButtonHint);
|
||||
dialog.setWindowModality(Qt::WindowModal);
|
||||
if (dialog.exec() == QDialog::Rejected) {
|
||||
profile_select_applet = new QtProfileSelectionDialog(system->HIDCore(), this);
|
||||
SCOPE_EXIT({
|
||||
profile_select_applet->deleteLater();
|
||||
profile_select_applet = nullptr;
|
||||
});
|
||||
|
||||
profile_select_applet->setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint |
|
||||
Qt::WindowStaysOnTopHint | Qt::WindowTitleHint |
|
||||
Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint);
|
||||
profile_select_applet->setWindowModality(Qt::WindowModal);
|
||||
if (profile_select_applet->exec() == QDialog::Rejected) {
|
||||
emit ProfileSelectorFinishedSelection(std::nullopt);
|
||||
return;
|
||||
}
|
||||
|
||||
const Service::Account::ProfileManager manager;
|
||||
const auto uuid = manager.GetUser(static_cast<std::size_t>(dialog.GetIndex()));
|
||||
const auto uuid = manager.GetUser(static_cast<std::size_t>(profile_select_applet->GetIndex()));
|
||||
if (!uuid.has_value()) {
|
||||
emit ProfileSelectorFinishedSelection(std::nullopt);
|
||||
return;
|
||||
|
@ -648,6 +677,12 @@ void GMainWindow::ProfileSelectorSelectProfile() {
|
|||
emit ProfileSelectorFinishedSelection(uuid);
|
||||
}
|
||||
|
||||
void GMainWindow::ProfileSelectorRequestExit() {
|
||||
if (profile_select_applet) {
|
||||
profile_select_applet->reject();
|
||||
}
|
||||
}
|
||||
|
||||
void GMainWindow::SoftwareKeyboardInitialize(
|
||||
bool is_inline, Core::Frontend::KeyboardInitializeParameters initialize_parameters) {
|
||||
if (software_keyboard) {
|
||||
|
@ -772,7 +807,7 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,
|
|||
return;
|
||||
}
|
||||
|
||||
QtNXWebEngineView web_browser_view(this, *system, input_subsystem.get());
|
||||
web_applet = new QtNXWebEngineView(this, *system, input_subsystem.get());
|
||||
|
||||
ui->action_Pause->setEnabled(false);
|
||||
ui->action_Restart->setEnabled(false);
|
||||
|
@ -799,9 +834,9 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,
|
|||
loading_progress.setValue(1);
|
||||
|
||||
if (is_local) {
|
||||
web_browser_view.LoadLocalWebPage(main_url, additional_args);
|
||||
web_applet->LoadLocalWebPage(main_url, additional_args);
|
||||
} else {
|
||||
web_browser_view.LoadExternalWebPage(main_url, additional_args);
|
||||
web_applet->LoadExternalWebPage(main_url, additional_args);
|
||||
}
|
||||
|
||||
if (render_window->IsLoadingComplete()) {
|
||||
|
@ -810,15 +845,15 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,
|
|||
|
||||
const auto& layout = render_window->GetFramebufferLayout();
|
||||
const auto scale_ratio = devicePixelRatioF();
|
||||
web_browser_view.resize(layout.screen.GetWidth() / scale_ratio,
|
||||
layout.screen.GetHeight() / scale_ratio);
|
||||
web_browser_view.move(layout.screen.left / scale_ratio,
|
||||
(layout.screen.top / scale_ratio) + menuBar()->height());
|
||||
web_browser_view.setZoomFactor(static_cast<qreal>(layout.screen.GetWidth() / scale_ratio) /
|
||||
static_cast<qreal>(Layout::ScreenUndocked::Width));
|
||||
web_applet->resize(layout.screen.GetWidth() / scale_ratio,
|
||||
layout.screen.GetHeight() / scale_ratio);
|
||||
web_applet->move(layout.screen.left / scale_ratio,
|
||||
(layout.screen.top / scale_ratio) + menuBar()->height());
|
||||
web_applet->setZoomFactor(static_cast<qreal>(layout.screen.GetWidth() / scale_ratio) /
|
||||
static_cast<qreal>(Layout::ScreenUndocked::Width));
|
||||
|
||||
web_browser_view.setFocus();
|
||||
web_browser_view.show();
|
||||
web_applet->setFocus();
|
||||
web_applet->show();
|
||||
|
||||
loading_progress.setValue(2);
|
||||
|
||||
|
@ -831,7 +866,7 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,
|
|||
|
||||
// TODO (Morph): Remove this
|
||||
QAction* exit_action = new QAction(tr("Disable Web Applet"), this);
|
||||
connect(exit_action, &QAction::triggered, this, [this, &web_browser_view] {
|
||||
connect(exit_action, &QAction::triggered, this, [this] {
|
||||
const auto result = QMessageBox::warning(
|
||||
this, tr("Disable Web Applet"),
|
||||
tr("Disabling the web applet can lead to undefined behavior and should only be used "
|
||||
|
@ -840,21 +875,21 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,
|
|||
QMessageBox::Yes | QMessageBox::No);
|
||||
if (result == QMessageBox::Yes) {
|
||||
UISettings::values.disable_web_applet = true;
|
||||
web_browser_view.SetFinished(true);
|
||||
web_applet->SetFinished(true);
|
||||
}
|
||||
});
|
||||
ui->menubar->addAction(exit_action);
|
||||
|
||||
while (!web_browser_view.IsFinished()) {
|
||||
while (!web_applet->IsFinished()) {
|
||||
QCoreApplication::processEvents();
|
||||
|
||||
if (!exit_check) {
|
||||
web_browser_view.page()->runJavaScript(
|
||||
web_applet->page()->runJavaScript(
|
||||
QStringLiteral("end_applet;"), [&](const QVariant& variant) {
|
||||
exit_check = false;
|
||||
if (variant.toBool()) {
|
||||
web_browser_view.SetFinished(true);
|
||||
web_browser_view.SetExitReason(
|
||||
web_applet->SetFinished(true);
|
||||
web_applet->SetExitReason(
|
||||
Service::AM::Applets::WebExitReason::EndButtonPressed);
|
||||
}
|
||||
});
|
||||
|
@ -862,22 +897,22 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,
|
|||
exit_check = true;
|
||||
}
|
||||
|
||||
if (web_browser_view.GetCurrentURL().contains(QStringLiteral("localhost"))) {
|
||||
if (!web_browser_view.IsFinished()) {
|
||||
web_browser_view.SetFinished(true);
|
||||
web_browser_view.SetExitReason(Service::AM::Applets::WebExitReason::CallbackURL);
|
||||
if (web_applet->GetCurrentURL().contains(QStringLiteral("localhost"))) {
|
||||
if (!web_applet->IsFinished()) {
|
||||
web_applet->SetFinished(true);
|
||||
web_applet->SetExitReason(Service::AM::Applets::WebExitReason::CallbackURL);
|
||||
}
|
||||
|
||||
web_browser_view.SetLastURL(web_browser_view.GetCurrentURL().toStdString());
|
||||
web_applet->SetLastURL(web_applet->GetCurrentURL().toStdString());
|
||||
}
|
||||
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
||||
}
|
||||
|
||||
const auto exit_reason = web_browser_view.GetExitReason();
|
||||
const auto last_url = web_browser_view.GetLastURL();
|
||||
const auto exit_reason = web_applet->GetExitReason();
|
||||
const auto last_url = web_applet->GetLastURL();
|
||||
|
||||
web_browser_view.hide();
|
||||
web_applet->hide();
|
||||
|
||||
render_window->setFocus();
|
||||
|
||||
|
@ -903,6 +938,15 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,
|
|||
#endif
|
||||
}
|
||||
|
||||
void GMainWindow::WebBrowserRequestExit() {
|
||||
#ifdef YUZU_USE_QT_WEB_ENGINE
|
||||
if (web_applet) {
|
||||
web_applet->SetExitReason(Service::AM::Applets::WebExitReason::ExitRequested);
|
||||
web_applet->SetFinished(true);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void GMainWindow::InitializeWidgets() {
|
||||
#ifdef YUZU_ENABLE_COMPATIBILITY_REPORTING
|
||||
ui->action_Report_Compatibility->setVisible(true);
|
||||
|
@ -3089,13 +3133,23 @@ void GMainWindow::OnSaveConfig() {
|
|||
}
|
||||
|
||||
void GMainWindow::ErrorDisplayDisplayError(QString error_code, QString error_text) {
|
||||
OverlayDialog dialog(render_window, *system, error_code, error_text, QString{}, tr("OK"),
|
||||
Qt::AlignLeft | Qt::AlignVCenter);
|
||||
dialog.exec();
|
||||
error_applet = new OverlayDialog(render_window, *system, error_code, error_text, QString{},
|
||||
tr("OK"), Qt::AlignLeft | Qt::AlignVCenter);
|
||||
SCOPE_EXIT({
|
||||
error_applet->deleteLater();
|
||||
error_applet = nullptr;
|
||||
});
|
||||
error_applet->exec();
|
||||
|
||||
emit ErrorDisplayFinished();
|
||||
}
|
||||
|
||||
void GMainWindow::ErrorDisplayRequestExit() {
|
||||
if (error_applet) {
|
||||
error_applet->reject();
|
||||
}
|
||||
}
|
||||
|
||||
void GMainWindow::OnMenuReportCompatibility() {
|
||||
#if defined(ARCHITECTURE_x86_64) && !defined(__APPLE__)
|
||||
const auto& caps = Common::GetCPUCaps();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue