diff options
Diffstat (limited to 'src/yuzu')
| -rw-r--r-- | src/yuzu/configuration/configure_debug.cpp | 3 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_debug.ui | 99 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_ui.cpp | 7 | ||||
| -rw-r--r-- | src/yuzu/configuration/shared_widget.cpp | 171 | ||||
| -rw-r--r-- | src/yuzu/configuration/shared_widget.h | 21 | ||||
| -rw-r--r-- | src/yuzu/hotkeys.h | 4 | ||||
| -rw-r--r-- | src/yuzu/main.cpp | 6 | 
7 files changed, 215 insertions, 96 deletions
| diff --git a/src/yuzu/configuration/configure_debug.cpp b/src/yuzu/configuration/configure_debug.cpp index cbeb8f168..b22fda746 100644 --- a/src/yuzu/configuration/configure_debug.cpp +++ b/src/yuzu/configuration/configure_debug.cpp @@ -59,6 +59,8 @@ void ConfigureDebug::SetConfiguration() {      ui->use_debug_asserts->setChecked(Settings::values.use_debug_asserts.GetValue());      ui->use_auto_stub->setChecked(Settings::values.use_auto_stub.GetValue());      ui->enable_all_controllers->setChecked(Settings::values.enable_all_controllers.GetValue()); +    ui->enable_renderdoc_hotkey->setEnabled(runtime_lock); +    ui->enable_renderdoc_hotkey->setChecked(Settings::values.enable_renderdoc_hotkey.GetValue());      ui->enable_graphics_debugging->setEnabled(runtime_lock);      ui->enable_graphics_debugging->setChecked(Settings::values.renderer_debug.GetValue());      ui->enable_shader_feedback->setEnabled(runtime_lock); @@ -111,6 +113,7 @@ void ConfigureDebug::ApplyConfiguration() {      Settings::values.use_auto_stub = ui->use_auto_stub->isChecked();      Settings::values.enable_all_controllers = ui->enable_all_controllers->isChecked();      Settings::values.renderer_debug = ui->enable_graphics_debugging->isChecked(); +    Settings::values.enable_renderdoc_hotkey = ui->enable_renderdoc_hotkey->isChecked();      Settings::values.renderer_shader_feedback = ui->enable_shader_feedback->isChecked();      Settings::values.cpu_debug_mode = ui->enable_cpu_debugging->isChecked();      Settings::values.enable_nsight_aftermath = ui->enable_nsight_aftermath->isChecked(); diff --git a/src/yuzu/configuration/configure_debug.ui b/src/yuzu/configuration/configure_debug.ui index 97c7d9022..66b8b7459 100644 --- a/src/yuzu/configuration/configure_debug.ui +++ b/src/yuzu/configuration/configure_debug.ui @@ -18,8 +18,8 @@      <rect>       <x>0</x>       <y>0</y> -     <width>829</width> -     <height>758</height> +     <width>842</width> +     <height>741</height>      </rect>     </property>     <layout class="QVBoxLayout" name="verticalLayout_1"> @@ -260,7 +260,7 @@           <string>Graphics</string>          </property>          <layout class="QGridLayout" name="gridLayout_2"> -         <item row="3" column="0"> +         <item row="4" column="0">            <widget class="QCheckBox" name="disable_loop_safety_checks">             <property name="toolTip">              <string>When checked, it executes shaders without loop logic changes</string> @@ -270,33 +270,53 @@             </property>            </widget>           </item> -         <item row="4" column="0"> -          <widget class="QCheckBox" name="dump_shaders"> +         <item row="8" column="0"> +          <widget class="QCheckBox" name="disable_macro_hle">             <property name="enabled">              <bool>true</bool>             </property>             <property name="toolTip"> -            <string>When checked, it will dump all the original assembler shaders from the disk shader cache or game as found</string> +            <string>When checked, it disables the macro HLE functions. Enabling this makes games run slower</string>             </property>             <property name="text"> -            <string>Dump Game Shaders</string> +            <string>Disable Macro HLE</string>             </property>            </widget>           </item>           <item row="7" column="0"> -          <widget class="QCheckBox" name="disable_macro_hle"> +          <widget class="QCheckBox" name="dump_macros">             <property name="enabled">              <bool>true</bool>             </property>             <property name="toolTip"> -            <string>When checked, it disables the macro HLE functions. Enabling this makes games run slower</string> +            <string>When checked, it will dump all the macro programs of the GPU</string>             </property>             <property name="text"> -            <string>Disable Macro HLE</string> +            <string>Dump Maxwell Macros</string>             </property>            </widget>           </item> -         <item row="5" column="0"> +         <item row="3" column="0"> +          <widget class="QCheckBox" name="enable_nsight_aftermath"> +           <property name="toolTip"> +            <string>When checked, it enables Nsight Aftermath crash dumps</string> +           </property> +           <property name="text"> +            <string>Enable Nsight Aftermath</string> +           </property> +          </widget> +         </item> +         <item row="2" column="0"> +          <widget class="QCheckBox" name="enable_shader_feedback"> +           <property name="toolTip"> +            <string>When checked, yuzu will log statistics about the compiled pipeline cache</string> +           </property> +           <property name="text"> +            <string>Enable Shader Feedback</string> +           </property> +          </widget> +         </item> +         <item row="6" column="0">            <widget class="QCheckBox" name="disable_macro_jit">             <property name="enabled">              <bool>true</bool> @@ -309,6 +329,22 @@             </property>            </widget>           </item> +         <item row="9" column="0"> +          <spacer name="verticalSpacer_5"> +           <property name="orientation"> +            <enum>Qt::Vertical</enum> +           </property> +           <property name="sizeType"> +            <enum>QSizePolicy::Preferred</enum> +           </property> +           <property name="sizeHint" stdset="0"> +            <size> +             <width>20</width> +             <height>0</height> +            </size> +           </property> +          </spacer> +         </item>           <item row="0" column="0">            <widget class="QCheckBox" name="enable_graphics_debugging">             <property name="enabled"> @@ -322,55 +358,26 @@             </property>            </widget>           </item> -         <item row="6" column="0"> -          <widget class="QCheckBox" name="dump_macros"> +         <item row="5" column="0"> +          <widget class="QCheckBox" name="dump_shaders">             <property name="enabled">              <bool>true</bool>             </property>             <property name="toolTip"> -            <string>When checked, it will dump all the macro programs of the GPU</string> +            <string>When checked, it will dump all the original assembler shaders from the disk shader cache or game as found</string>             </property>             <property name="text"> -            <string>Dump Maxwell Macros</string> +            <string>Dump Game Shaders</string>             </property>            </widget>           </item>           <item row="1" column="0"> -          <widget class="QCheckBox" name="enable_shader_feedback"> -           <property name="toolTip"> -            <string>When checked, yuzu will log statistics about the compiled pipeline cache</string> -           </property> -           <property name="text"> -            <string>Enable Shader Feedback</string> -           </property> -          </widget> -         </item> -         <item row="2" column="0"> -          <widget class="QCheckBox" name="enable_nsight_aftermath"> -           <property name="toolTip"> -            <string>When checked, it enables Nsight Aftermath crash dumps</string> -           </property> +          <widget class="QCheckBox" name="enable_renderdoc_hotkey">             <property name="text"> -            <string>Enable Nsight Aftermath</string> +            <string>Enable Renderdoc Hotkey</string>             </property>            </widget>           </item> -         <item row="8" column="0"> -          <spacer name="verticalSpacer_5"> -           <property name="orientation"> -            <enum>Qt::Vertical</enum> -           </property> -           <property name="sizeType"> -            <enum>QSizePolicy::Preferred</enum> -           </property> -           <property name="sizeHint" stdset="0"> -            <size> -             <width>20</width> -             <height>0</height> -            </size> -           </property> -          </spacer> -         </item>          </layout>         </widget>        </item> diff --git a/src/yuzu/configuration/configure_ui.cpp b/src/yuzu/configuration/configure_ui.cpp index 34ab01617..a9fde9f4f 100644 --- a/src/yuzu/configuration/configure_ui.cpp +++ b/src/yuzu/configuration/configure_ui.cpp @@ -4,6 +4,7 @@  #include "yuzu/configuration/configure_ui.h"  #include <array> +#include <cstdlib>  #include <set>  #include <stdexcept>  #include <string> @@ -94,11 +95,7 @@ static void PopulateResolutionComboBox(QComboBox* screenshot_height, QWidget* pa  }  static u32 ScreenshotDimensionToInt(const QString& height) { -    try { -        return std::stoi(height.toStdString()); -    } catch (std::invalid_argument&) { -        return 0; -    } +    return std::strtoul(height.toUtf8(), nullptr, 0);  }  ConfigureUi::ConfigureUi(Core::System& system_, QWidget* parent) diff --git a/src/yuzu/configuration/shared_widget.cpp b/src/yuzu/configuration/shared_widget.cpp index d63093985..ea8d7add4 100644 --- a/src/yuzu/configuration/shared_widget.cpp +++ b/src/yuzu/configuration/shared_widget.cpp @@ -63,7 +63,7 @@ static QString DefaultSuffix(QWidget* parent, Settings::BasicSetting& setting) {          return tr("%", context.c_str());      } -    return QStringLiteral(""); +    return default_suffix;  }  QPushButton* Widget::CreateRestoreGlobalButton(bool using_global, QWidget* parent) { @@ -71,7 +71,7 @@ QPushButton* Widget::CreateRestoreGlobalButton(bool using_global, QWidget* paren      QStyle* style = parent->style();      QIcon* icon = new QIcon(style->standardIcon(QStyle::SP_LineEditClearButton)); -    QPushButton* restore_button = new QPushButton(*icon, QStringLiteral(""), parent); +    QPushButton* restore_button = new QPushButton(*icon, QStringLiteral(), parent);      restore_button->setObjectName(QStringLiteral("RestoreButton%1").arg(restore_button_count));      restore_button->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); @@ -151,7 +151,7 @@ QWidget* Widget::CreateCombobox(std::function<std::string()>& serializer,          return -1;      }; -    const u32 setting_value = std::stoi(setting.ToString()); +    const u32 setting_value = std::strtoul(setting.ToString().c_str(), nullptr, 0);      combobox->setCurrentIndex(find_index(setting_value));      serializer = [this, enumeration]() { @@ -160,7 +160,7 @@ QWidget* Widget::CreateCombobox(std::function<std::string()>& serializer,      };      restore_func = [this, find_index]() { -        const u32 global_value = std::stoi(RelevantDefault(setting)); +        const u32 global_value = std::strtoul(RelevantDefault(setting).c_str(), nullptr, 0);          combobox->setCurrentIndex(find_index(global_value));      }; @@ -209,7 +209,7 @@ QWidget* Widget::CreateRadioGroup(std::function<std::string()>& serializer,          }      }; -    const u32 setting_value = std::stoi(setting.ToString()); +    const u32 setting_value = std::strtoul(setting.ToString().c_str(), nullptr, 0);      set_index(setting_value);      serializer = [get_selected]() { @@ -218,7 +218,7 @@ QWidget* Widget::CreateRadioGroup(std::function<std::string()>& serializer,      };      restore_func = [this, set_index]() { -        const u32 global_value = std::stoi(RelevantDefault(setting)); +        const u32 global_value = std::strtoul(RelevantDefault(setting).c_str(), nullptr, 0);          set_index(global_value);      }; @@ -255,6 +255,59 @@ QWidget* Widget::CreateLineEdit(std::function<std::string()>& serializer,      return line_edit;  } +static void CreateIntSlider(Settings::BasicSetting& setting, bool reversed, float multiplier, +                            QLabel* feedback, const QString& use_format, QSlider* slider, +                            std::function<std::string()>& serializer, +                            std::function<void()>& restore_func) { +    const int max_val = std::strtol(setting.MaxVal().c_str(), nullptr, 0); + +    const auto update_feedback = [=](int value) { +        int present = (reversed ? max_val - value : value) * multiplier + 0.5f; +        feedback->setText(use_format.arg(QVariant::fromValue(present).value<QString>())); +    }; + +    QObject::connect(slider, &QAbstractSlider::valueChanged, update_feedback); +    update_feedback(std::strtol(setting.ToString().c_str(), nullptr, 0)); + +    slider->setMinimum(std::strtol(setting.MinVal().c_str(), nullptr, 0)); +    slider->setMaximum(max_val); +    slider->setValue(std::strtol(setting.ToString().c_str(), nullptr, 0)); + +    serializer = [slider]() { return std::to_string(slider->value()); }; +    restore_func = [slider, &setting]() { +        slider->setValue(std::strtol(RelevantDefault(setting).c_str(), nullptr, 0)); +    }; +} + +static void CreateFloatSlider(Settings::BasicSetting& setting, bool reversed, float multiplier, +                              QLabel* feedback, const QString& use_format, QSlider* slider, +                              std::function<std::string()>& serializer, +                              std::function<void()>& restore_func) { +    const float max_val = std::strtof(setting.MaxVal().c_str(), nullptr); +    const float min_val = std::strtof(setting.MinVal().c_str(), nullptr); +    const float use_multiplier = +        multiplier == default_multiplier ? default_float_multiplier : multiplier; + +    const auto update_feedback = [=](float value) { +        int present = (reversed ? max_val - value : value) + 0.5f; +        feedback->setText(use_format.arg(QVariant::fromValue(present).value<QString>())); +    }; + +    QObject::connect(slider, &QAbstractSlider::valueChanged, update_feedback); +    update_feedback(std::strtof(setting.ToString().c_str(), nullptr)); + +    slider->setMinimum(min_val * use_multiplier); +    slider->setMaximum(max_val * use_multiplier); +    slider->setValue(std::strtof(setting.ToString().c_str(), nullptr) * use_multiplier); + +    serializer = [slider, use_multiplier]() { +        return std::to_string(slider->value() / use_multiplier); +    }; +    restore_func = [slider, &setting, use_multiplier]() { +        slider->setValue(std::strtof(RelevantDefault(setting).c_str(), nullptr) * use_multiplier); +    }; +} +  QWidget* Widget::CreateSlider(bool reversed, float multiplier, const QString& given_suffix,                                std::function<std::string()>& serializer,                                std::function<void()>& restore_func, @@ -278,27 +331,19 @@ QWidget* Widget::CreateSlider(bool reversed, float multiplier, const QString& gi      layout->setContentsMargins(0, 0, 0, 0); -    int max_val = std::stoi(setting.MaxVal()); - -    QString suffix = -        given_suffix == QStringLiteral("") ? DefaultSuffix(this, setting) : given_suffix; +    QString suffix = given_suffix == default_suffix ? DefaultSuffix(this, setting) : given_suffix;      const QString use_format = QStringLiteral("%1").append(suffix); -    QObject::connect(slider, &QAbstractSlider::valueChanged, [=](int value) { -        int present = (reversed ? max_val - value : value) * multiplier + 0.5f; -        feedback->setText(use_format.arg(QVariant::fromValue(present).value<QString>())); -    }); - -    slider->setMinimum(std::stoi(setting.MinVal())); -    slider->setMaximum(max_val); -    slider->setValue(std::stoi(setting.ToString())); +    if (setting.IsIntegral()) { +        CreateIntSlider(setting, reversed, multiplier, feedback, use_format, slider, serializer, +                        restore_func); +    } else { +        CreateFloatSlider(setting, reversed, multiplier, feedback, use_format, slider, serializer, +                          restore_func); +    }      slider->setInvertedAppearance(reversed); -    slider->setInvertedControls(reversed); - -    serializer = [this]() { return std::to_string(slider->value()); }; -    restore_func = [this]() { slider->setValue(std::stoi(RelevantDefault(setting))); };      if (!Settings::IsConfiguringGlobal()) {          QObject::connect(slider, &QAbstractSlider::actionTriggered, [touch]() { touch(); }); @@ -311,14 +356,11 @@ QWidget* Widget::CreateSpinBox(const QString& given_suffix,                                 std::function<std::string()>& serializer,                                 std::function<void()>& restore_func,                                 const std::function<void()>& touch) { -    const int min_val = -        setting.Ranged() ? std::stoi(setting.MinVal()) : std::numeric_limits<int>::min(); -    const int max_val = -        setting.Ranged() ? std::stoi(setting.MaxVal()) : std::numeric_limits<int>::max(); -    const int default_val = std::stoi(setting.ToString()); +    const auto min_val = std::strtol(setting.MinVal().c_str(), nullptr, 0); +    const auto max_val = std::strtol(setting.MaxVal().c_str(), nullptr, 0); +    const auto default_val = std::strtol(setting.ToString().c_str(), nullptr, 0); -    QString suffix = -        given_suffix == QStringLiteral("") ? DefaultSuffix(this, setting) : given_suffix; +    QString suffix = given_suffix == default_suffix ? DefaultSuffix(this, setting) : given_suffix;      spinbox = new QSpinBox(this);      spinbox->setRange(min_val, max_val); @@ -329,13 +371,13 @@ QWidget* Widget::CreateSpinBox(const QString& given_suffix,      serializer = [this]() { return std::to_string(spinbox->value()); };      restore_func = [this]() { -        auto value{std::stol(RelevantDefault(setting))}; +        auto value{std::strtol(RelevantDefault(setting).c_str(), nullptr, 0)};          spinbox->setValue(value);      };      if (!Settings::IsConfiguringGlobal()) {          QObject::connect(spinbox, QOverload<int>::of(&QSpinBox::valueChanged), [this, touch]() { -            if (spinbox->value() != std::stoi(setting.ToStringGlobal())) { +            if (spinbox->value() != std::strtol(setting.ToStringGlobal().c_str(), nullptr, 0)) {                  touch();              }          }); @@ -344,6 +386,42 @@ QWidget* Widget::CreateSpinBox(const QString& given_suffix,      return spinbox;  } +QWidget* Widget::CreateDoubleSpinBox(const QString& given_suffix, +                                     std::function<std::string()>& serializer, +                                     std::function<void()>& restore_func, +                                     const std::function<void()>& touch) { +    const auto min_val = std::strtod(setting.MinVal().c_str(), nullptr); +    const auto max_val = std::strtod(setting.MaxVal().c_str(), nullptr); +    const auto default_val = std::strtod(setting.ToString().c_str(), nullptr); + +    QString suffix = given_suffix == default_suffix ? DefaultSuffix(this, setting) : given_suffix; + +    double_spinbox = new QDoubleSpinBox(this); +    double_spinbox->setRange(min_val, max_val); +    double_spinbox->setValue(default_val); +    double_spinbox->setSuffix(suffix); +    double_spinbox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + +    serializer = [this]() { return fmt::format("{:f}", double_spinbox->value()); }; + +    restore_func = [this]() { +        auto value{std::strtod(RelevantDefault(setting).c_str(), nullptr)}; +        double_spinbox->setValue(value); +    }; + +    if (!Settings::IsConfiguringGlobal()) { +        QObject::connect(double_spinbox, QOverload<double>::of(&QDoubleSpinBox::valueChanged), +                         [this, touch]() { +                             if (double_spinbox->value() != +                                 std::strtod(setting.ToStringGlobal().c_str(), nullptr)) { +                                 touch(); +                             } +                         }); +    } + +    return double_spinbox; +} +  QWidget* Widget::CreateHexEdit(std::function<std::string()>& serializer,                                 std::function<void()>& restore_func,                                 const std::function<void()>& touch) { @@ -353,7 +431,8 @@ QWidget* Widget::CreateHexEdit(std::function<std::string()>& serializer,      }      auto to_hex = [=](const std::string& input) { -        return QString::fromStdString(fmt::format("{:08x}", std::stoul(input))); +        return QString::fromStdString( +            fmt::format("{:08x}", std::strtoul(input.c_str(), nullptr, 0)));      };      QRegularExpressionValidator* regex = new QRegularExpressionValidator( @@ -366,7 +445,7 @@ QWidget* Widget::CreateHexEdit(std::function<std::string()>& serializer,      line_edit->setValidator(regex);      auto hex_to_dec = [this]() -> std::string { -        return std::to_string(std::stoul(line_edit->text().toStdString(), nullptr, 16)); +        return std::to_string(std::strtoul(line_edit->text().toStdString().c_str(), nullptr, 16));      };      serializer = [hex_to_dec]() { return hex_to_dec(); }; @@ -386,7 +465,8 @@ QWidget* Widget::CreateDateTimeEdit(bool disabled, bool restrict,                                      std::function<void()>& restore_func,                                      const std::function<void()>& touch) {      const long long current_time = QDateTime::currentSecsSinceEpoch(); -    const s64 the_time = disabled ? current_time : std::stoll(setting.ToString()); +    const s64 the_time = +        disabled ? current_time : std::strtoll(setting.ToString().c_str(), nullptr, 0);      const auto default_val = QDateTime::fromSecsSinceEpoch(the_time);      date_time_edit = new QDateTimeEdit(this); @@ -399,7 +479,7 @@ QWidget* Widget::CreateDateTimeEdit(bool disabled, bool restrict,      auto get_clear_val = [this, restrict, current_time]() {          return QDateTime::fromSecsSinceEpoch([this, restrict, current_time]() {              if (restrict && checkbox->checkState() == Qt::Checked) { -                return std::stoll(RelevantDefault(setting)); +                return std::strtoll(RelevantDefault(setting).c_str(), nullptr, 0);              }              return current_time;          }()); @@ -506,8 +586,7 @@ void Widget::SetupComponent(const QString& label, std::function<void()>& load_fu          } else {              data_component = CreateCombobox(serializer, restore_func, touch);          } -    } else if (type == typeid(u32) || type == typeid(int) || type == typeid(u16) || -               type == typeid(s64) || type == typeid(u8)) { +    } else if (setting.IsIntegral()) {          switch (request) {          case RequestType::Slider:          case RequestType::ReverseSlider: @@ -534,6 +613,20 @@ void Widget::SetupComponent(const QString& label, std::function<void()>& load_fu          default:              UNIMPLEMENTED();          } +    } else if (setting.IsFloatingPoint()) { +        switch (request) { +        case RequestType::Default: +        case RequestType::SpinBox: +            data_component = CreateDoubleSpinBox(suffix, serializer, restore_func, touch); +            break; +        case RequestType::Slider: +        case RequestType::ReverseSlider: +            data_component = CreateSlider(request == RequestType::ReverseSlider, multiplier, suffix, +                                          serializer, restore_func, touch); +            break; +        default: +            UNIMPLEMENTED(); +        }      } else if (type == typeid(std::string)) {          switch (request) {          case RequestType::Default: @@ -638,10 +731,10 @@ Widget::Widget(Settings::BasicSetting* setting_, const TranslationMap& translati              return std::pair{translations.at(id).first, translations.at(id).second};          }          LOG_WARNING(Frontend, "Translation table lacks entry for \"{}\"", setting_label); -        return std::pair{QString::fromStdString(setting_label), QStringLiteral("")}; +        return std::pair{QString::fromStdString(setting_label), QStringLiteral()};      }(); -    if (label == QStringLiteral("")) { +    if (label == QStringLiteral()) {          LOG_DEBUG(Frontend, "Translation table has empty entry for \"{}\", skipping...",                    setting.GetLabel());          return; diff --git a/src/yuzu/configuration/shared_widget.h b/src/yuzu/configuration/shared_widget.h index 5303dd898..226284cf3 100644 --- a/src/yuzu/configuration/shared_widget.h +++ b/src/yuzu/configuration/shared_widget.h @@ -22,6 +22,7 @@ class QObject;  class QPushButton;  class QSlider;  class QSpinBox; +class QDoubleSpinBox;  class QRadioButton;  namespace Settings { @@ -43,6 +44,10 @@ enum class RequestType {      MaxEnum,  }; +constexpr float default_multiplier{1.f}; +constexpr float default_float_multiplier{100.f}; +static const QString default_suffix = QStringLiteral(); +  class Widget : public QWidget {      Q_OBJECT @@ -66,8 +71,9 @@ public:                      const ComboboxTranslationMap& combobox_translations, QWidget* parent,                      bool runtime_lock, std::vector<std::function<void(bool)>>& apply_funcs_,                      RequestType request = RequestType::Default, bool managed = true, -                    float multiplier = 1.0f, Settings::BasicSetting* other_setting = nullptr, -                    const QString& suffix = QStringLiteral("")); +                    float multiplier = default_multiplier, +                    Settings::BasicSetting* other_setting = nullptr, +                    const QString& suffix = default_suffix);      virtual ~Widget();      /** @@ -89,6 +95,7 @@ public:      QPushButton* restore_button{}; ///< Restore button for custom configurations      QLineEdit* line_edit{};        ///< QLineEdit, used for LineEdit and HexEdit      QSpinBox* spinbox{}; +    QDoubleSpinBox* double_spinbox{};      QCheckBox* checkbox{};      QSlider* slider{};      QComboBox* combobox{}; @@ -126,6 +133,9 @@ private:                                  const std::function<void()>& touch);      QWidget* CreateSpinBox(const QString& suffix, std::function<std::string()>& serializer,                             std::function<void()>& restore_func, const std::function<void()>& touch); +    QWidget* CreateDoubleSpinBox(const QString& suffix, std::function<std::string()>& serializer, +                                 std::function<void()>& restore_func, +                                 const std::function<void()>& touch);      QWidget* parent;      const TranslationMap& translations; @@ -145,14 +155,15 @@ public:      Widget* BuildWidget(Settings::BasicSetting* setting,                          std::vector<std::function<void(bool)>>& apply_funcs,                          RequestType request = RequestType::Default, bool managed = true, -                        float multiplier = 1.0f, Settings::BasicSetting* other_setting = nullptr, -                        const QString& suffix = QStringLiteral("")) const; +                        float multiplier = default_multiplier, +                        Settings::BasicSetting* other_setting = nullptr, +                        const QString& suffix = default_suffix) const;      Widget* BuildWidget(Settings::BasicSetting* setting,                          std::vector<std::function<void(bool)>>& apply_funcs,                          Settings::BasicSetting* other_setting,                          RequestType request = RequestType::Default, -                        const QString& suffix = QStringLiteral("")) const; +                        const QString& suffix = default_suffix) const;      const ComboboxTranslationMap& ComboboxTranslations() const; diff --git a/src/yuzu/hotkeys.h b/src/yuzu/hotkeys.h index 848239c35..56eee8d82 100644 --- a/src/yuzu/hotkeys.h +++ b/src/yuzu/hotkeys.h @@ -4,10 +4,12 @@  #pragma once  #include <map> +#include <QKeySequence> +#include <QString> +#include <QWidget>  #include "core/hid/hid_types.h"  class QDialog; -class QKeySequence;  class QSettings;  class QShortcut;  class ControllerShortcut; diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 97d216638..d32aa9615 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -9,6 +9,7 @@  #include <memory>  #include <thread>  #include "core/loader/nca.h" +#include "core/tools/renderdoc.h"  #ifdef __APPLE__  #include <unistd.h> // for chdir  #endif @@ -1348,6 +1349,11 @@ void GMainWindow::InitializeHotkeys() {      connect_shortcut(QStringLiteral("Toggle Framerate Limit"), [] {          Settings::values.use_speed_limit.SetValue(!Settings::values.use_speed_limit.GetValue());      }); +    connect_shortcut(QStringLiteral("Toggle Renderdoc Capture"), [this] { +        if (Settings::values.enable_renderdoc_hotkey) { +            system->GetRenderdocAPI().ToggleCapture(); +        } +    });      connect_shortcut(QStringLiteral("Toggle Mouse Panning"), [&] {          if (Settings::values.mouse_enabled) {              Settings::values.mouse_panning = false; | 
