diff options
Diffstat (limited to 'src/yuzu/configuration')
51 files changed, 731 insertions, 347 deletions
| diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index 9df4752be..da6e5aa88 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -1,6 +1,5 @@ -// Copyright 2014 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2014 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #include <array>  #include <QKeySequence> @@ -11,6 +10,7 @@  #include "core/hle/service/acc/profile_manager.h"  #include "core/hle/service/hid/controllers/npad.h"  #include "input_common/main.h" +#include "network/network.h"  #include "yuzu/configuration/config.h"  namespace FS = Common::FS; @@ -73,7 +73,7 @@ const std::array<int, 2> Config::default_ringcon_analogs{{  const std::array<UISettings::Shortcut, 22> Config::default_hotkeys{{      {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Audio Mute/Unmute")),        QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")), {QStringLiteral("Ctrl+M"),  QStringLiteral("Home+Dpad_Right"), Qt::WindowShortcut}},      {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Audio Volume Down")),        QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")), {QStringLiteral("-"),       QStringLiteral("Home+Dpad_Down"), Qt::ApplicationShortcut}}, -    {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Audio Volume Up")),          QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")), {QStringLiteral("+"),       QStringLiteral("Home+Dpad_Up"), Qt::ApplicationShortcut}}, +    {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Audio Volume Up")),          QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")), {QStringLiteral("="),       QStringLiteral("Home+Dpad_Up"), Qt::ApplicationShortcut}},      {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Capture Screenshot")),       QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")), {QStringLiteral("Ctrl+P"),  QStringLiteral("Screenshot"), Qt::WidgetWithChildrenShortcut}},      {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Change Adapting Filter")),   QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")), {QStringLiteral("F8"),      QStringLiteral("Home+L"), Qt::ApplicationShortcut}},      {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Change Docked Mode")),       QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")), {QStringLiteral("F10"),     QStringLiteral("Home+X"), Qt::ApplicationShortcut}}, @@ -133,7 +133,7 @@ void Config::Initialize(const std::string& config_name) {  // Explicit std::string definition: Qt can't implicitly convert a std::string to a QVariant, nor  // can it implicitly convert a QVariant back to a {std::,Q}string  template <> -void Config::ReadBasicSetting(Settings::BasicSetting<std::string>& setting) { +void Config::ReadBasicSetting(Settings::Setting<std::string>& setting) {      const QString name = QString::fromStdString(setting.GetLabel());      const auto default_value = QString::fromStdString(setting.GetDefault());      if (qt_config->value(name + QStringLiteral("/default"), false).toBool()) { @@ -143,8 +143,8 @@ void Config::ReadBasicSetting(Settings::BasicSetting<std::string>& setting) {      }  } -template <typename Type> -void Config::ReadBasicSetting(Settings::BasicSetting<Type>& setting) { +template <typename Type, bool ranged> +void Config::ReadBasicSetting(Settings::Setting<Type, ranged>& setting) {      const QString name = QString::fromStdString(setting.GetLabel());      const Type default_value = setting.GetDefault();      if (qt_config->value(name + QStringLiteral("/default"), false).toBool()) { @@ -157,23 +157,23 @@ void Config::ReadBasicSetting(Settings::BasicSetting<Type>& setting) {  // Explicit std::string definition: Qt can't implicitly convert a std::string to a QVariant  template <> -void Config::WriteBasicSetting(const Settings::BasicSetting<std::string>& setting) { +void Config::WriteBasicSetting(const Settings::Setting<std::string>& setting) {      const QString name = QString::fromStdString(setting.GetLabel());      const std::string& value = setting.GetValue();      qt_config->setValue(name + QStringLiteral("/default"), value == setting.GetDefault());      qt_config->setValue(name, QString::fromStdString(value));  } -template <typename Type> -void Config::WriteBasicSetting(const Settings::BasicSetting<Type>& setting) { +template <typename Type, bool ranged> +void Config::WriteBasicSetting(const Settings::Setting<Type, ranged>& setting) {      const QString name = QString::fromStdString(setting.GetLabel());      const Type value = setting.GetValue();      qt_config->setValue(name + QStringLiteral("/default"), value == setting.GetDefault());      qt_config->setValue(name, value);  } -template <typename Type> -void Config::WriteGlobalSetting(const Settings::Setting<Type>& setting) { +template <typename Type, bool ranged> +void Config::WriteGlobalSetting(const Settings::SwitchableSetting<Type, ranged>& setting) {      const QString name = QString::fromStdString(setting.GetLabel());      const Type& value = setting.GetValue(global);      if (!global) { @@ -368,12 +368,18 @@ void Config::ReadHidbusValues() {      }  } +void Config::ReadIrCameraValues() { +    ReadBasicSetting(Settings::values.enable_ir_sensor); +    ReadBasicSetting(Settings::values.ir_sensor_device); +} +  void Config::ReadAudioValues() {      qt_config->beginGroup(QStringLiteral("Audio"));      if (global) { -        ReadBasicSetting(Settings::values.audio_device_id);          ReadBasicSetting(Settings::values.sink_id); +        ReadBasicSetting(Settings::values.audio_output_device_id); +        ReadBasicSetting(Settings::values.audio_input_device_id);      }      ReadGlobalSetting(Settings::values.volume); @@ -392,6 +398,7 @@ void Config::ReadControlValues() {      ReadTouchscreenValues();      ReadMotionTouchValues();      ReadHidbusValues(); +    ReadIrCameraValues();  #ifdef _WIN32      ReadBasicSetting(Settings::values.enable_raw_input); @@ -668,7 +675,6 @@ void Config::ReadRendererValues() {      ReadGlobalSetting(Settings::values.max_anisotropy);      ReadGlobalSetting(Settings::values.use_speed_limit);      ReadGlobalSetting(Settings::values.speed_limit); -    ReadGlobalSetting(Settings::values.fps_cap);      ReadGlobalSetting(Settings::values.use_disk_shader_cache);      ReadGlobalSetting(Settings::values.gpu_accuracy);      ReadGlobalSetting(Settings::values.use_asynchronous_gpu_emulation); @@ -682,12 +688,6 @@ void Config::ReadRendererValues() {      ReadGlobalSetting(Settings::values.bg_green);      ReadGlobalSetting(Settings::values.bg_blue); -    if (!global && UISettings::values.has_broken_vulkan && -        Settings::values.renderer_backend.GetValue() == Settings::RendererBackend::Vulkan && -        !Settings::values.renderer_backend.UsingGlobal()) { -        Settings::values.renderer_backend.SetGlobal(true); -    } -      if (global) {          ReadBasicSetting(Settings::values.renderer_debug);          ReadBasicSetting(Settings::values.renderer_shader_feedback); @@ -794,6 +794,7 @@ void Config::ReadUIValues() {      ReadPathValues();      ReadScreenshotValues();      ReadShortcutValues(); +    ReadMultiplayerValues();      ReadBasicSetting(UISettings::values.single_window_mode);      ReadBasicSetting(UISettings::values.fullscreen); @@ -807,7 +808,6 @@ void Config::ReadUIValues() {      ReadBasicSetting(UISettings::values.pause_when_in_background);      ReadBasicSetting(UISettings::values.mute_when_in_background);      ReadBasicSetting(UISettings::values.hide_mouse); -    ReadBasicSetting(UISettings::values.has_broken_vulkan);      ReadBasicSetting(UISettings::values.disable_web_applet);      qt_config->endGroup(); @@ -861,6 +861,42 @@ void Config::ReadWebServiceValues() {      qt_config->endGroup();  } +void Config::ReadMultiplayerValues() { +    qt_config->beginGroup(QStringLiteral("Multiplayer")); + +    ReadBasicSetting(UISettings::values.multiplayer_nickname); +    ReadBasicSetting(UISettings::values.multiplayer_ip); +    ReadBasicSetting(UISettings::values.multiplayer_port); +    ReadBasicSetting(UISettings::values.multiplayer_room_nickname); +    ReadBasicSetting(UISettings::values.multiplayer_room_name); +    ReadBasicSetting(UISettings::values.multiplayer_room_port); +    ReadBasicSetting(UISettings::values.multiplayer_host_type); +    ReadBasicSetting(UISettings::values.multiplayer_port); +    ReadBasicSetting(UISettings::values.multiplayer_max_player); +    ReadBasicSetting(UISettings::values.multiplayer_game_id); +    ReadBasicSetting(UISettings::values.multiplayer_room_description); + +    // Read ban list back +    int size = qt_config->beginReadArray(QStringLiteral("username_ban_list")); +    UISettings::values.multiplayer_ban_list.first.resize(size); +    for (int i = 0; i < size; ++i) { +        qt_config->setArrayIndex(i); +        UISettings::values.multiplayer_ban_list.first[i] = +            ReadSetting(QStringLiteral("username")).toString().toStdString(); +    } +    qt_config->endArray(); +    size = qt_config->beginReadArray(QStringLiteral("ip_ban_list")); +    UISettings::values.multiplayer_ban_list.second.resize(size); +    for (int i = 0; i < size; ++i) { +        qt_config->setArrayIndex(i); +        UISettings::values.multiplayer_ban_list.second[i] = +            ReadSetting(QStringLiteral("ip")).toString().toStdString(); +    } +    qt_config->endArray(); + +    qt_config->endGroup(); +} +  void Config::ReadValues() {      if (global) {          ReadControlValues(); @@ -877,6 +913,7 @@ void Config::ReadValues() {      ReadRendererValues();      ReadAudioValues();      ReadSystemValues(); +    ReadMultiplayerValues();  }  void Config::SavePlayerValue(std::size_t player_index) { @@ -1005,6 +1042,11 @@ void Config::SaveHidbusValues() {                   QString::fromStdString(default_param));  } +void Config::SaveIrCameraValues() { +    WriteBasicSetting(Settings::values.enable_ir_sensor); +    WriteBasicSetting(Settings::values.ir_sensor_device); +} +  void Config::SaveValues() {      if (global) {          SaveControlValues(); @@ -1021,6 +1063,7 @@ void Config::SaveValues() {      SaveRendererValues();      SaveAudioValues();      SaveSystemValues(); +    SaveMultiplayerValues();  }  void Config::SaveAudioValues() { @@ -1028,7 +1071,8 @@ void Config::SaveAudioValues() {      if (global) {          WriteBasicSetting(Settings::values.sink_id); -        WriteBasicSetting(Settings::values.audio_device_id); +        WriteBasicSetting(Settings::values.audio_output_device_id); +        WriteBasicSetting(Settings::values.audio_input_device_id);      }      WriteGlobalSetting(Settings::values.volume); @@ -1046,6 +1090,7 @@ void Config::SaveControlValues() {      SaveTouchscreenValues();      SaveMotionTouchValues();      SaveHidbusValues(); +    SaveIrCameraValues();      WriteGlobalSetting(Settings::values.use_docked_mode);      WriteGlobalSetting(Settings::values.vibration_enabled); @@ -1237,7 +1282,6 @@ void Config::SaveRendererValues() {      WriteGlobalSetting(Settings::values.max_anisotropy);      WriteGlobalSetting(Settings::values.use_speed_limit);      WriteGlobalSetting(Settings::values.speed_limit); -    WriteGlobalSetting(Settings::values.fps_cap);      WriteGlobalSetting(Settings::values.use_disk_shader_cache);      WriteSetting(QString::fromStdString(Settings::values.gpu_accuracy.GetLabel()),                   static_cast<u32>(Settings::values.gpu_accuracy.GetValue(global)), @@ -1342,6 +1386,7 @@ void Config::SaveUIValues() {      SavePathValues();      SaveScreenshotValues();      SaveShortcutValues(); +    SaveMultiplayerValues();      WriteBasicSetting(UISettings::values.single_window_mode);      WriteBasicSetting(UISettings::values.fullscreen); @@ -1355,7 +1400,6 @@ void Config::SaveUIValues() {      WriteBasicSetting(UISettings::values.pause_when_in_background);      WriteBasicSetting(UISettings::values.mute_when_in_background);      WriteBasicSetting(UISettings::values.hide_mouse); -    WriteBasicSetting(UISettings::values.has_broken_vulkan);      WriteBasicSetting(UISettings::values.disable_web_applet);      qt_config->endGroup(); @@ -1407,6 +1451,40 @@ void Config::SaveWebServiceValues() {      qt_config->endGroup();  } +void Config::SaveMultiplayerValues() { +    qt_config->beginGroup(QStringLiteral("Multiplayer")); + +    WriteBasicSetting(UISettings::values.multiplayer_nickname); +    WriteBasicSetting(UISettings::values.multiplayer_ip); +    WriteBasicSetting(UISettings::values.multiplayer_port); +    WriteBasicSetting(UISettings::values.multiplayer_room_nickname); +    WriteBasicSetting(UISettings::values.multiplayer_room_name); +    WriteBasicSetting(UISettings::values.multiplayer_room_port); +    WriteBasicSetting(UISettings::values.multiplayer_host_type); +    WriteBasicSetting(UISettings::values.multiplayer_port); +    WriteBasicSetting(UISettings::values.multiplayer_max_player); +    WriteBasicSetting(UISettings::values.multiplayer_game_id); +    WriteBasicSetting(UISettings::values.multiplayer_room_description); + +    // Write ban list +    qt_config->beginWriteArray(QStringLiteral("username_ban_list")); +    for (std::size_t i = 0; i < UISettings::values.multiplayer_ban_list.first.size(); ++i) { +        qt_config->setArrayIndex(static_cast<int>(i)); +        WriteSetting(QStringLiteral("username"), +                     QString::fromStdString(UISettings::values.multiplayer_ban_list.first[i])); +    } +    qt_config->endArray(); +    qt_config->beginWriteArray(QStringLiteral("ip_ban_list")); +    for (std::size_t i = 0; i < UISettings::values.multiplayer_ban_list.second.size(); ++i) { +        qt_config->setArrayIndex(static_cast<int>(i)); +        WriteSetting(QStringLiteral("ip"), +                     QString::fromStdString(UISettings::values.multiplayer_ban_list.second[i])); +    } +    qt_config->endArray(); + +    qt_config->endGroup(); +} +  QVariant Config::ReadSetting(const QString& name) const {      return qt_config->value(name);  } @@ -1421,8 +1499,8 @@ QVariant Config::ReadSetting(const QString& name, const QVariant& default_value)      return result;  } -template <typename Type> -void Config::ReadGlobalSetting(Settings::Setting<Type>& setting) { +template <typename Type, bool ranged> +void Config::ReadGlobalSetting(Settings::SwitchableSetting<Type, ranged>& setting) {      QString name = QString::fromStdString(setting.GetLabel());      const bool use_global = qt_config->value(name + QStringLiteral("/use_global"), true).toBool();      setting.SetGlobal(use_global); diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h index f0ab6bdaa..486ceea94 100644 --- a/src/yuzu/configuration/config.h +++ b/src/yuzu/configuration/config.h @@ -1,6 +1,5 @@ -// Copyright 2014 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2014 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #pragma once @@ -68,6 +67,7 @@ private:      void ReadTouchscreenValues();      void ReadMotionTouchValues();      void ReadHidbusValues(); +    void ReadIrCameraValues();      // Read functions bases off the respective config section names.      void ReadAudioValues(); @@ -88,6 +88,7 @@ private:      void ReadUIGamelistValues();      void ReadUILayoutValues();      void ReadWebServiceValues(); +    void ReadMultiplayerValues();      void SaveValues();      void SavePlayerValue(std::size_t player_index); @@ -96,6 +97,7 @@ private:      void SaveTouchscreenValues();      void SaveMotionTouchValues();      void SaveHidbusValues(); +    void SaveIrCameraValues();      // Save functions based off the respective config section names.      void SaveAudioValues(); @@ -116,6 +118,7 @@ private:      void SaveUIGamelistValues();      void SaveUILayoutValues();      void SaveWebServiceValues(); +    void SaveMultiplayerValues();      /**       * Reads a setting from the qt_config. @@ -159,8 +162,8 @@ private:       *       * @param The setting       */ -    template <typename Type> -    void ReadGlobalSetting(Settings::Setting<Type>& setting); +    template <typename Type, bool ranged> +    void ReadGlobalSetting(Settings::SwitchableSetting<Type, ranged>& setting);      /**       * Sets a value to the qt_config using the setting's label and default value. If the config is a @@ -168,8 +171,8 @@ private:       *       * @param The setting       */ -    template <typename Type> -    void WriteGlobalSetting(const Settings::Setting<Type>& setting); +    template <typename Type, bool ranged> +    void WriteGlobalSetting(const Settings::SwitchableSetting<Type, ranged>& setting);      /**       * Reads a value from the qt_config using the setting's label and default value and applies the @@ -177,15 +180,15 @@ private:       *       * @param The setting       */ -    template <typename Type> -    void ReadBasicSetting(Settings::BasicSetting<Type>& setting); +    template <typename Type, bool ranged> +    void ReadBasicSetting(Settings::Setting<Type, ranged>& setting);      /** Sets a value from the setting in the qt_config using the setting's label and default value.       *       * @param The setting       */ -    template <typename Type> -    void WriteBasicSetting(const Settings::BasicSetting<Type>& setting); +    template <typename Type, bool ranged> +    void WriteBasicSetting(const Settings::Setting<Type, ranged>& setting);      ConfigType type;      std::unique_ptr<QSettings> qt_config; diff --git a/src/yuzu/configuration/configuration_shared.cpp b/src/yuzu/configuration/configuration_shared.cpp index 5190bd18b..97fb664bf 100644 --- a/src/yuzu/configuration/configuration_shared.cpp +++ b/src/yuzu/configuration/configuration_shared.cpp @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #include <QCheckBox>  #include <QObject> @@ -9,7 +8,7 @@  #include "yuzu/configuration/configuration_shared.h"  #include "yuzu/configuration/configure_per_game.h" -void ConfigurationShared::ApplyPerGameSetting(Settings::Setting<bool>* setting, +void ConfigurationShared::ApplyPerGameSetting(Settings::SwitchableSetting<bool>* setting,                                                const QCheckBox* checkbox,                                                const CheckState& tracker) {      if (Settings::IsConfiguringGlobal() && setting->UsingGlobal()) { @@ -25,7 +24,7 @@ void ConfigurationShared::ApplyPerGameSetting(Settings::Setting<bool>* setting,  }  void ConfigurationShared::SetPerGameSetting(QCheckBox* checkbox, -                                            const Settings::Setting<bool>* setting) { +                                            const Settings::SwitchableSetting<bool>* setting) {      if (setting->UsingGlobal()) {          checkbox->setCheckState(Qt::PartiallyChecked);      } else { @@ -45,7 +44,7 @@ void ConfigurationShared::SetHighlight(QWidget* widget, bool highlighted) {  }  void ConfigurationShared::SetColoredTristate(QCheckBox* checkbox, -                                             const Settings::Setting<bool>& setting, +                                             const Settings::SwitchableSetting<bool>& setting,                                               CheckState& tracker) {      if (setting.UsingGlobal()) {          tracker = CheckState::Global; diff --git a/src/yuzu/configuration/configuration_shared.h b/src/yuzu/configuration/configuration_shared.h index 903a9baae..e597dcdb5 100644 --- a/src/yuzu/configuration/configuration_shared.h +++ b/src/yuzu/configuration/configuration_shared.h @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #pragma once @@ -25,10 +24,11 @@ enum class CheckState {  // Global-aware apply and set functions  // ApplyPerGameSetting, given a Settings::Setting and a Qt UI element, properly applies a Setting -void ApplyPerGameSetting(Settings::Setting<bool>* setting, const QCheckBox* checkbox, +void ApplyPerGameSetting(Settings::SwitchableSetting<bool>* setting, const QCheckBox* checkbox,                           const CheckState& tracker); -template <typename Type> -void ApplyPerGameSetting(Settings::Setting<Type>* setting, const QComboBox* combobox) { +template <typename Type, bool ranged> +void ApplyPerGameSetting(Settings::SwitchableSetting<Type, ranged>* setting, +                         const QComboBox* combobox) {      if (Settings::IsConfiguringGlobal() && setting->UsingGlobal()) {          setting->SetValue(static_cast<Type>(combobox->currentIndex()));      } else if (!Settings::IsConfiguringGlobal()) { @@ -43,10 +43,11 @@ void ApplyPerGameSetting(Settings::Setting<Type>* setting, const QComboBox* comb  }  // Sets a Qt UI element given a Settings::Setting -void SetPerGameSetting(QCheckBox* checkbox, const Settings::Setting<bool>* setting); +void SetPerGameSetting(QCheckBox* checkbox, const Settings::SwitchableSetting<bool>* setting); -template <typename Type> -void SetPerGameSetting(QComboBox* combobox, const Settings::Setting<Type>* setting) { +template <typename Type, bool ranged> +void SetPerGameSetting(QComboBox* combobox, +                       const Settings::SwitchableSetting<Type, ranged>* setting) {      combobox->setCurrentIndex(setting->UsingGlobal() ? ConfigurationShared::USE_GLOBAL_INDEX                                                       : static_cast<int>(setting->GetValue()) +                                                             ConfigurationShared::USE_GLOBAL_OFFSET); @@ -56,7 +57,7 @@ void SetPerGameSetting(QComboBox* combobox, const Settings::Setting<Type>* setti  void SetHighlight(QWidget* widget, bool highlighted);  // Sets up a QCheckBox like a tristate one, given a Setting -void SetColoredTristate(QCheckBox* checkbox, const Settings::Setting<bool>& setting, +void SetColoredTristate(QCheckBox* checkbox, const Settings::SwitchableSetting<bool>& setting,                          CheckState& tracker);  void SetColoredTristate(QCheckBox* checkbox, bool global, bool state, bool global_state,                          CheckState& tracker); diff --git a/src/yuzu/configuration/configure_audio.cpp b/src/yuzu/configuration/configure_audio.cpp index 512bdfc22..19b8b15ef 100644 --- a/src/yuzu/configuration/configure_audio.cpp +++ b/src/yuzu/configuration/configure_audio.cpp @@ -3,8 +3,8 @@  #include <memory> -#include "audio_core/sink.h" -#include "audio_core/sink_details.h" +#include "audio_core/sink/sink.h" +#include "audio_core/sink/sink_details.h"  #include "common/settings.h"  #include "core/core.h"  #include "ui_configure_audio.h" @@ -15,11 +15,11 @@ ConfigureAudio::ConfigureAudio(const Core::System& system_, QWidget* parent)      : QWidget(parent), ui(std::make_unique<Ui::ConfigureAudio>()), system{system_} {      ui->setupUi(this); -    InitializeAudioOutputSinkComboBox(); +    InitializeAudioSinkComboBox();      connect(ui->volume_slider, &QSlider::valueChanged, this,              &ConfigureAudio::SetVolumeIndicatorText); -    connect(ui->output_sink_combo_box, qOverload<int>(&QComboBox::currentIndexChanged), this, +    connect(ui->sink_combo_box, qOverload<int>(&QComboBox::currentIndexChanged), this,              &ConfigureAudio::UpdateAudioDevices);      ui->volume_label->setVisible(Settings::IsConfiguringGlobal()); @@ -30,8 +30,9 @@ ConfigureAudio::ConfigureAudio(const Core::System& system_, QWidget* parent)      SetConfiguration();      const bool is_powered_on = system_.IsPoweredOn(); -    ui->output_sink_combo_box->setEnabled(!is_powered_on); -    ui->audio_device_combo_box->setEnabled(!is_powered_on); +    ui->sink_combo_box->setEnabled(!is_powered_on); +    ui->output_combo_box->setEnabled(!is_powered_on); +    ui->input_combo_box->setEnabled(!is_powered_on);  }  ConfigureAudio::~ConfigureAudio() = default; @@ -40,9 +41,9 @@ void ConfigureAudio::SetConfiguration() {      SetOutputSinkFromSinkID();      // The device list cannot be pre-populated (nor listed) until the output sink is known. -    UpdateAudioDevices(ui->output_sink_combo_box->currentIndex()); +    UpdateAudioDevices(ui->sink_combo_box->currentIndex()); -    SetAudioDeviceFromDeviceID(); +    SetAudioDevicesFromDeviceID();      const auto volume_value = static_cast<int>(Settings::values.volume.GetValue());      ui->volume_slider->setValue(volume_value); @@ -62,32 +63,45 @@ void ConfigureAudio::SetConfiguration() {  }  void ConfigureAudio::SetOutputSinkFromSinkID() { -    [[maybe_unused]] const QSignalBlocker blocker(ui->output_sink_combo_box); +    [[maybe_unused]] const QSignalBlocker blocker(ui->sink_combo_box);      int new_sink_index = 0;      const QString sink_id = QString::fromStdString(Settings::values.sink_id.GetValue()); -    for (int index = 0; index < ui->output_sink_combo_box->count(); index++) { -        if (ui->output_sink_combo_box->itemText(index) == sink_id) { +    for (int index = 0; index < ui->sink_combo_box->count(); index++) { +        if (ui->sink_combo_box->itemText(index) == sink_id) {              new_sink_index = index;              break;          }      } -    ui->output_sink_combo_box->setCurrentIndex(new_sink_index); +    ui->sink_combo_box->setCurrentIndex(new_sink_index);  } -void ConfigureAudio::SetAudioDeviceFromDeviceID() { +void ConfigureAudio::SetAudioDevicesFromDeviceID() {      int new_device_index = -1; -    const QString device_id = QString::fromStdString(Settings::values.audio_device_id.GetValue()); -    for (int index = 0; index < ui->audio_device_combo_box->count(); index++) { -        if (ui->audio_device_combo_box->itemText(index) == device_id) { +    const QString output_device_id = +        QString::fromStdString(Settings::values.audio_output_device_id.GetValue()); +    for (int index = 0; index < ui->output_combo_box->count(); index++) { +        if (ui->output_combo_box->itemText(index) == output_device_id) {              new_device_index = index;              break;          }      } -    ui->audio_device_combo_box->setCurrentIndex(new_device_index); +    ui->output_combo_box->setCurrentIndex(new_device_index); + +    new_device_index = -1; +    const QString input_device_id = +        QString::fromStdString(Settings::values.audio_input_device_id.GetValue()); +    for (int index = 0; index < ui->input_combo_box->count(); index++) { +        if (ui->input_combo_box->itemText(index) == input_device_id) { +            new_device_index = index; +            break; +        } +    } + +    ui->input_combo_box->setCurrentIndex(new_device_index);  }  void ConfigureAudio::SetVolumeIndicatorText(int percentage) { @@ -95,14 +109,13 @@ void ConfigureAudio::SetVolumeIndicatorText(int percentage) {  }  void ConfigureAudio::ApplyConfiguration() { -      if (Settings::IsConfiguringGlobal()) {          Settings::values.sink_id = -            ui->output_sink_combo_box->itemText(ui->output_sink_combo_box->currentIndex()) -                .toStdString(); -        Settings::values.audio_device_id.SetValue( -            ui->audio_device_combo_box->itemText(ui->audio_device_combo_box->currentIndex()) -                .toStdString()); +            ui->sink_combo_box->itemText(ui->sink_combo_box->currentIndex()).toStdString(); +        Settings::values.audio_output_device_id.SetValue( +            ui->output_combo_box->itemText(ui->output_combo_box->currentIndex()).toStdString()); +        Settings::values.audio_input_device_id.SetValue( +            ui->input_combo_box->itemText(ui->input_combo_box->currentIndex()).toStdString());          // Guard if during game and set to game-specific value          if (Settings::values.volume.UsingGlobal()) { @@ -129,21 +142,27 @@ void ConfigureAudio::changeEvent(QEvent* event) {  }  void ConfigureAudio::UpdateAudioDevices(int sink_index) { -    ui->audio_device_combo_box->clear(); -    ui->audio_device_combo_box->addItem(QString::fromUtf8(AudioCore::auto_device_name)); +    ui->output_combo_box->clear(); +    ui->output_combo_box->addItem(QString::fromUtf8(AudioCore::Sink::auto_device_name)); + +    const std::string sink_id = ui->sink_combo_box->itemText(sink_index).toStdString(); +    for (const auto& device : AudioCore::Sink::GetDeviceListForSink(sink_id, false)) { +        ui->output_combo_box->addItem(QString::fromStdString(device)); +    } -    const std::string sink_id = ui->output_sink_combo_box->itemText(sink_index).toStdString(); -    for (const auto& device : AudioCore::GetDeviceListForSink(sink_id)) { -        ui->audio_device_combo_box->addItem(QString::fromStdString(device)); +    ui->input_combo_box->clear(); +    ui->input_combo_box->addItem(QString::fromUtf8(AudioCore::Sink::auto_device_name)); +    for (const auto& device : AudioCore::Sink::GetDeviceListForSink(sink_id, true)) { +        ui->input_combo_box->addItem(QString::fromStdString(device));      }  } -void ConfigureAudio::InitializeAudioOutputSinkComboBox() { -    ui->output_sink_combo_box->clear(); -    ui->output_sink_combo_box->addItem(QString::fromUtf8(AudioCore::auto_device_name)); +void ConfigureAudio::InitializeAudioSinkComboBox() { +    ui->sink_combo_box->clear(); +    ui->sink_combo_box->addItem(QString::fromUtf8(AudioCore::Sink::auto_device_name)); -    for (const char* id : AudioCore::GetSinkIDs()) { -        ui->output_sink_combo_box->addItem(QString::fromUtf8(id)); +    for (const char* id : AudioCore::Sink::GetSinkIDs()) { +        ui->sink_combo_box->addItem(QString::fromUtf8(id));      }  } @@ -164,8 +183,10 @@ void ConfigureAudio::SetupPerGameUI() {          ConfigurationShared::SetHighlight(ui->volume_layout, index == 1);      }); -    ui->output_sink_combo_box->setVisible(false); -    ui->output_sink_label->setVisible(false); -    ui->audio_device_combo_box->setVisible(false); -    ui->audio_device_label->setVisible(false); +    ui->sink_combo_box->setVisible(false); +    ui->sink_label->setVisible(false); +    ui->output_combo_box->setVisible(false); +    ui->output_label->setVisible(false); +    ui->input_combo_box->setVisible(false); +    ui->input_label->setVisible(false);  } diff --git a/src/yuzu/configuration/configure_audio.h b/src/yuzu/configuration/configure_audio.h index 08c278eeb..0d03aae1d 100644 --- a/src/yuzu/configuration/configure_audio.h +++ b/src/yuzu/configuration/configure_audio.h @@ -31,14 +31,14 @@ public:  private:      void changeEvent(QEvent* event) override; -    void InitializeAudioOutputSinkComboBox(); +    void InitializeAudioSinkComboBox();      void RetranslateUI();      void UpdateAudioDevices(int sink_index);      void SetOutputSinkFromSinkID(); -    void SetAudioDeviceFromDeviceID(); +    void SetAudioDevicesFromDeviceID();      void SetVolumeIndicatorText(int percentage);      void SetupPerGameUI(); diff --git a/src/yuzu/configuration/configure_audio.ui b/src/yuzu/configuration/configure_audio.ui index d1ac8ad02..6034d8581 100644 --- a/src/yuzu/configuration/configure_audio.ui +++ b/src/yuzu/configuration/configure_audio.ui @@ -21,30 +21,44 @@       </property>       <layout class="QVBoxLayout">        <item> -       <layout class="QHBoxLayout" name="_3"> +       <layout class="QHBoxLayout" name="engine_layout">          <item> -         <widget class="QLabel" name="output_sink_label"> +         <widget class="QLabel" name="sink_label">            <property name="text">             <string>Output Engine:</string>            </property>           </widget>          </item>          <item> -         <widget class="QComboBox" name="output_sink_combo_box"/> +         <widget class="QComboBox" name="sink_combo_box"/>          </item>         </layout>        </item>        <item> -       <layout class="QHBoxLayout" name="_2"> +       <layout class="QHBoxLayout" name="output_layout">          <item> -         <widget class="QLabel" name="audio_device_label"> +         <widget class="QLabel" name="output_label">            <property name="text"> -           <string>Audio Device:</string> +           <string>Output Device</string>            </property>           </widget>          </item>          <item> -         <widget class="QComboBox" name="audio_device_combo_box"/> +         <widget class="QComboBox" name="output_combo_box"/> +        </item> +       </layout> +      </item> +      <item> +       <layout class="QHBoxLayout" name="input_layout"> +        <item> +         <widget class="QLabel" name="input_label"> +          <property name="text"> +           <string>Input Device</string> +          </property> +         </widget> +        </item> +        <item> +         <widget class="QComboBox" name="input_combo_box"/>          </item>         </layout>        </item> @@ -106,10 +120,10 @@              </sizepolicy>             </property>             <property name="maximum"> -            <number>100</number> +            <number>200</number>             </property>             <property name="pageStep"> -            <number>10</number> +            <number>5</number>             </property>             <property name="orientation">              <enum>Qt::Horizontal</enum> diff --git a/src/yuzu/configuration/configure_camera.cpp b/src/yuzu/configuration/configure_camera.cpp new file mode 100644 index 000000000..2a61de2a1 --- /dev/null +++ b/src/yuzu/configuration/configure_camera.cpp @@ -0,0 +1,156 @@ +// Text : Copyright 2022 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include <memory> +#include <QCameraImageCapture> +#include <QCameraInfo> +#include <QStandardItemModel> +#include <QTimer> + +#include "input_common/drivers/camera.h" +#include "input_common/main.h" +#include "ui_configure_camera.h" +#include "yuzu/configuration/config.h" +#include "yuzu/configuration/configure_camera.h" + +ConfigureCamera::ConfigureCamera(QWidget* parent, InputCommon::InputSubsystem* input_subsystem_) +    : QDialog(parent), input_subsystem{input_subsystem_}, +      ui(std::make_unique<Ui::ConfigureCamera>()) { +    ui->setupUi(this); + +    connect(ui->restore_defaults_button, &QPushButton::clicked, this, +            &ConfigureCamera::RestoreDefaults); +    connect(ui->preview_button, &QPushButton::clicked, this, &ConfigureCamera::PreviewCamera); + +    auto blank_image = QImage(320, 240, QImage::Format::Format_RGB32); +    blank_image.fill(Qt::black); +    DisplayCapturedFrame(0, blank_image); + +    LoadConfiguration(); +    resize(0, 0); +} + +ConfigureCamera::~ConfigureCamera() = default; + +void ConfigureCamera::PreviewCamera() { +    const auto index = ui->ir_sensor_combo_box->currentIndex(); +    bool camera_found = false; +    const QList<QCameraInfo> cameras = QCameraInfo::availableCameras(); +    for (const QCameraInfo& cameraInfo : cameras) { +        if (input_devices[index] == cameraInfo.deviceName().toStdString() || +            input_devices[index] == "Auto") { +            LOG_INFO(Frontend, "Selected Camera {} {}", cameraInfo.description().toStdString(), +                     cameraInfo.deviceName().toStdString()); +            camera = std::make_unique<QCamera>(cameraInfo); +            if (!camera->isCaptureModeSupported(QCamera::CaptureMode::CaptureViewfinder) && +                !camera->isCaptureModeSupported(QCamera::CaptureMode::CaptureStillImage)) { +                LOG_ERROR(Frontend, +                          "Camera doesn't support CaptureViewfinder or CaptureStillImage"); +                continue; +            } +            camera_found = true; +            break; +        } +    } + +    // Clear previous frame +    auto blank_image = QImage(320, 240, QImage::Format::Format_RGB32); +    blank_image.fill(Qt::black); +    DisplayCapturedFrame(0, blank_image); + +    if (!camera_found) { +        return; +    } + +    camera_capture = std::make_unique<QCameraImageCapture>(camera.get()); + +    if (!camera_capture->isCaptureDestinationSupported( +            QCameraImageCapture::CaptureDestination::CaptureToBuffer)) { +        LOG_ERROR(Frontend, "Camera doesn't support saving to buffer"); +        return; +    } + +    camera_capture->setCaptureDestination(QCameraImageCapture::CaptureDestination::CaptureToBuffer); +    connect(camera_capture.get(), &QCameraImageCapture::imageCaptured, this, +            &ConfigureCamera::DisplayCapturedFrame); +    camera->unload(); +    if (camera->isCaptureModeSupported(QCamera::CaptureMode::CaptureViewfinder)) { +        camera->setCaptureMode(QCamera::CaptureViewfinder); +    } else if (camera->isCaptureModeSupported(QCamera::CaptureMode::CaptureStillImage)) { +        camera->setCaptureMode(QCamera::CaptureStillImage); +    } +    camera->load(); +    camera->start(); + +    pending_snapshots = 0; +    is_virtual_camera = false; + +    camera_timer = std::make_unique<QTimer>(); +    connect(camera_timer.get(), &QTimer::timeout, [this] { +        // If the camera doesn't capture, test for virtual cameras +        if (pending_snapshots > 5) { +            is_virtual_camera = true; +        } +        // Virtual cameras like obs need to reset the camera every capture +        if (is_virtual_camera) { +            camera->stop(); +            camera->start(); +        } +        pending_snapshots++; +        camera_capture->capture(); +    }); + +    camera_timer->start(250); +} + +void ConfigureCamera::DisplayCapturedFrame(int requestId, const QImage& img) { +    LOG_INFO(Frontend, "ImageCaptured {} {}", img.width(), img.height()); +    const auto converted = img.scaled(320, 240, Qt::AspectRatioMode::IgnoreAspectRatio, +                                      Qt::TransformationMode::SmoothTransformation); +    ui->preview_box->setPixmap(QPixmap::fromImage(converted)); +    pending_snapshots = 0; +} + +void ConfigureCamera::changeEvent(QEvent* event) { +    if (event->type() == QEvent::LanguageChange) { +        RetranslateUI(); +    } + +    QDialog::changeEvent(event); +} + +void ConfigureCamera::RetranslateUI() { +    ui->retranslateUi(this); +} + +void ConfigureCamera::ApplyConfiguration() { +    const auto index = ui->ir_sensor_combo_box->currentIndex(); +    Settings::values.ir_sensor_device.SetValue(input_devices[index]); +} + +void ConfigureCamera::LoadConfiguration() { +    input_devices.clear(); +    ui->ir_sensor_combo_box->clear(); +    input_devices.push_back("Auto"); +    ui->ir_sensor_combo_box->addItem(tr("Auto")); +    const auto cameras = QCameraInfo::availableCameras(); +    for (const QCameraInfo& cameraInfo : cameras) { +        input_devices.push_back(cameraInfo.deviceName().toStdString()); +        ui->ir_sensor_combo_box->addItem(cameraInfo.description()); +    } + +    const auto current_device = Settings::values.ir_sensor_device.GetValue(); + +    const auto devices_it = std::find_if( +        input_devices.begin(), input_devices.end(), +        [current_device](const std::string& device) { return device == current_device; }); +    const int device_index = +        devices_it != input_devices.end() +            ? static_cast<int>(std::distance(input_devices.begin(), devices_it)) +            : 0; +    ui->ir_sensor_combo_box->setCurrentIndex(device_index); +} + +void ConfigureCamera::RestoreDefaults() { +    ui->ir_sensor_combo_box->setCurrentIndex(0); +} diff --git a/src/yuzu/configuration/configure_camera.h b/src/yuzu/configuration/configure_camera.h new file mode 100644 index 000000000..db9833b5c --- /dev/null +++ b/src/yuzu/configuration/configure_camera.h @@ -0,0 +1,54 @@ +// Text : Copyright 2022 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include <memory> +#include <QDialog> + +class QTimer; +class QCamera; +class QCameraImageCapture; + +namespace InputCommon { +class InputSubsystem; +} // namespace InputCommon + +namespace Ui { +class ConfigureCamera; +} + +class ConfigureCamera : public QDialog { +    Q_OBJECT + +public: +    explicit ConfigureCamera(QWidget* parent, InputCommon::InputSubsystem* input_subsystem_); +    ~ConfigureCamera() override; + +    void ApplyConfiguration(); + +private: +    void changeEvent(QEvent* event) override; +    void RetranslateUI(); + +    /// Load configuration settings. +    void LoadConfiguration(); + +    /// Restore all buttons to their default values. +    void RestoreDefaults(); + +    void DisplayCapturedFrame(int requestId, const QImage& img); + +    /// Loads and signals the current selected camera to display a frame +    void PreviewCamera(); + +    InputCommon::InputSubsystem* input_subsystem; + +    bool is_virtual_camera; +    int pending_snapshots; +    std::unique_ptr<QCamera> camera; +    std::unique_ptr<QCameraImageCapture> camera_capture; +    std::unique_ptr<QTimer> camera_timer; +    std::vector<std::string> input_devices; +    std::unique_ptr<Ui::ConfigureCamera> ui; +}; diff --git a/src/yuzu/configuration/configure_camera.ui b/src/yuzu/configuration/configure_camera.ui new file mode 100644 index 000000000..976a9b1ec --- /dev/null +++ b/src/yuzu/configuration/configure_camera.ui @@ -0,0 +1,170 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ConfigureCamera</class> + <widget class="QDialog" name="ConfigureCamera"> +  <property name="geometry"> +   <rect> +    <x>0</x> +    <y>0</y> +    <width>298</width> +    <height>339</height> +   </rect> +  </property> +  <property name="windowTitle"> +   <string>Configure Infrared Camera</string> +  </property> +  <layout class="QVBoxLayout" name="verticalLayout"> +   <item> +    <widget class="QLabel" name="label_2"> +     <property name="minimumSize"> +      <size> +       <width>280</width> +       <height>0</height> +      </size> +     </property> +     <property name="text"> +      <string>Select where the image of the emulated camera comes from. It may be a virtual camera or a real camera.</string> +     </property> +     <property name="wordWrap"> +      <bool>true</bool> +     </property> +    </widget> +   </item> +   <item> +    <spacer name="verticalSpacer_2"> +     <property name="orientation"> +      <enum>Qt::Vertical</enum> +     </property> +     <property name="sizeType"> +      <enum>QSizePolicy::Fixed</enum> +     </property> +     <property name="sizeHint" stdset="0"> +      <size> +       <width>20</width> +       <height>20</height> +      </size> +     </property> +    </spacer> +   </item> +   <item> +    <widget class="QGroupBox" name="gridGroupBox"> +     <property name="title"> +      <string>Camera Image Source:</string> +     </property> +     <layout class="QGridLayout" name="gridLayout"> +      <item row="0" column="0"> +       <spacer name="horizontalSpacer"> +        <property name="orientation"> +         <enum>Qt::Horizontal</enum> +        </property> +        <property name="sizeHint" stdset="0"> +         <size> +          <width>40</width> +          <height>20</height> +         </size> +        </property> +       </spacer> +      </item> +       <item row="0" column="1"> +         <widget class="QLabel" name="label_3"> +           <property name="text"> +             <string>Input device:</string> +           </property> +         </widget> +       </item> +       <item row="0" column="2"> +         <widget class="QComboBox" name="ir_sensor_combo_box"/> +       </item> +      <item row="0" column="3"> +       <spacer name="horizontalSpacer_2"> +        <property name="orientation"> +         <enum>Qt::Horizontal</enum> +        </property> +        <property name="sizeHint" stdset="0"> +         <size> +          <width>40</width> +          <height>20</height> +         </size> +        </property> +       </spacer> +      </item> +     </layout> +    </widget> +   </item><item> +    <widget class="QGroupBox" name="previewBox"> +     <property name="title"> +      <string>Preview</string> +     </property> +     <layout class="QVBoxLayout" name="verticalLayout_3"> +      <item> +       <widget class="QLabel" name="preview_box"> +         <property name="minimumSize"> +           <size> +             <width>320</width> +             <height>240</height> +           </size> +         </property> +        <property name="toolTip"> +         <string>Resolution: 320*240</string> +        </property> +       </widget> +      </item> +      <item> +       <widget class="QPushButton" name="preview_button"> +        <property name="text"> +         <string>Click to preview</string> +        </property> +       </widget> +      </item> +     </layout> +    </widget> +   </item> +   <item> +    <spacer name="verticalSpacer"> +     <property name="orientation"> +      <enum>Qt::Vertical</enum> +     </property> +     <property name="sizeHint" stdset="0"> +      <size> +       <width>20</width> +       <height>40</height> +      </size> +     </property> +    </spacer> +   </item> +   <item> +    <layout class="QHBoxLayout" name="horizontalLayout"> +     <item> +      <widget class="QPushButton" name="restore_defaults_button"> +       <property name="text"> +        <string>Restore Defaults</string> +       </property> +      </widget> +     </item> +     <item> +      <widget class="QDialogButtonBox" name="buttonBox"> +       <property name="standardButtons"> +        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> +       </property> +      </widget> +     </item> +    </layout> +   </item> +  </layout> + </widget> + <resources/> + <connections> +  <connection> +   <sender>buttonBox</sender> +   <signal>accepted()</signal> +   <receiver>ConfigureCamera</receiver> +   <slot>accept()</slot> +  </connection> +  <connection> +   <sender>buttonBox</sender> +   <signal>rejected()</signal> +   <receiver>ConfigureCamera</receiver> +   <slot>reject()</slot> +   </connection> + </connections> +</ui> diff --git a/src/yuzu/configuration/configure_debug.cpp b/src/yuzu/configuration/configure_debug.cpp index 343d2aee1..e16d127a8 100644 --- a/src/yuzu/configuration/configure_debug.cpp +++ b/src/yuzu/configuration/configure_debug.cpp @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #include <QDesktopServices>  #include <QUrl> @@ -44,6 +43,7 @@ void ConfigureDebug::SetConfiguration() {      ui->fs_access_log->setEnabled(runtime_lock);      ui->fs_access_log->setChecked(Settings::values.enable_fs_access_log.GetValue());      ui->reporting_services->setChecked(Settings::values.reporting_services.GetValue()); +    ui->dump_audio_commands->setChecked(Settings::values.dump_audio_commands.GetValue());      ui->quest_flag->setChecked(Settings::values.quest_flag.GetValue());      ui->use_debug_asserts->setChecked(Settings::values.use_debug_asserts.GetValue());      ui->use_auto_stub->setChecked(Settings::values.use_auto_stub.GetValue()); @@ -83,6 +83,7 @@ void ConfigureDebug::ApplyConfiguration() {      Settings::values.program_args = ui->homebrew_args_edit->text().toStdString();      Settings::values.enable_fs_access_log = ui->fs_access_log->isChecked();      Settings::values.reporting_services = ui->reporting_services->isChecked(); +    Settings::values.dump_audio_commands = ui->dump_audio_commands->isChecked();      Settings::values.quest_flag = ui->quest_flag->isChecked();      Settings::values.use_debug_asserts = ui->use_debug_asserts->isChecked();      Settings::values.use_auto_stub = ui->use_auto_stub->isChecked(); diff --git a/src/yuzu/configuration/configure_debug.h b/src/yuzu/configuration/configure_debug.h index 73f71c9e3..64d68ab8f 100644 --- a/src/yuzu/configuration/configure_debug.h +++ b/src/yuzu/configuration/configure_debug.h @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #pragma once diff --git a/src/yuzu/configuration/configure_debug.ui b/src/yuzu/configuration/configure_debug.ui index 1152fa6c6..4c16274fc 100644 --- a/src/yuzu/configuration/configure_debug.ui +++ b/src/yuzu/configuration/configure_debug.ui @@ -235,6 +235,16 @@         </widget>        </item>        <item row="1" column="0"> +       <widget class="QCheckBox" name="dump_audio_commands"> +        <property name="text"> +         <string>Dump Audio Commands To Console**</string> +        </property> +        <property name="toolTip"> +         <string>Enable this to output the latest generated audio command list to the console. Only affects games using the audio renderer.</string> +        </property> +       </widget> +      </item> +      <item row="2" column="0">         <widget class="QCheckBox" name="reporting_services">          <property name="text">           <string>Enable Verbose Reporting Services**</string> @@ -325,6 +335,7 @@    <tabstop>disable_loop_safety_checks</tabstop>    <tabstop>fs_access_log</tabstop>    <tabstop>reporting_services</tabstop> +  <tabstop>dump_audio_commands</tabstop>    <tabstop>quest_flag</tabstop>    <tabstop>enable_cpu_debugging</tabstop>    <tabstop>use_debug_asserts</tabstop> diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp index e99657bd6..4301313cf 100644 --- a/src/yuzu/configuration/configure_dialog.cpp +++ b/src/yuzu/configuration/configure_dialog.cpp @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #include <memory>  #include "common/logging/log.h" @@ -29,9 +28,10 @@  ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_,                                   InputCommon::InputSubsystem* input_subsystem, -                                 Core::System& system_) -    : QDialog(parent), ui{std::make_unique<Ui::ConfigureDialog>()}, registry{registry_}, -      system{system_}, audio_tab{std::make_unique<ConfigureAudio>(system_, this)}, +                                 Core::System& system_, bool enable_web_config) +    : QDialog(parent), ui{std::make_unique<Ui::ConfigureDialog>()}, +      registry(registry_), system{system_}, audio_tab{std::make_unique<ConfigureAudio>(system_, +                                                                                       this)},        cpu_tab{std::make_unique<ConfigureCpu>(system_, this)},        debug_tab_tab{std::make_unique<ConfigureDebugTab>(system_, this)},        filesystem_tab{std::make_unique<ConfigureFilesystem>(this)}, @@ -64,6 +64,7 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_,      ui->tabWidget->addTab(ui_tab.get(), tr("Game List"));      ui->tabWidget->addTab(web_tab.get(), tr("Web")); +    web_tab->SetWebServiceConfigEnabled(enable_web_config);      hotkeys_tab->Populate(registry);      setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); diff --git a/src/yuzu/configuration/configure_dialog.h b/src/yuzu/configuration/configure_dialog.h index 12cf25daf..1f724834a 100644 --- a/src/yuzu/configuration/configure_dialog.h +++ b/src/yuzu/configuration/configure_dialog.h @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #pragma once @@ -41,7 +40,8 @@ class ConfigureDialog : public QDialog {  public:      explicit ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_, -                             InputCommon::InputSubsystem* input_subsystem, Core::System& system_); +                             InputCommon::InputSubsystem* input_subsystem, Core::System& system_, +                             bool enable_web_config = true);      ~ConfigureDialog() override;      void ApplyConfiguration(); diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp index a31fabd3f..7ade01ba6 100644 --- a/src/yuzu/configuration/configure_general.cpp +++ b/src/yuzu/configuration/configure_general.cpp @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #include <functional>  #include <utility> @@ -27,9 +26,6 @@ ConfigureGeneral::ConfigureGeneral(const Core::System& system_, QWidget* parent)      connect(ui->button_reset_defaults, &QPushButton::clicked, this,              &ConfigureGeneral::ResetDefaults); - -    ui->fps_cap_label->setVisible(Settings::IsConfiguringGlobal()); -    ui->fps_cap_combobox->setVisible(!Settings::IsConfiguringGlobal());  }  ConfigureGeneral::~ConfigureGeneral() = default; @@ -52,8 +48,6 @@ void ConfigureGeneral::SetConfiguration() {      ui->toggle_speed_limit->setChecked(Settings::values.use_speed_limit.GetValue());      ui->speed_limit->setValue(Settings::values.speed_limit.GetValue()); -    ui->fps_cap->setValue(Settings::values.fps_cap.GetValue()); -      ui->button_reset_defaults->setEnabled(runtime_lock);      if (Settings::IsConfiguringGlobal()) { @@ -61,11 +55,6 @@ void ConfigureGeneral::SetConfiguration() {      } else {          ui->speed_limit->setEnabled(Settings::values.use_speed_limit.GetValue() &&                                      use_speed_limit != ConfigurationShared::CheckState::Global); - -        ui->fps_cap_combobox->setCurrentIndex(Settings::values.fps_cap.UsingGlobal() ? 0 : 1); -        ui->fps_cap->setEnabled(!Settings::values.fps_cap.UsingGlobal()); -        ConfigurationShared::SetHighlight(ui->fps_cap_layout, -                                          !Settings::values.fps_cap.UsingGlobal());      }  } @@ -102,8 +91,6 @@ void ConfigureGeneral::ApplyConfiguration() {          UISettings::values.mute_when_in_background = ui->toggle_background_mute->isChecked();          UISettings::values.hide_mouse = ui->toggle_hide_mouse->isChecked(); -        Settings::values.fps_cap.SetValue(ui->fps_cap->value()); -          // Guard if during game and set to game-specific value          if (Settings::values.use_speed_limit.UsingGlobal()) {              Settings::values.use_speed_limit.SetValue(ui->toggle_speed_limit->checkState() == @@ -119,13 +106,6 @@ void ConfigureGeneral::ApplyConfiguration() {                                                        Qt::Checked);              Settings::values.speed_limit.SetValue(ui->speed_limit->value());          } - -        if (ui->fps_cap_combobox->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) { -            Settings::values.fps_cap.SetGlobal(true); -        } else { -            Settings::values.fps_cap.SetGlobal(false); -            Settings::values.fps_cap.SetValue(ui->fps_cap->value()); -        }      }  } @@ -171,9 +151,4 @@ void ConfigureGeneral::SetupPerGameUI() {          ui->speed_limit->setEnabled(ui->toggle_speed_limit->isChecked() &&                                      (use_speed_limit != ConfigurationShared::CheckState::Global));      }); - -    connect(ui->fps_cap_combobox, qOverload<int>(&QComboBox::activated), this, [this](int index) { -        ui->fps_cap->setEnabled(index == 1); -        ConfigurationShared::SetHighlight(ui->fps_cap_layout, index == 1); -    });  } diff --git a/src/yuzu/configuration/configure_general.h b/src/yuzu/configuration/configure_general.h index b6f3bb5ed..a090c1a3f 100644 --- a/src/yuzu/configuration/configure_general.h +++ b/src/yuzu/configuration/configure_general.h @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #pragma once diff --git a/src/yuzu/configuration/configure_general.ui b/src/yuzu/configuration/configure_general.ui index c6ef2ab70..5b90b1109 100644 --- a/src/yuzu/configuration/configure_general.ui +++ b/src/yuzu/configuration/configure_general.ui @@ -28,87 +28,6 @@          <item>           <layout class="QVBoxLayout" name="GeneralVerticalLayout">            <item> -           <widget class="QWidget" name="fps_cap_layout" native="true"> -            <layout class="QHBoxLayout" name="horizontalLayout" stretch="1,1"> -             <property name="leftMargin"> -              <number>0</number> -             </property> -             <property name="topMargin"> -              <number>0</number> -             </property> -             <property name="rightMargin"> -              <number>0</number> -             </property> -             <property name="bottomMargin"> -              <number>0</number> -             </property> -             <item> -              <layout class="QHBoxLayout" name="horizontalLayout_4"> -               <item> -                <widget class="QComboBox" name="fps_cap_combobox"> -                 <property name="currentText"> -                  <string>Use global framerate cap</string> -                 </property> -                 <property name="currentIndex"> -                  <number>0</number> -                 </property> -                 <item> -                  <property name="text"> -                   <string>Use global framerate cap</string> -                  </property> -                 </item> -                 <item> -                  <property name="text"> -                   <string>Set framerate cap:</string> -                  </property> -                 </item> -                </widget> -               </item> -               <item> -                <widget class="QLabel" name="fps_cap_label"> -                 <property name="toolTip"> -                  <string>Requires the use of the FPS Limiter Toggle hotkey to take effect.</string> -                 </property> -                 <property name="text"> -                  <string>Framerate Cap</string> -                 </property> -                </widget> -               </item> -               <item> -                <spacer name="horizontalSpacer"> -                 <property name="orientation"> -                  <enum>Qt::Horizontal</enum> -                 </property> -                 <property name="sizeHint" stdset="0"> -                  <size> -                   <width>40</width> -                   <height>20</height> -                  </size> -                 </property> -                </spacer> -               </item> -              </layout> -             </item> -             <item> -              <widget class="QSpinBox" name="fps_cap"> -               <property name="suffix"> -                <string>x</string> -               </property> -               <property name="minimum"> -                <number>1</number> -               </property> -               <property name="maximum"> -                <number>1000</number> -               </property> -               <property name="value"> -                <number>500</number> -               </property> -              </widget> -             </item> -            </layout> -           </widget> -          </item> -          <item>             <layout class="QHBoxLayout" name="horizontalLayout_2">              <item>               <widget class="QCheckBox" name="toggle_speed_limit"> diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp index 85f34dc35..87e5d0f48 100644 --- a/src/yuzu/configuration/configure_graphics.cpp +++ b/src/yuzu/configuration/configure_graphics.cpp @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  // Include this early to include Vulkan headers how we want to  #include "video_core/vulkan_common/vulkan_wrapper.h" @@ -58,24 +57,9 @@ ConfigureGraphics::ConfigureGraphics(const Core::System& system_, QWidget* paren          UpdateBackgroundColorButton(new_bg_color);      }); -    connect(ui->button_check_vulkan, &QAbstractButton::clicked, this, [this] { -        UISettings::values.has_broken_vulkan = false; - -        if (RetrieveVulkanDevices()) { -            ui->api->setEnabled(true); -            ui->button_check_vulkan->hide(); - -            for (const auto& device : vulkan_devices) { -                ui->device->addItem(device); -            } -        } else { -            UISettings::values.has_broken_vulkan = true; -        } -    }); - -    ui->api->setEnabled(!UISettings::values.has_broken_vulkan.GetValue()); -    ui->button_check_vulkan->setVisible(UISettings::values.has_broken_vulkan.GetValue()); - +    ui->api->setEnabled(!UISettings::values.has_broken_vulkan); +    ui->api_widget->setEnabled(!UISettings::values.has_broken_vulkan || +                               Settings::IsConfiguringGlobal());      ui->bg_label->setVisible(Settings::IsConfiguringGlobal());      ui->bg_combobox->setVisible(!Settings::IsConfiguringGlobal());  } @@ -315,7 +299,7 @@ void ConfigureGraphics::UpdateAPILayout() {          vulkan_device = Settings::values.vulkan_device.GetValue(true);          shader_backend = Settings::values.shader_backend.GetValue(true);          ui->device_widget->setEnabled(false); -        ui->backend_widget->setEnabled(UISettings::values.has_broken_vulkan.GetValue()); +        ui->backend_widget->setEnabled(false);      } else {          vulkan_device = Settings::values.vulkan_device.GetValue();          shader_backend = Settings::values.shader_backend.GetValue(); @@ -337,9 +321,9 @@ void ConfigureGraphics::UpdateAPILayout() {      }  } -bool ConfigureGraphics::RetrieveVulkanDevices() try { +void ConfigureGraphics::RetrieveVulkanDevices() try {      if (UISettings::values.has_broken_vulkan) { -        return false; +        return;      }      using namespace Vulkan; @@ -355,11 +339,8 @@ bool ConfigureGraphics::RetrieveVulkanDevices() try {          const std::string name = vk::PhysicalDevice(device, dld).GetProperties().deviceName;          vulkan_devices.push_back(QString::fromStdString(name));      } - -    return true;  } catch (const Vulkan::vk::Exception& exception) {      LOG_ERROR(Frontend, "Failed to enumerate devices with error: {}", exception.what()); -    return false;  }  Settings::RendererBackend ConfigureGraphics::GetCurrentGraphicsBackend() const { @@ -440,11 +421,4 @@ void ConfigureGraphics::SetupPerGameUI() {          ui->api, static_cast<int>(Settings::values.renderer_backend.GetValue(true)));      ConfigurationShared::InsertGlobalItem(          ui->nvdec_emulation, static_cast<int>(Settings::values.nvdec_emulation.GetValue(true))); - -    if (UISettings::values.has_broken_vulkan) { -        ui->backend_widget->setEnabled(true); -        ConfigurationShared::SetColoredComboBox( -            ui->backend, ui->backend_widget, -            static_cast<int>(Settings::values.shader_backend.GetValue(true))); -    }  } diff --git a/src/yuzu/configuration/configure_graphics.h b/src/yuzu/configuration/configure_graphics.h index 8438f0187..70034eb1b 100644 --- a/src/yuzu/configuration/configure_graphics.h +++ b/src/yuzu/configuration/configure_graphics.h @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #pragma once @@ -41,7 +40,7 @@ private:      void UpdateDeviceSelection(int device);      void UpdateShaderBackendSelection(int backend); -    bool RetrieveVulkanDevices(); +    void RetrieveVulkanDevices();      void SetupPerGameUI(); diff --git a/src/yuzu/configuration/configure_graphics.ui b/src/yuzu/configuration/configure_graphics.ui index 2f94c94bc..1e4f74704 100644 --- a/src/yuzu/configuration/configure_graphics.ui +++ b/src/yuzu/configuration/configure_graphics.ui @@ -6,7 +6,7 @@     <rect>      <x>0</x>      <y>0</y> -    <width>471</width> +    <width>541</width>      <height>759</height>     </rect>    </property> @@ -574,13 +574,6 @@       </property>      </spacer>     </item> -   <item> -    <widget class="QPushButton" name="button_check_vulkan"> -     <property name="text"> -      <string>Check for Working Vulkan</string> -     </property> -    </widget> -   </item>    </layout>   </widget>   <resources/> diff --git a/src/yuzu/configuration/configure_graphics_advanced.ui b/src/yuzu/configuration/configure_graphics_advanced.ui index 96de0b3d1..d6d819364 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.ui +++ b/src/yuzu/configuration/configure_graphics_advanced.ui @@ -75,7 +75,7 @@             <string>VSync prevents the screen from tearing, but some graphics cards have lower performance with VSync enabled. Keep it enabled if you don't notice a performance difference.</string>            </property>            <property name="text"> -           <string>Use VSync (OpenGL only)</string> +           <string>Use VSync</string>            </property>           </widget>          </item> diff --git a/src/yuzu/configuration/configure_hotkeys.cpp b/src/yuzu/configuration/configure_hotkeys.cpp index edf0893c4..daa77a8f8 100644 --- a/src/yuzu/configuration/configure_hotkeys.cpp +++ b/src/yuzu/configuration/configure_hotkeys.cpp @@ -1,6 +1,5 @@ -// Copyright 2017 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2017 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #include <QMenu>  #include <QMessageBox> diff --git a/src/yuzu/configuration/configure_hotkeys.h b/src/yuzu/configuration/configure_hotkeys.h index f943ec538..b45ecb185 100644 --- a/src/yuzu/configuration/configure_hotkeys.h +++ b/src/yuzu/configuration/configure_hotkeys.h @@ -1,6 +1,5 @@ -// Copyright 2017 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2017 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #pragma once diff --git a/src/yuzu/configuration/configure_input.cpp b/src/yuzu/configuration/configure_input.cpp index 73d7ba24b..16fba3deb 100644 --- a/src/yuzu/configuration/configure_input.cpp +++ b/src/yuzu/configuration/configure_input.cpp @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #include <memory>  #include <thread> @@ -15,6 +14,7 @@  #include "ui_configure_input.h"  #include "ui_configure_input_advanced.h"  #include "ui_configure_input_player.h" +#include "yuzu/configuration/configure_camera.h"  #include "yuzu/configuration/configure_debug_controller.h"  #include "yuzu/configuration/configure_input.h"  #include "yuzu/configuration/configure_input_advanced.h" @@ -163,6 +163,10 @@ void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem,              [this, input_subsystem, &hid_core] {                  CallConfigureDialog<ConfigureRingController>(*this, input_subsystem, hid_core);              }); +    connect(advanced, &ConfigureInputAdvanced::CallCameraDialog, +            [this, input_subsystem, &hid_core] { +                CallConfigureDialog<ConfigureCamera>(*this, input_subsystem); +            });      connect(ui->vibrationButton, &QPushButton::clicked,              [this, &hid_core] { CallConfigureDialog<ConfigureVibration>(*this, hid_core); }); diff --git a/src/yuzu/configuration/configure_input.h b/src/yuzu/configuration/configure_input.h index 4cafa3dab..c89189c36 100644 --- a/src/yuzu/configuration/configure_input.h +++ b/src/yuzu/configuration/configure_input.h @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #pragma once diff --git a/src/yuzu/configuration/configure_input.ui b/src/yuzu/configuration/configure_input.ui index 2707025e7..d51774028 100644 --- a/src/yuzu/configuration/configure_input.ui +++ b/src/yuzu/configuration/configure_input.ui @@ -166,7 +166,7 @@           <item>            <widget class="QRadioButton" name="radioUndocked">             <property name="text"> -            <string>Undocked</string> +            <string>Handheld</string>             </property>            </widget>           </item> diff --git a/src/yuzu/configuration/configure_input_advanced.cpp b/src/yuzu/configuration/configure_input_advanced.cpp index f14bdc831..10f841b98 100644 --- a/src/yuzu/configuration/configure_input_advanced.cpp +++ b/src/yuzu/configuration/configure_input_advanced.cpp @@ -89,6 +89,7 @@ ConfigureInputAdvanced::ConfigureInputAdvanced(QWidget* parent)              [this] { CallMotionTouchConfigDialog(); });      connect(ui->ring_controller_configure, &QPushButton::clicked, this,              [this] { CallRingControllerDialog(); }); +    connect(ui->camera_configure, &QPushButton::clicked, this, [this] { CallCameraDialog(); });  #ifndef _WIN32      ui->enable_raw_input->setVisible(false); @@ -136,6 +137,7 @@ void ConfigureInputAdvanced::ApplyConfiguration() {      Settings::values.enable_udp_controller = ui->enable_udp_controller->isChecked();      Settings::values.controller_navigation = ui->controller_navigation->isChecked();      Settings::values.enable_ring_controller = ui->enable_ring_controller->isChecked(); +    Settings::values.enable_ir_sensor = ui->enable_ir_sensor->isChecked();  }  void ConfigureInputAdvanced::LoadConfiguration() { @@ -169,6 +171,7 @@ void ConfigureInputAdvanced::LoadConfiguration() {      ui->enable_udp_controller->setChecked(Settings::values.enable_udp_controller.GetValue());      ui->controller_navigation->setChecked(Settings::values.controller_navigation.GetValue());      ui->enable_ring_controller->setChecked(Settings::values.enable_ring_controller.GetValue()); +    ui->enable_ir_sensor->setChecked(Settings::values.enable_ir_sensor.GetValue());      UpdateUIEnabled();  } diff --git a/src/yuzu/configuration/configure_input_advanced.h b/src/yuzu/configuration/configure_input_advanced.h index 644e56dd8..fc1230284 100644 --- a/src/yuzu/configuration/configure_input_advanced.h +++ b/src/yuzu/configuration/configure_input_advanced.h @@ -29,6 +29,7 @@ signals:      void CallTouchscreenConfigDialog();      void CallMotionTouchConfigDialog();      void CallRingControllerDialog(); +    void CallCameraDialog();  private:      void changeEvent(QEvent* event) override; diff --git a/src/yuzu/configuration/configure_input_advanced.ui b/src/yuzu/configuration/configure_input_advanced.ui index 14403cb10..fac8cf827 100644 --- a/src/yuzu/configuration/configure_input_advanced.ui +++ b/src/yuzu/configuration/configure_input_advanced.ui @@ -2617,6 +2617,20 @@                   </property>                  </widget>                 </item> +               <item row="5" column="0"> +                <widget class="QCheckBox" name="enable_ir_sensor"> +                 <property name="text"> +                  <string>Infrared Camera</string> +                 </property> +                </widget> +               </item> +               <item row="5" column="2"> +                <widget class="QPushButton" name="camera_configure"> +                 <property name="text"> +                  <string>Configure</string> +                 </property> +                </widget> +               </item>                </layout>               </widget>              </item> diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index f3be9a374..109689c88 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #include <algorithm>  #include <memory> @@ -1476,7 +1475,7 @@ void ConfigureInputPlayer::keyPressEvent(QKeyEvent* event) {  void ConfigureInputPlayer::CreateProfile() {      const auto profile_name = -        LimitableInputDialog::GetText(this, tr("New Profile"), tr("Enter a profile name:"), 1, 20, +        LimitableInputDialog::GetText(this, tr("New Profile"), tr("Enter a profile name:"), 1, 30,                                        LimitableInputDialog::InputLimiter::Filesystem);      if (profile_name.isEmpty()) { diff --git a/src/yuzu/configuration/configure_input_player.h b/src/yuzu/configuration/configure_input_player.h index 47df6b3d3..79434fdd8 100644 --- a/src/yuzu/configuration/configure_input_player.h +++ b/src/yuzu/configuration/configure_input_player.h @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #pragma once diff --git a/src/yuzu/configuration/configure_motion_touch.cpp b/src/yuzu/configuration/configure_motion_touch.cpp index c313b0919..d1b870c72 100644 --- a/src/yuzu/configuration/configure_motion_touch.cpp +++ b/src/yuzu/configuration/configure_motion_touch.cpp @@ -1,6 +1,5 @@ -// Copyright 2018 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2018 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #include <sstream> diff --git a/src/yuzu/configuration/configure_motion_touch.h b/src/yuzu/configuration/configure_motion_touch.h index 91d1ae671..7dcc9318e 100644 --- a/src/yuzu/configuration/configure_motion_touch.h +++ b/src/yuzu/configuration/configure_motion_touch.h @@ -1,6 +1,5 @@ -// Copyright 2018 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2018 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #pragma once diff --git a/src/yuzu/configuration/configure_network.cpp b/src/yuzu/configuration/configure_network.cpp index 8ed08fa6a..ba1986eb1 100644 --- a/src/yuzu/configuration/configure_network.cpp +++ b/src/yuzu/configuration/configure_network.cpp @@ -4,7 +4,7 @@  #include <QtConcurrent/QtConcurrent>  #include "common/settings.h"  #include "core/core.h" -#include "core/network/network_interface.h" +#include "core/internal_network/network_interface.h"  #include "ui_configure_network.h"  #include "yuzu/configuration/configure_network.h" diff --git a/src/yuzu/configuration/configure_per_game_addons.cpp b/src/yuzu/configuration/configure_per_game_addons.cpp index 4906997ab..674a75a62 100644 --- a/src/yuzu/configuration/configure_per_game_addons.cpp +++ b/src/yuzu/configuration/configure_per_game_addons.cpp @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #include <algorithm>  #include <memory> diff --git a/src/yuzu/configuration/configure_per_game_addons.h b/src/yuzu/configuration/configure_per_game_addons.h index 14690fba8..53db405c1 100644 --- a/src/yuzu/configuration/configure_per_game_addons.h +++ b/src/yuzu/configuration/configure_per_game_addons.h @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #pragma once diff --git a/src/yuzu/configuration/configure_profile_manager.cpp b/src/yuzu/configuration/configure_profile_manager.cpp index 5442fe328..5c0217ba8 100644 --- a/src/yuzu/configuration/configure_profile_manager.cpp +++ b/src/yuzu/configuration/configure_profile_manager.cpp @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #include <algorithm>  #include <QFileDialog> diff --git a/src/yuzu/configuration/configure_profile_manager.h b/src/yuzu/configuration/configure_profile_manager.h index 575cb89d5..fe9033779 100644 --- a/src/yuzu/configuration/configure_profile_manager.h +++ b/src/yuzu/configuration/configure_profile_manager.h @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #pragma once diff --git a/src/yuzu/configuration/configure_system.cpp b/src/yuzu/configuration/configure_system.cpp index ecebb0fb7..bc9d9d77a 100644 --- a/src/yuzu/configuration/configure_system.cpp +++ b/src/yuzu/configuration/configure_system.cpp @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #include <chrono>  #include <optional> diff --git a/src/yuzu/configuration/configure_system.h b/src/yuzu/configuration/configure_system.h index 5a1633192..8f02880a7 100644 --- a/src/yuzu/configuration/configure_system.h +++ b/src/yuzu/configuration/configure_system.h @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #pragma once diff --git a/src/yuzu/configuration/configure_touch_from_button.cpp b/src/yuzu/configuration/configure_touch_from_button.cpp index 06cc452c3..18e2eba69 100644 --- a/src/yuzu/configuration/configure_touch_from_button.cpp +++ b/src/yuzu/configuration/configure_touch_from_button.cpp @@ -1,6 +1,5 @@ -// Copyright 2020 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2020 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #include <QInputDialog>  #include <QKeyEvent> diff --git a/src/yuzu/configuration/configure_touch_from_button.h b/src/yuzu/configuration/configure_touch_from_button.h index b8c55db66..5a1416d00 100644 --- a/src/yuzu/configuration/configure_touch_from_button.h +++ b/src/yuzu/configuration/configure_touch_from_button.h @@ -1,6 +1,5 @@ -// Copyright 2020 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2020 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #pragma once diff --git a/src/yuzu/configuration/configure_touch_widget.h b/src/yuzu/configuration/configure_touch_widget.h index 347b46583..49f533afe 100644 --- a/src/yuzu/configuration/configure_touch_widget.h +++ b/src/yuzu/configuration/configure_touch_widget.h @@ -1,6 +1,5 @@ -// Copyright 2020 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2020 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #pragma once diff --git a/src/yuzu/configuration/configure_touchscreen_advanced.cpp b/src/yuzu/configuration/configure_touchscreen_advanced.cpp index 29c86c7bc..5a03e48df 100644 --- a/src/yuzu/configuration/configure_touchscreen_advanced.cpp +++ b/src/yuzu/configuration/configure_touchscreen_advanced.cpp @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #include <memory>  #include "ui_configure_touchscreen_advanced.h" diff --git a/src/yuzu/configuration/configure_touchscreen_advanced.h b/src/yuzu/configuration/configure_touchscreen_advanced.h index 72061492c..034dc0d46 100644 --- a/src/yuzu/configuration/configure_touchscreen_advanced.h +++ b/src/yuzu/configuration/configure_touchscreen_advanced.h @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #pragma once diff --git a/src/yuzu/configuration/configure_ui.cpp b/src/yuzu/configuration/configure_ui.cpp index d3a60cdd1..48f71b53c 100644 --- a/src/yuzu/configuration/configure_ui.cpp +++ b/src/yuzu/configuration/configure_ui.cpp @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #include <array>  #include <utility> @@ -220,6 +219,7 @@ void ConfigureUi::InitializeLanguageComboBox() {      for (const auto& lang : languages) {          if (QString::fromLatin1(lang.id) == QStringLiteral("en")) {              ui->language_combobox->addItem(lang.name, QStringLiteral("en")); +            language_files.removeOne(QStringLiteral("en.qm"));              continue;          }          for (int i = 0; i < language_files.size(); ++i) { diff --git a/src/yuzu/configuration/configure_ui.h b/src/yuzu/configuration/configure_ui.h index 48b6e6d82..95af8370e 100644 --- a/src/yuzu/configuration/configure_ui.h +++ b/src/yuzu/configuration/configure_ui.h @@ -1,6 +1,5 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #pragma once diff --git a/src/yuzu/configuration/configure_web.cpp b/src/yuzu/configuration/configure_web.cpp index d779251b4..d668c992b 100644 --- a/src/yuzu/configuration/configure_web.cpp +++ b/src/yuzu/configuration/configure_web.cpp @@ -1,6 +1,5 @@ -// Copyright 2017 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2017 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #include <QIcon>  #include <QMessageBox> @@ -169,3 +168,8 @@ void ConfigureWeb::OnLoginVerified() {                                   "correctly, and that your internet connection is working."));      }  } + +void ConfigureWeb::SetWebServiceConfigEnabled(bool enabled) { +    ui->label_disable_info->setVisible(!enabled); +    ui->groupBoxWebConfig->setEnabled(enabled); +} diff --git a/src/yuzu/configuration/configure_web.h b/src/yuzu/configuration/configure_web.h index 9054711ea..03feb55f8 100644 --- a/src/yuzu/configuration/configure_web.h +++ b/src/yuzu/configuration/configure_web.h @@ -1,6 +1,5 @@ -// Copyright 2017 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. +// SPDX-FileCopyrightText: 2017 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later  #pragma once @@ -20,6 +19,7 @@ public:      ~ConfigureWeb() override;      void ApplyConfiguration(); +    void SetWebServiceConfigEnabled(bool enabled);  private:      void changeEvent(QEvent* event) override; diff --git a/src/yuzu/configuration/configure_web.ui b/src/yuzu/configuration/configure_web.ui index 35b4274b0..3ac3864be 100644 --- a/src/yuzu/configuration/configure_web.ui +++ b/src/yuzu/configuration/configure_web.ui @@ -113,6 +113,16 @@        </widget>       </item>       <item> +      <widget class="QLabel" name="label_disable_info"> +       <property name="text"> +        <string>Web Service configuration can only be changed when a public room isn't being hosted.</string> +       </property> +       <property name="wordWrap"> +        <bool>true</bool> +       </property> +      </widget> +     </item> +     <item>        <widget class="QGroupBox" name="groupBox">         <property name="title">          <string>Telemetry</string> | 
