diff options
Diffstat (limited to 'src/yuzu')
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 10 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.h | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_filesystem.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics_advanced.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics_advanced.ui | 7 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_hotkeys.cpp | 80 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_hotkeys.h | 6 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_hotkeys.ui | 39 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_player.cpp | 60 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_player.h | 6 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_player.ui | 16 | ||||
| -rw-r--r-- | src/yuzu/game_list_p.h | 14 | ||||
| -rw-r--r-- | src/yuzu/main.cpp | 4 | 
13 files changed, 191 insertions, 57 deletions
| diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index 196a3a116..a44eed047 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -12,7 +12,6 @@  #include "input_common/main.h"  #include "input_common/udp/client.h"  #include "yuzu/configuration/config.h" -#include "yuzu/uisettings.h"  Config::Config() {      // TODO: Don't hardcode the path; let the frontend decide where to put the config files. @@ -212,12 +211,13 @@ const std::array<int, Settings::NativeKeyboard::NumKeyboardMods> Config::default  // This must be in alphabetical order according to action name as it must have the same order as  // UISetting::values.shortcuts, which is alphabetically ordered.  // clang-format off -const std::array<UISettings::Shortcut, 15> default_hotkeys{{ +const std::array<UISettings::Shortcut, 15> Config::default_hotkeys{{      {QStringLiteral("Capture Screenshot"),       QStringLiteral("Main Window"), {QStringLiteral("Ctrl+P"), Qt::ApplicationShortcut}}, +    {QStringLiteral("Change Docked Mode"),       QStringLiteral("Main Window"), {QStringLiteral("F10"), Qt::ApplicationShortcut}},      {QStringLiteral("Continue/Pause Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F4"), Qt::WindowShortcut}},      {QStringLiteral("Decrease Speed Limit"),     QStringLiteral("Main Window"), {QStringLiteral("-"), Qt::ApplicationShortcut}}, -    {QStringLiteral("Exit yuzu"),                QStringLiteral("Main Window"), {QStringLiteral("Ctrl+Q"), Qt::WindowShortcut}},      {QStringLiteral("Exit Fullscreen"),          QStringLiteral("Main Window"), {QStringLiteral("Esc"), Qt::WindowShortcut}}, +    {QStringLiteral("Exit yuzu"),                QStringLiteral("Main Window"), {QStringLiteral("Ctrl+Q"), Qt::WindowShortcut}},      {QStringLiteral("Fullscreen"),               QStringLiteral("Main Window"), {QStringLiteral("F11"), Qt::WindowShortcut}},      {QStringLiteral("Increase Speed Limit"),     QStringLiteral("Main Window"), {QStringLiteral("+"), Qt::ApplicationShortcut}},      {QStringLiteral("Load Amiibo"),              QStringLiteral("Main Window"), {QStringLiteral("F2"), Qt::ApplicationShortcut}}, @@ -227,7 +227,6 @@ const std::array<UISettings::Shortcut, 15> default_hotkeys{{      {QStringLiteral("Toggle Filter Bar"),        QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F"), Qt::WindowShortcut}},      {QStringLiteral("Toggle Speed Limit"),       QStringLiteral("Main Window"), {QStringLiteral("Ctrl+Z"), Qt::ApplicationShortcut}},      {QStringLiteral("Toggle Status Bar"),        QStringLiteral("Main Window"), {QStringLiteral("Ctrl+S"), Qt::WindowShortcut}}, -    {QStringLiteral("Change Docked Mode"),       QStringLiteral("Main Window"), {QStringLiteral("F10"), Qt::ApplicationShortcut}},  }};  // clang-format on @@ -644,6 +643,8 @@ void Config::ReadRendererValues() {      Settings::values.use_asynchronous_gpu_emulation =          ReadSetting(QStringLiteral("use_asynchronous_gpu_emulation"), false).toBool();      Settings::values.use_vsync = ReadSetting(QStringLiteral("use_vsync"), true).toBool(); +    Settings::values.use_fast_gpu_time = +        ReadSetting(QStringLiteral("use_fast_gpu_time"), true).toBool();      Settings::values.force_30fps_mode =          ReadSetting(QStringLiteral("force_30fps_mode"), false).toBool(); @@ -1085,6 +1086,7 @@ void Config::SaveRendererValues() {      WriteSetting(QStringLiteral("use_asynchronous_gpu_emulation"),                   Settings::values.use_asynchronous_gpu_emulation, false);      WriteSetting(QStringLiteral("use_vsync"), Settings::values.use_vsync, true); +    WriteSetting(QStringLiteral("use_fast_gpu_time"), Settings::values.use_fast_gpu_time, true);      WriteSetting(QStringLiteral("force_30fps_mode"), Settings::values.force_30fps_mode, false);      // Cast to double because Qt's written float values are not human-readable diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h index ba6888004..5cd2a5feb 100644 --- a/src/yuzu/configuration/config.h +++ b/src/yuzu/configuration/config.h @@ -9,6 +9,7 @@  #include <string>  #include <QVariant>  #include "core/settings.h" +#include "yuzu/uisettings.h"  class QSettings; @@ -26,6 +27,7 @@ public:          default_mouse_buttons;      static const std::array<int, Settings::NativeKeyboard::NumKeyboardKeys> default_keyboard_keys;      static const std::array<int, Settings::NativeKeyboard::NumKeyboardMods> default_keyboard_mods; +    static const std::array<UISettings::Shortcut, 15> default_hotkeys;  private:      void ReadValues(); diff --git a/src/yuzu/configuration/configure_filesystem.cpp b/src/yuzu/configuration/configure_filesystem.cpp index 29f540eb7..835ee821c 100644 --- a/src/yuzu/configuration/configure_filesystem.cpp +++ b/src/yuzu/configuration/configure_filesystem.cpp @@ -138,7 +138,7 @@ void ConfigureFilesystem::SetDirectory(DirectoryTarget target, QLineEdit* edit)          str = QFileDialog::getOpenFileName(this, caption, QFileInfo(edit->text()).dir().path(),                                             QStringLiteral("NX Gamecard;*.xci"));      } else { -        str = QFileDialog::getExistingDirectory(this, caption, edit->text()); +        str = QFileDialog::getExistingDirectory(this, caption, edit->text()) + QDir::separator();      }      if (str.isEmpty()) diff --git a/src/yuzu/configuration/configure_graphics_advanced.cpp b/src/yuzu/configuration/configure_graphics_advanced.cpp index 0a3f47339..5bb2ae555 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.cpp +++ b/src/yuzu/configuration/configure_graphics_advanced.cpp @@ -22,6 +22,7 @@ void ConfigureGraphicsAdvanced::SetConfiguration() {      ui->gpu_accuracy->setCurrentIndex(static_cast<int>(Settings::values.gpu_accuracy));      ui->use_vsync->setEnabled(runtime_lock);      ui->use_vsync->setChecked(Settings::values.use_vsync); +    ui->use_fast_gpu_time->setChecked(Settings::values.use_fast_gpu_time);      ui->force_30fps_mode->setEnabled(runtime_lock);      ui->force_30fps_mode->setChecked(Settings::values.force_30fps_mode);      ui->anisotropic_filtering_combobox->setEnabled(runtime_lock); @@ -32,6 +33,7 @@ void ConfigureGraphicsAdvanced::ApplyConfiguration() {      auto gpu_accuracy = static_cast<Settings::GPUAccuracy>(ui->gpu_accuracy->currentIndex());      Settings::values.gpu_accuracy = gpu_accuracy;      Settings::values.use_vsync = ui->use_vsync->isChecked(); +    Settings::values.use_fast_gpu_time = ui->use_fast_gpu_time->isChecked();      Settings::values.force_30fps_mode = ui->force_30fps_mode->isChecked();      Settings::values.max_anisotropy = ui->anisotropic_filtering_combobox->currentIndex();  } diff --git a/src/yuzu/configuration/configure_graphics_advanced.ui b/src/yuzu/configuration/configure_graphics_advanced.ui index 0c7b383e0..770b80c50 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.ui +++ b/src/yuzu/configuration/configure_graphics_advanced.ui @@ -70,6 +70,13 @@           </widget>          </item>          <item> +         <widget class="QCheckBox" name="use_fast_gpu_time"> +          <property name="text"> +           <string>Use Fast GPU Time</string> +          </property> +         </widget> +        </item> +        <item>           <layout class="QHBoxLayout" name="horizontalLayout_1">            <item>             <widget class="QLabel" name="af_label"> diff --git a/src/yuzu/configuration/configure_hotkeys.cpp b/src/yuzu/configuration/configure_hotkeys.cpp index fa9052136..6f7fd4414 100644 --- a/src/yuzu/configuration/configure_hotkeys.cpp +++ b/src/yuzu/configuration/configure_hotkeys.cpp @@ -2,10 +2,12 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. +#include <QMenu>  #include <QMessageBox>  #include <QStandardItemModel>  #include "core/settings.h"  #include "ui_configure_hotkeys.h" +#include "yuzu/configuration/config.h"  #include "yuzu/configuration/configure_hotkeys.h"  #include "yuzu/hotkeys.h"  #include "yuzu/util/sequence_dialog/sequence_dialog.h" @@ -19,6 +21,9 @@ ConfigureHotkeys::ConfigureHotkeys(QWidget* parent)      model->setColumnCount(3);      connect(ui->hotkey_list, &QTreeView::doubleClicked, this, &ConfigureHotkeys::Configure); +    connect(ui->hotkey_list, &QTreeView::customContextMenuRequested, this, +            &ConfigureHotkeys::PopupContextMenu); +    ui->hotkey_list->setContextMenuPolicy(Qt::CustomContextMenu);      ui->hotkey_list->setModel(model);      // TODO(Kloen): Make context configurable as well (hiding the column for now) @@ -27,6 +32,10 @@ ConfigureHotkeys::ConfigureHotkeys(QWidget* parent)      ui->hotkey_list->setColumnWidth(0, 200);      ui->hotkey_list->resizeColumnToContents(1); +    connect(ui->button_restore_defaults, &QPushButton::clicked, this, +            &ConfigureHotkeys::RestoreDefaults); +    connect(ui->button_clear_all, &QPushButton::clicked, this, &ConfigureHotkeys::ClearAll); +      RetranslateUI();  } @@ -71,7 +80,6 @@ void ConfigureHotkeys::Configure(QModelIndex index) {      }      index = index.sibling(index.row(), 1); -    auto* const model = ui->hotkey_list->model();      const auto previous_key = model->data(index);      SequenceDialog hotkey_dialog{this}; @@ -81,31 +89,33 @@ void ConfigureHotkeys::Configure(QModelIndex index) {      if (return_code == QDialog::Rejected || key_sequence.isEmpty()) {          return;      } +    const auto [key_sequence_used, used_action] = IsUsedKey(key_sequence); -    if (IsUsedKey(key_sequence) && key_sequence != QKeySequence(previous_key.toString())) { -        QMessageBox::warning(this, tr("Conflicting Key Sequence"), -                             tr("The entered key sequence is already assigned to another hotkey.")); +    if (key_sequence_used && key_sequence != QKeySequence(previous_key.toString())) { +        QMessageBox::warning( +            this, tr("Conflicting Key Sequence"), +            tr("The entered key sequence is already assigned to: %1").arg(used_action));      } else {          model->setData(index, key_sequence.toString(QKeySequence::NativeText));      }  } -bool ConfigureHotkeys::IsUsedKey(QKeySequence key_sequence) const { -    for (int r = 0; r < model->rowCount(); r++) { +std::pair<bool, QString> ConfigureHotkeys::IsUsedKey(QKeySequence key_sequence) const { +    for (int r = 0; r < model->rowCount(); ++r) {          const QStandardItem* const parent = model->item(r, 0); -        for (int r2 = 0; r2 < parent->rowCount(); r2++) { +        for (int r2 = 0; r2 < parent->rowCount(); ++r2) {              const QStandardItem* const key_seq_item = parent->child(r2, 1);              const auto key_seq_str = key_seq_item->text();              const auto key_seq = QKeySequence::fromString(key_seq_str, QKeySequence::NativeText);              if (key_sequence == key_seq) { -                return true; +                return std::make_pair(true, parent->child(r2, 0)->text());              }          }      } -    return false; +    return std::make_pair(false, QString());  }  void ConfigureHotkeys::ApplyConfiguration(HotkeyRegistry& registry) { @@ -128,3 +138,55 @@ void ConfigureHotkeys::ApplyConfiguration(HotkeyRegistry& registry) {      registry.SaveHotkeys();  } + +void ConfigureHotkeys::RestoreDefaults() { +    for (int r = 0; r < model->rowCount(); ++r) { +        const QStandardItem* parent = model->item(r, 0); + +        for (int r2 = 0; r2 < parent->rowCount(); ++r2) { +            model->item(r, 0)->child(r2, 1)->setText(Config::default_hotkeys[r2].shortcut.first); +        } +    } +} + +void ConfigureHotkeys::ClearAll() { +    for (int r = 0; r < model->rowCount(); ++r) { +        const QStandardItem* parent = model->item(r, 0); + +        for (int r2 = 0; r2 < parent->rowCount(); ++r2) { +            model->item(r, 0)->child(r2, 1)->setText(tr("")); +        } +    } +} + +void ConfigureHotkeys::PopupContextMenu(const QPoint& menu_location) { +    QModelIndex index = ui->hotkey_list->indexAt(menu_location); +    if (!index.parent().isValid()) { +        return; +    } + +    const auto selected = index.sibling(index.row(), 1); +    QMenu context_menu; + +    QAction* restore_default = context_menu.addAction(tr("Restore Default")); +    QAction* clear = context_menu.addAction(tr("Clear")); + +    connect(restore_default, &QAction::triggered, [this, selected] { +        const QKeySequence& default_key_sequence = QKeySequence::fromString( +            Config::default_hotkeys[selected.row()].shortcut.first, QKeySequence::NativeText); +        const auto [key_sequence_used, used_action] = IsUsedKey(default_key_sequence); + +        if (key_sequence_used && +            default_key_sequence != QKeySequence(model->data(selected).toString())) { + +            QMessageBox::warning( +                this, tr("Conflicting Key Sequence"), +                tr("The default key sequence is already assigned to: %1").arg(used_action)); +        } else { +            model->setData(selected, default_key_sequence.toString(QKeySequence::NativeText)); +        } +    }); +    connect(clear, &QAction::triggered, [this, selected] { model->setData(selected, tr("")); }); + +    context_menu.exec(ui->hotkey_list->viewport()->mapToGlobal(menu_location)); +} diff --git a/src/yuzu/configuration/configure_hotkeys.h b/src/yuzu/configuration/configure_hotkeys.h index 8f8c6173b..a2ec3323e 100644 --- a/src/yuzu/configuration/configure_hotkeys.h +++ b/src/yuzu/configuration/configure_hotkeys.h @@ -35,7 +35,11 @@ private:      void RetranslateUI();      void Configure(QModelIndex index); -    bool IsUsedKey(QKeySequence key_sequence) const; +    std::pair<bool, QString> IsUsedKey(QKeySequence key_sequence) const; + +    void RestoreDefaults(); +    void ClearAll(); +    void PopupContextMenu(const QPoint& menu_location);      std::unique_ptr<Ui::ConfigureHotkeys> ui; diff --git a/src/yuzu/configuration/configure_hotkeys.ui b/src/yuzu/configuration/configure_hotkeys.ui index 0d0b70f38..6d9f861e3 100644 --- a/src/yuzu/configuration/configure_hotkeys.ui +++ b/src/yuzu/configuration/configure_hotkeys.ui @@ -6,8 +6,8 @@     <rect>      <x>0</x>      <y>0</y> -    <width>363</width> -    <height>388</height> +    <width>439</width> +    <height>510</height>     </rect>    </property>    <property name="windowTitle"> @@ -15,7 +15,7 @@    </property>    <layout class="QVBoxLayout" name="verticalLayout">     <item> -    <layout class="QVBoxLayout" name="verticalLayout_2"> +    <layout class="QHBoxLayout" name="horizontalLayout">       <item>        <widget class="QLabel" name="label_2">         <property name="text"> @@ -24,6 +24,37 @@        </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> +     <item> +      <widget class="QPushButton" name="button_clear_all"> +       <property name="text"> +        <string>Clear All</string> +       </property> +      </widget> +     </item> +     <item> +      <widget class="QPushButton" name="button_restore_defaults"> +       <property name="text"> +        <string>Restore Defaults</string> +       </property> +      </widget> +     </item> +    </layout> +   </item> +   <item> +    <layout class="QVBoxLayout" name="verticalLayout_2"> +     <item>        <widget class="QTreeView" name="hotkey_list">         <property name="editTriggers">          <set>QAbstractItemView::NoEditTriggers</set> @@ -39,4 +70,4 @@   </widget>   <resources/>   <connections/> -</ui>
\ No newline at end of file +</ui> diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index 15ac30f12..e4eb5594b 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -56,7 +56,6 @@ static void SetAnalogButton(const Common::ParamPackage& input_param,      if (analog_param.Get("engine", "") != "analog_from_button") {          analog_param = {              {"engine", "analog_from_button"}, -            {"modifier_scale", "0.5"},          };      }      analog_param.Set(button_name, input_param.Serialize()); @@ -236,8 +235,10 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i          widget->setVisible(false);      analog_map_stick = {ui->buttonLStickAnalog, ui->buttonRStickAnalog}; -    analog_map_deadzone = {ui->sliderLStickDeadzone, ui->sliderRStickDeadzone}; -    analog_map_deadzone_label = {ui->labelLStickDeadzone, ui->labelRStickDeadzone}; +    analog_map_deadzone_and_modifier_slider = {ui->sliderLStickDeadzoneAndModifier, +                                               ui->sliderRStickDeadzoneAndModifier}; +    analog_map_deadzone_and_modifier_slider_label = {ui->labelLStickDeadzoneAndModifier, +                                                     ui->labelRStickDeadzoneAndModifier};      for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; button_id++) {          auto* const button = button_map[button_id]; @@ -328,10 +329,18 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i                      InputCommon::Polling::DeviceType::Analog);              }          }); -        connect(analog_map_deadzone[analog_id], &QSlider::valueChanged, [=] { -            const float deadzone = analog_map_deadzone[analog_id]->value() / 100.0f; -            analog_map_deadzone_label[analog_id]->setText(tr("Deadzone: %1").arg(deadzone)); -            analogs_param[analog_id].Set("deadzone", deadzone); + +        connect(analog_map_deadzone_and_modifier_slider[analog_id], &QSlider::valueChanged, [=] { +            const float slider_value = analog_map_deadzone_and_modifier_slider[analog_id]->value(); +            if (analogs_param[analog_id].Get("engine", "") == "sdl") { +                analog_map_deadzone_and_modifier_slider_label[analog_id]->setText( +                    tr("Deadzone: %1%").arg(slider_value)); +                analogs_param[analog_id].Set("deadzone", slider_value / 100.0f); +            } else { +                analog_map_deadzone_and_modifier_slider_label[analog_id]->setText( +                    tr("Modifier Scale: %1%").arg(slider_value)); +                analogs_param[analog_id].Set("modifier_scale", slider_value / 100.0f); +            }          });      } @@ -517,20 +526,31 @@ void ConfigureInputPlayer::UpdateButtonLabels() {          analog_map_stick[analog_id]->setText(tr("Set Analog Stick"));          auto& param = analogs_param[analog_id]; -        auto* const analog_deadzone_slider = analog_map_deadzone[analog_id]; -        auto* const analog_deadzone_label = analog_map_deadzone_label[analog_id]; - -        if (param.Has("engine") && param.Get("engine", "") == "sdl") { -            if (!param.Has("deadzone")) { -                param.Set("deadzone", 0.1f); +        auto* const analog_stick_slider = analog_map_deadzone_and_modifier_slider[analog_id]; +        auto* const analog_stick_slider_label = +            analog_map_deadzone_and_modifier_slider_label[analog_id]; + +        if (param.Has("engine")) { +            if (param.Get("engine", "") == "sdl") { +                if (!param.Has("deadzone")) { +                    param.Set("deadzone", 0.1f); +                } + +                analog_stick_slider->setValue(static_cast<int>(param.Get("deadzone", 0.1f) * 100)); +                if (analog_stick_slider->value() == 0) { +                    analog_stick_slider_label->setText(tr("Deadzone: 0%")); +                } +            } else { +                if (!param.Has("modifier_scale")) { +                    param.Set("modifier_scale", 0.5f); +                } + +                analog_stick_slider->setValue( +                    static_cast<int>(param.Get("modifier_scale", 0.5f) * 100)); +                if (analog_stick_slider->value() == 0) { +                    analog_stick_slider_label->setText(tr("Modifier Scale: 0%")); +                }              } - -            analog_deadzone_slider->setValue(static_cast<int>(param.Get("deadzone", 0.1f) * 100)); -            analog_deadzone_slider->setVisible(true); -            analog_deadzone_label->setVisible(true); -        } else { -            analog_deadzone_slider->setVisible(false); -            analog_deadzone_label->setVisible(false);          }      }  } diff --git a/src/yuzu/configuration/configure_input_player.h b/src/yuzu/configuration/configure_input_player.h index 045704e47..95afa5375 100644 --- a/src/yuzu/configuration/configure_input_player.h +++ b/src/yuzu/configuration/configure_input_player.h @@ -97,8 +97,10 @@ private:      /// Analog inputs are also represented each with a single button, used to configure with an      /// actual analog stick      std::array<QPushButton*, Settings::NativeAnalog::NumAnalogs> analog_map_stick; -    std::array<QSlider*, Settings::NativeAnalog::NumAnalogs> analog_map_deadzone; -    std::array<QLabel*, Settings::NativeAnalog::NumAnalogs> analog_map_deadzone_label; +    std::array<QSlider*, Settings::NativeAnalog::NumAnalogs> +        analog_map_deadzone_and_modifier_slider; +    std::array<QLabel*, Settings::NativeAnalog::NumAnalogs> +        analog_map_deadzone_and_modifier_slider_label;      static const std::array<std::string, ANALOG_SUB_BUTTONS_NUM> analog_sub_buttons; diff --git a/src/yuzu/configuration/configure_input_player.ui b/src/yuzu/configuration/configure_input_player.ui index 4b37746a1..f27a77180 100644 --- a/src/yuzu/configuration/configure_input_player.ui +++ b/src/yuzu/configuration/configure_input_player.ui @@ -171,11 +171,11 @@           </layout>          </item>          <item row="4" column="0" colspan="2"> -         <layout class="QVBoxLayout" name="sliderRStickDeadzoneVerticalLayout"> +         <layout class="QVBoxLayout" name="sliderRStickDeadzoneAndModifierVerticalLayout">            <item> -           <layout class="QHBoxLayout" name="sliderRStickDeadzoneHorizontalLayout"> +           <layout class="QHBoxLayout" name="sliderRStickDeadzoneAndModifierHorizontalLayout">              <item> -             <widget class="QLabel" name="labelRStickDeadzone"> +             <widget class="QLabel" name="labelRStickDeadzoneAndModifier">                <property name="text">                 <string>Deadzone: 0</string>                </property> @@ -187,7 +187,7 @@             </layout>            </item>            <item> -           <widget class="QSlider" name="sliderRStickDeadzone"> +           <widget class="QSlider" name="sliderRStickDeadzoneAndModifier">              <property name="orientation">               <enum>Qt::Horizontal</enum>              </property> @@ -784,14 +784,14 @@           </layout>          </item>          <item row="5" column="1" colspan="2"> -         <layout class="QVBoxLayout" name="sliderLStickDeadzoneVerticalLayout"> +         <layout class="QVBoxLayout" name="sliderLStickDeadzoneAndModifierVerticalLayout">            <property name="sizeConstraint">             <enum>QLayout::SetDefaultConstraint</enum>            </property>            <item> -           <layout class="QHBoxLayout" name="sliderLStickDeadzoneHorizontalLayout"> +           <layout class="QHBoxLayout" name="sliderLStickDeadzoneAndModifierHorizontalLayout">              <item> -             <widget class="QLabel" name="labelLStickDeadzone"> +             <widget class="QLabel" name="labelLStickDeadzoneAndModifier">                <property name="text">                 <string>Deadzone: 0</string>                </property> @@ -803,7 +803,7 @@             </layout>            </item>            <item> -           <widget class="QSlider" name="sliderLStickDeadzone"> +           <widget class="QSlider" name="sliderLStickDeadzoneAndModifier">              <property name="orientation">               <enum>Qt::Horizontal</enum>              </property> diff --git a/src/yuzu/game_list_p.h b/src/yuzu/game_list_p.h index 3e6d5a7cd..0cd0054c8 100644 --- a/src/yuzu/game_list_p.h +++ b/src/yuzu/game_list_p.h @@ -126,13 +126,6 @@ public:          return GameListItem::data(role);      } - -    /** -     * Override to prevent automatic sorting. -     */ -    bool operator<(const QStandardItem& other) const override { -        return false; -    }  };  class GameListItemCompat : public GameListItem { @@ -279,6 +272,13 @@ public:          return static_cast<int>(dir_type);      } +    /** +     * Override to prevent automatic sorting between folders and the addDir button. +     */ +    bool operator<(const QStandardItem& other) const override { +        return false; +    } +  private:      GameListItemType dir_type;  }; diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 05baec7e1..b44b4276c 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -1304,7 +1304,9 @@ void GMainWindow::OnGameListDumpRomFS(u64 program_id, const std::string& game_pa      FileSys::VirtualFile romfs;      if (*romfs_title_id == program_id) { -        romfs = file; +        const u64 ivfc_offset = loader->ReadRomFSIVFCOffset(); +        FileSys::PatchManager pm{program_id}; +        romfs = pm.PatchRomFS(file, ivfc_offset, FileSys::ContentRecordType::Program);      } else {          romfs = installed.GetEntry(*romfs_title_id, FileSys::ContentRecordType::Data)->GetRomFS();      } | 
