diff options
Diffstat (limited to 'src/yuzu')
| -rw-r--r-- | src/yuzu/applets/qt_amiibo_settings.cpp | 11 | ||||
| -rw-r--r-- | src/yuzu/applets/qt_amiibo_settings.h | 2 | ||||
| -rw-r--r-- | src/yuzu/applets/qt_controller.cpp | 17 | ||||
| -rw-r--r-- | src/yuzu/applets/qt_controller.h | 4 | ||||
| -rw-r--r-- | src/yuzu/applets/qt_controller.ui | 8 | ||||
| -rw-r--r-- | src/yuzu/applets/qt_error.cpp | 11 | ||||
| -rw-r--r-- | src/yuzu/applets/qt_error.h | 2 | ||||
| -rw-r--r-- | src/yuzu/applets/qt_profile_select.cpp | 96 | ||||
| -rw-r--r-- | src/yuzu/applets/qt_profile_select.h | 13 | ||||
| -rw-r--r-- | src/yuzu/applets/qt_software_keyboard.h | 4 | ||||
| -rw-r--r-- | src/yuzu/applets/qt_web_browser.cpp | 11 | ||||
| -rw-r--r-- | src/yuzu/applets/qt_web_browser.h | 2 | ||||
| -rw-r--r-- | src/yuzu/main.cpp | 183 | ||||
| -rw-r--r-- | src/yuzu/main.h | 21 | 
14 files changed, 309 insertions, 76 deletions
| diff --git a/src/yuzu/applets/qt_amiibo_settings.cpp b/src/yuzu/applets/qt_amiibo_settings.cpp index 93ad4b4f9..4559df5b1 100644 --- a/src/yuzu/applets/qt_amiibo_settings.cpp +++ b/src/yuzu/applets/qt_amiibo_settings.cpp @@ -245,12 +245,19 @@ void QtAmiiboSettingsDialog::SetSettingsDescription() {  QtAmiiboSettings::QtAmiiboSettings(GMainWindow& parent) {      connect(this, &QtAmiiboSettings::MainWindowShowAmiiboSettings, &parent,              &GMainWindow::AmiiboSettingsShowDialog, Qt::QueuedConnection); +    connect(this, &QtAmiiboSettings::MainWindowRequestExit, &parent, +            &GMainWindow::AmiiboSettingsRequestExit, Qt::QueuedConnection);      connect(&parent, &GMainWindow::AmiiboSettingsFinished, this,              &QtAmiiboSettings::MainWindowFinished, Qt::QueuedConnection);  }  QtAmiiboSettings::~QtAmiiboSettings() = default; +void QtAmiiboSettings::Close() const { +    callback = {}; +    emit MainWindowRequestExit(); +} +  void QtAmiiboSettings::ShowCabinetApplet(      const Core::Frontend::CabinetCallback& callback_,      const Core::Frontend::CabinetParameters& parameters, @@ -260,5 +267,7 @@ void QtAmiiboSettings::ShowCabinetApplet(  }  void QtAmiiboSettings::MainWindowFinished(bool is_success, const std::string& name) { -    callback(is_success, name); +    if (callback) { +        callback(is_success, name); +    }  } diff --git a/src/yuzu/applets/qt_amiibo_settings.h b/src/yuzu/applets/qt_amiibo_settings.h index 930c96739..bc389a33f 100644 --- a/src/yuzu/applets/qt_amiibo_settings.h +++ b/src/yuzu/applets/qt_amiibo_settings.h @@ -68,6 +68,7 @@ public:      explicit QtAmiiboSettings(GMainWindow& parent);      ~QtAmiiboSettings() override; +    void Close() const override;      void ShowCabinetApplet(const Core::Frontend::CabinetCallback& callback_,                             const Core::Frontend::CabinetParameters& parameters,                             std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const override; @@ -75,6 +76,7 @@ public:  signals:      void MainWindowShowAmiiboSettings(const Core::Frontend::CabinetParameters& parameters,                                        std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const; +    void MainWindowRequestExit() const;  private:      void MainWindowFinished(bool is_success, const std::string& name); diff --git a/src/yuzu/applets/qt_controller.cpp b/src/yuzu/applets/qt_controller.cpp index c30b54499..00aafb8f8 100644 --- a/src/yuzu/applets/qt_controller.cpp +++ b/src/yuzu/applets/qt_controller.cpp @@ -300,7 +300,7 @@ bool QtControllerSelectorDialog::CheckIfParametersMet() {      if (num_connected_players < min_supported_players ||          num_connected_players > max_supported_players) {          parameters_met = false; -        ui->buttonBox->setEnabled(parameters_met); +        ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(parameters_met);          return parameters_met;      } @@ -327,7 +327,7 @@ bool QtControllerSelectorDialog::CheckIfParametersMet() {      }();      parameters_met = all_controllers_compatible; -    ui->buttonBox->setEnabled(parameters_met); +    ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(parameters_met);      return parameters_met;  } @@ -678,18 +678,27 @@ void QtControllerSelectorDialog::DisableUnsupportedPlayers() {  QtControllerSelector::QtControllerSelector(GMainWindow& parent) {      connect(this, &QtControllerSelector::MainWindowReconfigureControllers, &parent,              &GMainWindow::ControllerSelectorReconfigureControllers, Qt::QueuedConnection); +    connect(this, &QtControllerSelector::MainWindowRequestExit, &parent, +            &GMainWindow::ControllerSelectorRequestExit, Qt::QueuedConnection);      connect(&parent, &GMainWindow::ControllerSelectorReconfigureFinished, this,              &QtControllerSelector::MainWindowReconfigureFinished, Qt::QueuedConnection);  }  QtControllerSelector::~QtControllerSelector() = default; +void QtControllerSelector::Close() const { +    callback = {}; +    emit MainWindowRequestExit(); +} +  void QtControllerSelector::ReconfigureControllers(      ReconfigureCallback callback_, const Core::Frontend::ControllerParameters& parameters) const {      callback = std::move(callback_);      emit MainWindowReconfigureControllers(parameters);  } -void QtControllerSelector::MainWindowReconfigureFinished() { -    callback(); +void QtControllerSelector::MainWindowReconfigureFinished(bool is_success) { +    if (callback) { +        callback(is_success); +    }  } diff --git a/src/yuzu/applets/qt_controller.h b/src/yuzu/applets/qt_controller.h index 16e99f507..2fdc35857 100644 --- a/src/yuzu/applets/qt_controller.h +++ b/src/yuzu/applets/qt_controller.h @@ -156,6 +156,7 @@ public:      explicit QtControllerSelector(GMainWindow& parent);      ~QtControllerSelector() override; +    void Close() const override;      void ReconfigureControllers(          ReconfigureCallback callback_,          const Core::Frontend::ControllerParameters& parameters) const override; @@ -163,9 +164,10 @@ public:  signals:      void MainWindowReconfigureControllers(          const Core::Frontend::ControllerParameters& parameters) const; +    void MainWindowRequestExit() const;  private: -    void MainWindowReconfigureFinished(); +    void MainWindowReconfigureFinished(bool is_success);      mutable ReconfigureCallback callback;  }; diff --git a/src/yuzu/applets/qt_controller.ui b/src/yuzu/applets/qt_controller.ui index f5eccba70..729e921ee 100644 --- a/src/yuzu/applets/qt_controller.ui +++ b/src/yuzu/applets/qt_controller.ui @@ -2629,7 +2629,7 @@              <bool>true</bool>             </property>             <property name="standardButtons"> -            <set>QDialogButtonBox::Ok</set> +            <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>             </property>            </widget>           </item> @@ -2649,5 +2649,11 @@     <receiver>QtControllerSelectorDialog</receiver>     <slot>accept()</slot>    </connection> +  <connection> +   <sender>buttonBox</sender> +   <signal>rejected()</signal> +   <receiver>QtControllerSelectorDialog</receiver> +   <slot>reject()</slot> +  </connection>   </connections>  </ui> diff --git a/src/yuzu/applets/qt_error.cpp b/src/yuzu/applets/qt_error.cpp index e0190a979..1dc4f0383 100644 --- a/src/yuzu/applets/qt_error.cpp +++ b/src/yuzu/applets/qt_error.cpp @@ -8,12 +8,19 @@  QtErrorDisplay::QtErrorDisplay(GMainWindow& parent) {      connect(this, &QtErrorDisplay::MainWindowDisplayError, &parent,              &GMainWindow::ErrorDisplayDisplayError, Qt::QueuedConnection); +    connect(this, &QtErrorDisplay::MainWindowRequestExit, &parent, +            &GMainWindow::ErrorDisplayRequestExit, Qt::QueuedConnection);      connect(&parent, &GMainWindow::ErrorDisplayFinished, this,              &QtErrorDisplay::MainWindowFinishedError, Qt::DirectConnection);  }  QtErrorDisplay::~QtErrorDisplay() = default; +void QtErrorDisplay::Close() const { +    callback = {}; +    emit MainWindowRequestExit(); +} +  void QtErrorDisplay::ShowError(Result error, FinishedCallback finished) const {      callback = std::move(finished);      emit MainWindowDisplayError( @@ -55,5 +62,7 @@ void QtErrorDisplay::ShowCustomErrorText(Result error, std::string dialog_text,  }  void QtErrorDisplay::MainWindowFinishedError() { -    callback(); +    if (callback) { +        callback(); +    }  } diff --git a/src/yuzu/applets/qt_error.h b/src/yuzu/applets/qt_error.h index e4e174721..957f170ad 100644 --- a/src/yuzu/applets/qt_error.h +++ b/src/yuzu/applets/qt_error.h @@ -16,6 +16,7 @@ public:      explicit QtErrorDisplay(GMainWindow& parent);      ~QtErrorDisplay() override; +    void Close() const override;      void ShowError(Result error, FinishedCallback finished) const override;      void ShowErrorWithTimestamp(Result error, std::chrono::seconds time,                                  FinishedCallback finished) const override; @@ -24,6 +25,7 @@ public:  signals:      void MainWindowDisplayError(QString error_code, QString error_text) const; +    void MainWindowRequestExit() const;  private:      void MainWindowFinishedError(); diff --git a/src/yuzu/applets/qt_profile_select.cpp b/src/yuzu/applets/qt_profile_select.cpp index 4145c5299..2448e46b6 100644 --- a/src/yuzu/applets/qt_profile_select.cpp +++ b/src/yuzu/applets/qt_profile_select.cpp @@ -46,11 +46,13 @@ QPixmap GetIcon(Common::UUID uuid) {  }  } // Anonymous namespace -QtProfileSelectionDialog::QtProfileSelectionDialog(Core::HID::HIDCore& hid_core, QWidget* parent) +QtProfileSelectionDialog::QtProfileSelectionDialog( +    Core::HID::HIDCore& hid_core, QWidget* parent, +    const Core::Frontend::ProfileSelectParameters& parameters)      : QDialog(parent), profile_manager(std::make_unique<Service::Account::ProfileManager>()) {      outer_layout = new QVBoxLayout; -    instruction_label = new QLabel(tr("Select a user:")); +    instruction_label = new QLabel();      scroll_area = new QScrollArea; @@ -120,7 +122,8 @@ QtProfileSelectionDialog::QtProfileSelectionDialog(Core::HID::HIDCore& hid_core,          item_model->appendRow(item);      setLayout(outer_layout); -    setWindowTitle(tr("Profile Selector")); +    SetWindowTitle(parameters); +    SetDialogPurpose(parameters);      resize(550, 400);  } @@ -154,20 +157,101 @@ void QtProfileSelectionDialog::SelectUser(const QModelIndex& index) {      user_index = index.row();  } +void QtProfileSelectionDialog::SetWindowTitle( +    const Core::Frontend::ProfileSelectParameters& parameters) { +    using Service::AM::Applets::UiMode; +    switch (parameters.mode) { +    case UiMode::UserCreator: +    case UiMode::UserCreatorForStarter: +        setWindowTitle(tr("Profile Creator")); +        return; +    case UiMode::EnsureNetworkServiceAccountAvailable: +        setWindowTitle(tr("Profile Selector")); +        return; +    case UiMode::UserIconEditor: +        setWindowTitle(tr("Profile Icon Editor")); +        return; +    case UiMode::UserNicknameEditor: +        setWindowTitle(tr("Profile Nickname Editor")); +        return; +    case UiMode::NintendoAccountAuthorizationRequestContext: +    case UiMode::IntroduceExternalNetworkServiceAccount: +    case UiMode::IntroduceExternalNetworkServiceAccountForRegistration: +    case UiMode::NintendoAccountNnidLinker: +    case UiMode::LicenseRequirementsForNetworkService: +    case UiMode::LicenseRequirementsForNetworkServiceWithUserContextImpl: +    case UiMode::UserCreatorForImmediateNaLoginTest: +    case UiMode::UserQualificationPromoter: +    case UiMode::UserSelector: +    default: +        setWindowTitle(tr("Profile Selector")); +    } +} + +void QtProfileSelectionDialog::SetDialogPurpose( +    const Core::Frontend::ProfileSelectParameters& parameters) { +    using Service::AM::Applets::UserSelectionPurpose; + +    switch (parameters.purpose) { +    case UserSelectionPurpose::GameCardRegistration: +        instruction_label->setText(tr("Who will receive the points?")); +        return; +    case UserSelectionPurpose::EShopLaunch: +        instruction_label->setText(tr("Who is using Nintendo eShop?")); +        return; +    case UserSelectionPurpose::EShopItemShow: +        instruction_label->setText(tr("Who is making this purchase?")); +        return; +    case UserSelectionPurpose::PicturePost: +        instruction_label->setText(tr("Who is posting?")); +        return; +    case UserSelectionPurpose::NintendoAccountLinkage: +        instruction_label->setText(tr("Select a user to link to a Nintendo Account.")); +        return; +    case UserSelectionPurpose::SettingsUpdate: +        instruction_label->setText(tr("Change settings for which user?")); +        return; +    case UserSelectionPurpose::SaveDataDeletion: +        instruction_label->setText(tr("Format data for which user?")); +        return; +    case UserSelectionPurpose::UserMigration: +        instruction_label->setText(tr("Which user will be transferred to another console?")); +        return; +    case UserSelectionPurpose::SaveDataTransfer: +        instruction_label->setText(tr("Send save data for which user?")); +        return; +    case UserSelectionPurpose::General: +    default: +        instruction_label->setText(tr("Select a user:")); +        return; +    } +} +  QtProfileSelector::QtProfileSelector(GMainWindow& parent) {      connect(this, &QtProfileSelector::MainWindowSelectProfile, &parent,              &GMainWindow::ProfileSelectorSelectProfile, Qt::QueuedConnection); +    connect(this, &QtProfileSelector::MainWindowRequestExit, &parent, +            &GMainWindow::ProfileSelectorRequestExit, Qt::QueuedConnection);      connect(&parent, &GMainWindow::ProfileSelectorFinishedSelection, this,              &QtProfileSelector::MainWindowFinishedSelection, Qt::DirectConnection);  }  QtProfileSelector::~QtProfileSelector() = default; -void QtProfileSelector::SelectProfile(SelectProfileCallback callback_) const { +void QtProfileSelector::Close() const { +    callback = {}; +    emit MainWindowRequestExit(); +} + +void QtProfileSelector::SelectProfile( +    SelectProfileCallback callback_, +    const Core::Frontend::ProfileSelectParameters& parameters) const {      callback = std::move(callback_); -    emit MainWindowSelectProfile(); +    emit MainWindowSelectProfile(parameters);  }  void QtProfileSelector::MainWindowFinishedSelection(std::optional<Common::UUID> uuid) { -    callback(uuid); +    if (callback) { +        callback(uuid); +    }  } diff --git a/src/yuzu/applets/qt_profile_select.h b/src/yuzu/applets/qt_profile_select.h index 637a3bda2..99056e274 100644 --- a/src/yuzu/applets/qt_profile_select.h +++ b/src/yuzu/applets/qt_profile_select.h @@ -28,7 +28,8 @@ class QtProfileSelectionDialog final : public QDialog {      Q_OBJECT  public: -    explicit QtProfileSelectionDialog(Core::HID::HIDCore& hid_core, QWidget* parent); +    explicit QtProfileSelectionDialog(Core::HID::HIDCore& hid_core, QWidget* parent, +                                      const Core::Frontend::ProfileSelectParameters& parameters);      ~QtProfileSelectionDialog() override;      int exec() override; @@ -40,6 +41,9 @@ public:  private:      void SelectUser(const QModelIndex& index); +    void SetWindowTitle(const Core::Frontend::ProfileSelectParameters& parameters); +    void SetDialogPurpose(const Core::Frontend::ProfileSelectParameters& parameters); +      int user_index = 0;      QVBoxLayout* layout; @@ -65,10 +69,13 @@ public:      explicit QtProfileSelector(GMainWindow& parent);      ~QtProfileSelector() override; -    void SelectProfile(SelectProfileCallback callback_) const override; +    void Close() const override; +    void SelectProfile(SelectProfileCallback callback_, +                       const Core::Frontend::ProfileSelectParameters& parameters) const override;  signals: -    void MainWindowSelectProfile() const; +    void MainWindowSelectProfile(const Core::Frontend::ProfileSelectParameters& parameters) const; +    void MainWindowRequestExit() const;  private:      void MainWindowFinishedSelection(std::optional<Common::UUID> uuid); diff --git a/src/yuzu/applets/qt_software_keyboard.h b/src/yuzu/applets/qt_software_keyboard.h index 30ac8ecf6..ac23ce047 100644 --- a/src/yuzu/applets/qt_software_keyboard.h +++ b/src/yuzu/applets/qt_software_keyboard.h @@ -233,6 +233,10 @@ public:      explicit QtSoftwareKeyboard(GMainWindow& parent);      ~QtSoftwareKeyboard() override; +    void Close() const override { +        ExitKeyboard(); +    } +      void InitializeKeyboard(bool is_inline,                              Core::Frontend::KeyboardInitializeParameters initialize_parameters,                              SubmitNormalCallback submit_normal_callback_, diff --git a/src/yuzu/applets/qt_web_browser.cpp b/src/yuzu/applets/qt_web_browser.cpp index 0a5912326..28acc0ff8 100644 --- a/src/yuzu/applets/qt_web_browser.cpp +++ b/src/yuzu/applets/qt_web_browser.cpp @@ -393,6 +393,8 @@ void QtNXWebEngineView::FocusFirstLinkElement() {  QtWebBrowser::QtWebBrowser(GMainWindow& main_window) {      connect(this, &QtWebBrowser::MainWindowOpenWebPage, &main_window,              &GMainWindow::WebBrowserOpenWebPage, Qt::QueuedConnection); +    connect(this, &QtWebBrowser::MainWindowRequestExit, &main_window, +            &GMainWindow::WebBrowserRequestExit, Qt::QueuedConnection);      connect(&main_window, &GMainWindow::WebBrowserExtractOfflineRomFS, this,              &QtWebBrowser::MainWindowExtractOfflineRomFS, Qt::QueuedConnection);      connect(&main_window, &GMainWindow::WebBrowserClosed, this, @@ -401,6 +403,11 @@ QtWebBrowser::QtWebBrowser(GMainWindow& main_window) {  QtWebBrowser::~QtWebBrowser() = default; +void QtWebBrowser::Close() const { +    callback = {}; +    emit MainWindowRequestExit(); +} +  void QtWebBrowser::OpenLocalWebPage(const std::string& local_url,                                      ExtractROMFSCallback extract_romfs_callback_,                                      OpenWebPageCallback callback_) const { @@ -436,5 +443,7 @@ void QtWebBrowser::MainWindowExtractOfflineRomFS() {  void QtWebBrowser::MainWindowWebBrowserClosed(Service::AM::Applets::WebExitReason exit_reason,                                                std::string last_url) { -    callback(exit_reason, last_url); +    if (callback) { +        callback(exit_reason, last_url); +    }  } diff --git a/src/yuzu/applets/qt_web_browser.h b/src/yuzu/applets/qt_web_browser.h index ceae7926e..1234108ae 100644 --- a/src/yuzu/applets/qt_web_browser.h +++ b/src/yuzu/applets/qt_web_browser.h @@ -196,6 +196,7 @@ public:      explicit QtWebBrowser(GMainWindow& parent);      ~QtWebBrowser() override; +    void Close() const override;      void OpenLocalWebPage(const std::string& local_url,                            ExtractROMFSCallback extract_romfs_callback_,                            OpenWebPageCallback callback_) const override; @@ -206,6 +207,7 @@ public:  signals:      void MainWindowOpenWebPage(const std::string& main_url, const std::string& additional_args,                                 bool is_local) const; +    void MainWindowRequestExit() const;  private:      void MainWindowExtractOfflineRomFS(); diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index ae14884b5..b79409a68 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -307,6 +307,8 @@ GMainWindow::GMainWindow(std::unique_ptr<Config> config_, bool has_broken_vulkan      system->Initialize();      Common::Log::Initialize(); +    Common::Log::Start(); +      LoadTranslation();      setAcceptDrops(true); @@ -449,8 +451,6 @@ GMainWindow::GMainWindow(std::unique_ptr<Config> config_, bool has_broken_vulkan      SetupPrepareForSleep(); -    Common::Log::Start(); -      QStringList args = QApplication::arguments();      if (args.size() < 2) { @@ -576,6 +576,10 @@ void GMainWindow::RegisterMetaTypes() {      // Controller Applet      qRegisterMetaType<Core::Frontend::ControllerParameters>("Core::Frontend::ControllerParameters"); +    // Profile Select Applet +    qRegisterMetaType<Core::Frontend::ProfileSelectParameters>( +        "Core::Frontend::ProfileSelectParameters"); +      // Software Keyboard Applet      qRegisterMetaType<Core::Frontend::KeyboardInitializeParameters>(          "Core::Frontend::KeyboardInitializeParameters"); @@ -596,50 +600,81 @@ 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); - -    dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint | -                          Qt::WindowTitleHint | Qt::WindowSystemMenuHint); -    dialog.setWindowModality(Qt::WindowModal); -    dialog.exec(); +    controller_applet = +        new QtControllerSelectorDialog(this, parameters, input_subsystem.get(), *system); +    SCOPE_EXIT({ +        controller_applet->deleteLater(); +        controller_applet = nullptr; +    }); -    emit ControllerSelectorReconfigureFinished(); +    controller_applet->setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | +                                      Qt::WindowStaysOnTopHint | Qt::WindowTitleHint | +                                      Qt::WindowSystemMenuHint); +    controller_applet->setWindowModality(Qt::WindowModal); +    bool is_success = controller_applet->exec() != QDialog::Rejected;      // Don't forget to apply settings. +    system->HIDCore().DisableAllControllerConfiguration();      system->ApplySettings();      config->Save();      UpdateStatusButtons(); + +    emit ControllerSelectorReconfigureFinished(is_success);  } -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) { +void GMainWindow::ControllerSelectorRequestExit() { +    if (controller_applet) { +        controller_applet->reject(); +    } +} + +void GMainWindow::ProfileSelectorSelectProfile( +    const Core::Frontend::ProfileSelectParameters& parameters) { +    profile_select_applet = new QtProfileSelectionDialog(system->HIDCore(), this, parameters); +    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 +683,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 +813,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 +840,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 +851,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 +872,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 +881,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 +903,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 +944,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); @@ -1675,8 +1725,9 @@ bool GMainWindow::LoadROM(const QString& filename, u64 program_id, std::size_t p      return true;  } -bool GMainWindow::SelectAndSetCurrentUser() { -    QtProfileSelectionDialog dialog(system->HIDCore(), this); +bool GMainWindow::SelectAndSetCurrentUser( +    const Core::Frontend::ProfileSelectParameters& parameters) { +    QtProfileSelectionDialog dialog(system->HIDCore(), this, parameters);      dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint |                            Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint);      dialog.setWindowModality(Qt::WindowModal); @@ -1722,7 +1773,13 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t      Settings::LogSettings();      if (UISettings::values.select_user_on_boot) { -        if (SelectAndSetCurrentUser() == false) { +        const Core::Frontend::ProfileSelectParameters parameters{ +            .mode = Service::AM::Applets::UiMode::UserSelector, +            .invalid_uid_list = {}, +            .display_options = {}, +            .purpose = Service::AM::Applets::UserSelectionPurpose::General, +        }; +        if (SelectAndSetCurrentUser(parameters) == false) {              return;          }      } @@ -2014,7 +2071,13 @@ void GMainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target          if (has_user_save) {              // User save data              const auto select_profile = [this] { -                QtProfileSelectionDialog dialog(system->HIDCore(), this); +                const Core::Frontend::ProfileSelectParameters parameters{ +                    .mode = Service::AM::Applets::UiMode::UserSelector, +                    .invalid_uid_list = {}, +                    .display_options = {}, +                    .purpose = Service::AM::Applets::UserSelectionPurpose::General, +                }; +                QtProfileSelectionDialog dialog(system->HIDCore(), this, parameters);                  dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint |                                        Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint);                  dialog.setWindowModality(Qt::WindowModal); @@ -3089,13 +3152,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(); diff --git a/src/yuzu/main.h b/src/yuzu/main.h index a23b373a5..8b5c1d747 100644 --- a/src/yuzu/main.h +++ b/src/yuzu/main.h @@ -47,7 +47,11 @@ enum class DumpRomFSTarget;  enum class InstalledEntryType;  class GameListPlaceholder; +class QtAmiiboSettingsDialog; +class QtControllerSelectorDialog; +class QtProfileSelectionDialog;  class QtSoftwareKeyboardDialog; +class QtNXWebEngineView;  enum class StartGameType {      Normal, // Can use custom configuration @@ -65,6 +69,7 @@ struct ControllerParameters;  struct InlineAppearParameters;  struct InlineTextParameters;  struct KeyboardInitializeParameters; +struct ProfileSelectParameters;  } // namespace Core::Frontend  namespace DiscordRPC { @@ -161,7 +166,7 @@ signals:      void AmiiboSettingsFinished(bool is_success, const std::string& name); -    void ControllerSelectorReconfigureFinished(); +    void ControllerSelectorReconfigureFinished(bool is_success);      void ErrorDisplayFinished(); @@ -184,8 +189,10 @@ public slots:      void OnSaveConfig();      void AmiiboSettingsShowDialog(const Core::Frontend::CabinetParameters& parameters,                                    std::shared_ptr<Service::NFP::NfpDevice> nfp_device); +    void AmiiboSettingsRequestExit();      void ControllerSelectorReconfigureControllers(          const Core::Frontend::ControllerParameters& parameters); +    void ControllerSelectorRequestExit();      void SoftwareKeyboardInitialize(          bool is_inline, Core::Frontend::KeyboardInitializeParameters initialize_parameters);      void SoftwareKeyboardShowNormal(); @@ -196,9 +203,12 @@ public slots:      void SoftwareKeyboardInlineTextChanged(Core::Frontend::InlineTextParameters text_parameters);      void SoftwareKeyboardExit();      void ErrorDisplayDisplayError(QString error_code, QString error_text); -    void ProfileSelectorSelectProfile(); +    void ErrorDisplayRequestExit(); +    void ProfileSelectorSelectProfile(const Core::Frontend::ProfileSelectParameters& parameters); +    void ProfileSelectorRequestExit();      void WebBrowserOpenWebPage(const std::string& main_url, const std::string& additional_args,                                 bool is_local); +    void WebBrowserRequestExit();      void OnAppFocusStateChanged(Qt::ApplicationState state);      void OnTasStateChanged(); @@ -233,7 +243,7 @@ private:      void SetDiscordEnabled(bool state);      void LoadAmiibo(const QString& filename); -    bool SelectAndSetCurrentUser(); +    bool SelectAndSetCurrentUser(const Core::Frontend::ProfileSelectParameters& parameters);      /**       * Stores the filename in the recently loaded files list. @@ -466,7 +476,12 @@ private:      QString last_filename_booted;      // Applets +    QtAmiiboSettingsDialog* cabinet_applet = nullptr; +    QtControllerSelectorDialog* controller_applet = nullptr; +    QtProfileSelectionDialog* profile_select_applet = nullptr; +    QDialog* error_applet = nullptr;      QtSoftwareKeyboardDialog* software_keyboard = nullptr; +    QtNXWebEngineView* web_applet = nullptr;      // True if amiibo file select is visible      bool is_amiibo_file_select_active{}; | 
