Browse Source
configure_input: Add per-player vibration
configure_input: Add per-player vibration
Allows for enabling and modifying vibration and vibration strength per player. Also adds a toggle for enabling/disabling accurate vibrations. Co-authored-by: Its-Rei <kupfel@gmail.com>nce_cpp
18 changed files with 751 additions and 30 deletions
-
11dist/qt_themes/qdarkstyle/style.qss
-
12dist/qt_themes/qdarkstyle_midnight_blue/style.qss
-
13src/core/hle/service/hid/controllers/npad.cpp
-
1src/core/settings.h
-
3src/input_common/settings.h
-
3src/yuzu/CMakeLists.txt
-
16src/yuzu/applets/controller.cpp
-
3src/yuzu/applets/controller.h
-
18src/yuzu/applets/controller.ui
-
16src/yuzu/configuration/config.cpp
-
4src/yuzu/configuration/configure_input.cpp
-
22src/yuzu/configuration/configure_input.ui
-
66src/yuzu/configuration/configure_vibration.cpp
-
40src/yuzu/configuration/configure_vibration.h
-
546src/yuzu/configuration/configure_vibration.ui
-
2src/yuzu_cmd/config.cpp
-
4src/yuzu_cmd/default_ini.h
-
1src/yuzu_tester/config.cpp
@ -0,0 +1,66 @@ |
|||
// Copyright 2020 yuzu Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "core/settings.h"
|
|||
#include "ui_configure_vibration.h"
|
|||
#include "yuzu/configuration/configure_vibration.h"
|
|||
|
|||
ConfigureVibration::ConfigureVibration(QWidget* parent) |
|||
: QDialog(parent), ui(std::make_unique<Ui::ConfigureVibration>()) { |
|||
ui->setupUi(this); |
|||
|
|||
vibration_groupboxes = { |
|||
ui->vibrationGroupPlayer1, ui->vibrationGroupPlayer2, ui->vibrationGroupPlayer3, |
|||
ui->vibrationGroupPlayer4, ui->vibrationGroupPlayer5, ui->vibrationGroupPlayer6, |
|||
ui->vibrationGroupPlayer7, ui->vibrationGroupPlayer8, |
|||
}; |
|||
|
|||
vibration_spinboxes = { |
|||
ui->vibrationSpinPlayer1, ui->vibrationSpinPlayer2, ui->vibrationSpinPlayer3, |
|||
ui->vibrationSpinPlayer4, ui->vibrationSpinPlayer5, ui->vibrationSpinPlayer6, |
|||
ui->vibrationSpinPlayer7, ui->vibrationSpinPlayer8, |
|||
}; |
|||
|
|||
const auto& players = Settings::values.players.GetValue(); |
|||
|
|||
for (std::size_t i = 0; i < NUM_PLAYERS; ++i) { |
|||
vibration_groupboxes[i]->setChecked(players[i].vibration_enabled); |
|||
vibration_spinboxes[i]->setValue(players[i].vibration_strength); |
|||
} |
|||
|
|||
ui->checkBoxAccurateVibration->setChecked( |
|||
Settings::values.enable_accurate_vibrations.GetValue()); |
|||
|
|||
if (!Settings::IsConfiguringGlobal()) { |
|||
ui->checkBoxAccurateVibration->setDisabled(true); |
|||
} |
|||
|
|||
RetranslateUI(); |
|||
} |
|||
|
|||
ConfigureVibration::~ConfigureVibration() = default; |
|||
|
|||
void ConfigureVibration::ApplyConfiguration() { |
|||
auto& players = Settings::values.players.GetValue(); |
|||
|
|||
for (std::size_t i = 0; i < NUM_PLAYERS; ++i) { |
|||
players[i].vibration_enabled = vibration_groupboxes[i]->isChecked(); |
|||
players[i].vibration_strength = vibration_spinboxes[i]->value(); |
|||
} |
|||
|
|||
Settings::values.enable_accurate_vibrations.SetValue( |
|||
ui->checkBoxAccurateVibration->isChecked()); |
|||
} |
|||
|
|||
void ConfigureVibration::changeEvent(QEvent* event) { |
|||
if (event->type() == QEvent::LanguageChange) { |
|||
RetranslateUI(); |
|||
} |
|||
|
|||
QDialog::changeEvent(event); |
|||
} |
|||
|
|||
void ConfigureVibration::RetranslateUI() { |
|||
ui->retranslateUi(this); |
|||
} |
|||
@ -0,0 +1,40 @@ |
|||
// Copyright 2020 yuzu Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include <array> |
|||
#include <memory> |
|||
#include <QDialog> |
|||
|
|||
class QGroupBox; |
|||
class QSpinBox; |
|||
|
|||
namespace Ui { |
|||
class ConfigureVibration; |
|||
} |
|||
|
|||
class ConfigureVibration : public QDialog { |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
explicit ConfigureVibration(QWidget* parent); |
|||
~ConfigureVibration() override; |
|||
|
|||
void ApplyConfiguration(); |
|||
|
|||
private: |
|||
void changeEvent(QEvent* event) override; |
|||
void RetranslateUI(); |
|||
|
|||
std::unique_ptr<Ui::ConfigureVibration> ui; |
|||
|
|||
static constexpr std::size_t NUM_PLAYERS = 8; |
|||
|
|||
// Groupboxes encapsulating the vibration strength spinbox. |
|||
std::array<QGroupBox*, NUM_PLAYERS> vibration_groupboxes; |
|||
|
|||
// Spinboxes representing the vibration strength percentage. |
|||
std::array<QSpinBox*, NUM_PLAYERS> vibration_spinboxes; |
|||
}; |
|||
@ -0,0 +1,546 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<ui version="4.0"> |
|||
<class>ConfigureVibration</class> |
|||
<widget class="QDialog" name="ConfigureVibration"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>0</x> |
|||
<y>0</y> |
|||
<width>364</width> |
|||
<height>242</height> |
|||
</rect> |
|||
</property> |
|||
<property name="windowTitle"> |
|||
<string>Configure Vibration</string> |
|||
</property> |
|||
<property name="styleSheet"> |
|||
<string notr="true"/> |
|||
</property> |
|||
<layout class="QVBoxLayout"> |
|||
<item> |
|||
<widget class="QGroupBox" name="vibrationStrengthGroup"> |
|||
<property name="title"> |
|||
<string>Vibration</string> |
|||
</property> |
|||
<layout class="QVBoxLayout" name="verticalLayout_3" stretch="0,0"> |
|||
<property name="leftMargin"> |
|||
<number>9</number> |
|||
</property> |
|||
<property name="topMargin"> |
|||
<number>9</number> |
|||
</property> |
|||
<property name="rightMargin"> |
|||
<number>9</number> |
|||
</property> |
|||
<property name="bottomMargin"> |
|||
<number>9</number> |
|||
</property> |
|||
<item> |
|||
<widget class="QWidget" name="player14Widget" native="true"> |
|||
<layout class="QHBoxLayout" name="horizontalLayout_4"> |
|||
<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> |
|||
<widget class="QGroupBox" name="vibrationGroupPlayer1"> |
|||
<property name="title"> |
|||
<string>Player 1</string> |
|||
</property> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<layout class="QHBoxLayout" name="horizontalLayout_8"> |
|||
<property name="leftMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="topMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="rightMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="bottomMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<item> |
|||
<widget class="QSpinBox" name="vibrationSpinPlayer1"> |
|||
<property name="minimumSize"> |
|||
<size> |
|||
<width>68</width> |
|||
<height>21</height> |
|||
</size> |
|||
</property> |
|||
<property name="maximumSize"> |
|||
<size> |
|||
<width>68</width> |
|||
<height>16777215</height> |
|||
</size> |
|||
</property> |
|||
<property name="suffix"> |
|||
<string>%</string> |
|||
</property> |
|||
<property name="minimum"> |
|||
<number>1</number> |
|||
</property> |
|||
<property name="maximum"> |
|||
<number>150</number> |
|||
</property> |
|||
<property name="value"> |
|||
<number>100</number> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QGroupBox" name="vibrationGroupPlayer2"> |
|||
<property name="title"> |
|||
<string>Player 2</string> |
|||
</property> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<layout class="QHBoxLayout" name="horizontalLayout_9"> |
|||
<property name="leftMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="topMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="rightMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="bottomMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<item> |
|||
<widget class="QSpinBox" name="vibrationSpinPlayer2"> |
|||
<property name="minimumSize"> |
|||
<size> |
|||
<width>68</width> |
|||
<height>21</height> |
|||
</size> |
|||
</property> |
|||
<property name="maximumSize"> |
|||
<size> |
|||
<width>68</width> |
|||
<height>16777215</height> |
|||
</size> |
|||
</property> |
|||
<property name="suffix"> |
|||
<string>%</string> |
|||
</property> |
|||
<property name="minimum"> |
|||
<number>1</number> |
|||
</property> |
|||
<property name="maximum"> |
|||
<number>150</number> |
|||
</property> |
|||
<property name="value"> |
|||
<number>100</number> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QGroupBox" name="vibrationGroupPlayer3"> |
|||
<property name="title"> |
|||
<string>Player 3</string> |
|||
</property> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<layout class="QHBoxLayout" name="horizontalLayout_10"> |
|||
<property name="leftMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="topMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="rightMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="bottomMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<item> |
|||
<widget class="QSpinBox" name="vibrationSpinPlayer3"> |
|||
<property name="minimumSize"> |
|||
<size> |
|||
<width>68</width> |
|||
<height>21</height> |
|||
</size> |
|||
</property> |
|||
<property name="maximumSize"> |
|||
<size> |
|||
<width>68</width> |
|||
<height>16777215</height> |
|||
</size> |
|||
</property> |
|||
<property name="suffix"> |
|||
<string>%</string> |
|||
</property> |
|||
<property name="minimum"> |
|||
<number>1</number> |
|||
</property> |
|||
<property name="maximum"> |
|||
<number>150</number> |
|||
</property> |
|||
<property name="value"> |
|||
<number>100</number> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QGroupBox" name="vibrationGroupPlayer4"> |
|||
<property name="title"> |
|||
<string>Player 4</string> |
|||
</property> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<layout class="QHBoxLayout" name="horizontalLayout_11"> |
|||
<property name="leftMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="topMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="rightMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="bottomMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<item> |
|||
<widget class="QSpinBox" name="vibrationSpinPlayer4"> |
|||
<property name="minimumSize"> |
|||
<size> |
|||
<width>68</width> |
|||
<height>21</height> |
|||
</size> |
|||
</property> |
|||
<property name="maximumSize"> |
|||
<size> |
|||
<width>68</width> |
|||
<height>16777215</height> |
|||
</size> |
|||
</property> |
|||
<property name="suffix"> |
|||
<string>%</string> |
|||
</property> |
|||
<property name="minimum"> |
|||
<number>1</number> |
|||
</property> |
|||
<property name="maximum"> |
|||
<number>150</number> |
|||
</property> |
|||
<property name="value"> |
|||
<number>100</number> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QWidget" name="player58Widget" native="true"> |
|||
<layout class="QHBoxLayout" name="horizontalLayout_6"> |
|||
<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> |
|||
<widget class="QGroupBox" name="vibrationGroupPlayer7"> |
|||
<property name="title"> |
|||
<string>Player 5</string> |
|||
</property> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<layout class="QHBoxLayout" name="horizontalLayout_14"> |
|||
<property name="leftMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="topMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="rightMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="bottomMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<item> |
|||
<widget class="QSpinBox" name="vibrationSpinPlayer7"> |
|||
<property name="minimumSize"> |
|||
<size> |
|||
<width>68</width> |
|||
<height>21</height> |
|||
</size> |
|||
</property> |
|||
<property name="maximumSize"> |
|||
<size> |
|||
<width>68</width> |
|||
<height>16777215</height> |
|||
</size> |
|||
</property> |
|||
<property name="suffix"> |
|||
<string>%</string> |
|||
</property> |
|||
<property name="minimum"> |
|||
<number>1</number> |
|||
</property> |
|||
<property name="maximum"> |
|||
<number>150</number> |
|||
</property> |
|||
<property name="value"> |
|||
<number>100</number> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QGroupBox" name="vibrationGroupPlayer8"> |
|||
<property name="title"> |
|||
<string>Player 6</string> |
|||
</property> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<layout class="QHBoxLayout" name="horizontalLayout_15"> |
|||
<property name="leftMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="topMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="rightMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="bottomMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<item> |
|||
<widget class="QSpinBox" name="vibrationSpinPlayer8"> |
|||
<property name="minimumSize"> |
|||
<size> |
|||
<width>68</width> |
|||
<height>21</height> |
|||
</size> |
|||
</property> |
|||
<property name="maximumSize"> |
|||
<size> |
|||
<width>68</width> |
|||
<height>16777215</height> |
|||
</size> |
|||
</property> |
|||
<property name="suffix"> |
|||
<string>%</string> |
|||
</property> |
|||
<property name="minimum"> |
|||
<number>1</number> |
|||
</property> |
|||
<property name="maximum"> |
|||
<number>150</number> |
|||
</property> |
|||
<property name="value"> |
|||
<number>100</number> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QGroupBox" name="vibrationGroupPlayer5"> |
|||
<property name="title"> |
|||
<string>Player 7</string> |
|||
</property> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<layout class="QHBoxLayout" name="horizontalLayout_12"> |
|||
<property name="leftMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="topMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="rightMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="bottomMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<item> |
|||
<widget class="QSpinBox" name="vibrationSpinPlayer5"> |
|||
<property name="minimumSize"> |
|||
<size> |
|||
<width>68</width> |
|||
<height>21</height> |
|||
</size> |
|||
</property> |
|||
<property name="maximumSize"> |
|||
<size> |
|||
<width>68</width> |
|||
<height>16777215</height> |
|||
</size> |
|||
</property> |
|||
<property name="suffix"> |
|||
<string>%</string> |
|||
</property> |
|||
<property name="minimum"> |
|||
<number>1</number> |
|||
</property> |
|||
<property name="maximum"> |
|||
<number>150</number> |
|||
</property> |
|||
<property name="value"> |
|||
<number>100</number> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QGroupBox" name="vibrationGroupPlayer6"> |
|||
<property name="title"> |
|||
<string>Player 8</string> |
|||
</property> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<layout class="QHBoxLayout" name="horizontalLayout_13"> |
|||
<property name="leftMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="topMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="rightMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<property name="bottomMargin"> |
|||
<number>3</number> |
|||
</property> |
|||
<item> |
|||
<widget class="QSpinBox" name="vibrationSpinPlayer6"> |
|||
<property name="minimumSize"> |
|||
<size> |
|||
<width>68</width> |
|||
<height>21</height> |
|||
</size> |
|||
</property> |
|||
<property name="maximumSize"> |
|||
<size> |
|||
<width>68</width> |
|||
<height>16777215</height> |
|||
</size> |
|||
</property> |
|||
<property name="suffix"> |
|||
<string>%</string> |
|||
</property> |
|||
<property name="minimum"> |
|||
<number>1</number> |
|||
</property> |
|||
<property name="maximum"> |
|||
<number>150</number> |
|||
</property> |
|||
<property name="value"> |
|||
<number>100</number> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QGroupBox" name="vibrationSettingsGroup"> |
|||
<property name="title"> |
|||
<string>Settings</string> |
|||
</property> |
|||
<layout class="QVBoxLayout" name="verticalLayout"> |
|||
<item> |
|||
<widget class="QCheckBox" name="checkBoxAccurateVibration"> |
|||
<property name="text"> |
|||
<string>Enable Accurate Vibration</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<spacer name="spacerVibration"> |
|||
<property name="orientation"> |
|||
<enum>Qt::Vertical</enum> |
|||
</property> |
|||
<property name="sizeHint" stdset="0"> |
|||
<size> |
|||
<width>167</width> |
|||
<height>55</height> |
|||
</size> |
|||
</property> |
|||
</spacer> |
|||
</item> |
|||
<item> |
|||
<widget class="QDialogButtonBox" name="buttonBoxVibration"> |
|||
<property name="standardButtons"> |
|||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
<resources/> |
|||
<connections> |
|||
<connection> |
|||
<sender>buttonBoxVibration</sender> |
|||
<signal>accepted()</signal> |
|||
<receiver>ConfigureVibration</receiver> |
|||
<slot>accept()</slot> |
|||
</connection> |
|||
<connection> |
|||
<sender>buttonBoxVibration</sender> |
|||
<signal>rejected()</signal> |
|||
<receiver>ConfigureVibration</receiver> |
|||
<slot>reject()</slot> |
|||
</connection> |
|||
</connections> |
|||
</ui> |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue