diff options
Diffstat (limited to 'src/yuzu/configuration')
-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_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 |
10 files changed, 180 insertions, 48 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_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> |