Merge pull request #1780 from DarkLordZach/controller-profiles
configure_input: Add Controller Setup Profiles and simplify input UI
This commit is contained in:
commit
d08bdc861f
12 changed files with 401 additions and 66 deletions
|
@ -31,6 +31,8 @@ add_executable(yuzu
|
||||||
configuration/configure_input.h
|
configuration/configure_input.h
|
||||||
configuration/configure_input_player.cpp
|
configuration/configure_input_player.cpp
|
||||||
configuration/configure_input_player.h
|
configuration/configure_input_player.h
|
||||||
|
configuration/configure_input_simple.cpp
|
||||||
|
configuration/configure_input_simple.h
|
||||||
configuration/configure_mouse_advanced.cpp
|
configuration/configure_mouse_advanced.cpp
|
||||||
configuration/configure_mouse_advanced.h
|
configuration/configure_mouse_advanced.h
|
||||||
configuration/configure_system.cpp
|
configuration/configure_system.cpp
|
||||||
|
@ -87,6 +89,7 @@ set(UIS
|
||||||
configuration/configure_graphics.ui
|
configuration/configure_graphics.ui
|
||||||
configuration/configure_input.ui
|
configuration/configure_input.ui
|
||||||
configuration/configure_input_player.ui
|
configuration/configure_input_player.ui
|
||||||
|
configuration/configure_input_simple.ui
|
||||||
configuration/configure_mouse_advanced.ui
|
configuration/configure_mouse_advanced.ui
|
||||||
configuration/configure_per_general.ui
|
configuration/configure_per_general.ui
|
||||||
configuration/configure_system.ui
|
configuration/configure_system.ui
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include "common/file_util.h"
|
#include "common/file_util.h"
|
||||||
|
#include "configure_input_simple.h"
|
||||||
#include "core/hle/service/acc/profile_manager.h"
|
#include "core/hle/service/acc/profile_manager.h"
|
||||||
#include "core/hle/service/hid/controllers/npad.h"
|
#include "core/hle/service/hid/controllers/npad.h"
|
||||||
#include "input_common/main.h"
|
#include "input_common/main.h"
|
||||||
|
@ -339,6 +340,13 @@ void Config::ReadTouchscreenValues() {
|
||||||
qt_config->endGroup();
|
qt_config->endGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Config::ApplyDefaultProfileIfInputInvalid() {
|
||||||
|
if (!std::any_of(Settings::values.players.begin(), Settings::values.players.end(),
|
||||||
|
[](const Settings::PlayerInput& in) { return in.connected; })) {
|
||||||
|
ApplyInputProfileConfiguration(UISettings::values.profile_index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Config::ReadValues() {
|
void Config::ReadValues() {
|
||||||
qt_config->beginGroup("Controls");
|
qt_config->beginGroup("Controls");
|
||||||
|
|
||||||
|
@ -518,6 +526,9 @@ void Config::ReadValues() {
|
||||||
UISettings::values.first_start = qt_config->value("firstStart", true).toBool();
|
UISettings::values.first_start = qt_config->value("firstStart", true).toBool();
|
||||||
UISettings::values.callout_flags = qt_config->value("calloutFlags", 0).toUInt();
|
UISettings::values.callout_flags = qt_config->value("calloutFlags", 0).toUInt();
|
||||||
UISettings::values.show_console = qt_config->value("showConsole", false).toBool();
|
UISettings::values.show_console = qt_config->value("showConsole", false).toBool();
|
||||||
|
UISettings::values.profile_index = qt_config->value("profileIndex", 0).toUInt();
|
||||||
|
|
||||||
|
ApplyDefaultProfileIfInputInvalid();
|
||||||
|
|
||||||
qt_config->endGroup();
|
qt_config->endGroup();
|
||||||
}
|
}
|
||||||
|
@ -720,6 +731,7 @@ void Config::SaveValues() {
|
||||||
qt_config->setValue("firstStart", UISettings::values.first_start);
|
qt_config->setValue("firstStart", UISettings::values.first_start);
|
||||||
qt_config->setValue("calloutFlags", UISettings::values.callout_flags);
|
qt_config->setValue("calloutFlags", UISettings::values.callout_flags);
|
||||||
qt_config->setValue("showConsole", UISettings::values.show_console);
|
qt_config->setValue("showConsole", UISettings::values.show_console);
|
||||||
|
qt_config->setValue("profileIndex", UISettings::values.profile_index);
|
||||||
qt_config->endGroup();
|
qt_config->endGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,7 @@ private:
|
||||||
void ReadKeyboardValues();
|
void ReadKeyboardValues();
|
||||||
void ReadMouseValues();
|
void ReadMouseValues();
|
||||||
void ReadTouchscreenValues();
|
void ReadTouchscreenValues();
|
||||||
|
void ApplyDefaultProfileIfInputInvalid();
|
||||||
|
|
||||||
void SaveValues();
|
void SaveValues();
|
||||||
void SavePlayerValues();
|
void SavePlayerValues();
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>461</width>
|
<width>461</width>
|
||||||
<height>500</height>
|
<height>659</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
|
@ -24,17 +24,17 @@
|
||||||
<string>General</string>
|
<string>General</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="ConfigureGameList" name="gameListTab">
|
<widget class="ConfigureGameList" name="gameListTab">
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>Game List</string>
|
<string>Game List</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="ConfigureSystem" name="systemTab">
|
<widget class="ConfigureSystem" name="systemTab">
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>System</string>
|
<string>System</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="ConfigureInput" name="inputTab">
|
<widget class="ConfigureInputSimple" name="inputTab">
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>Input</string>
|
<string>Input</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
|
@ -54,11 +54,11 @@
|
||||||
<string>Debug</string>
|
<string>Debug</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="ConfigureWeb" name="webTab">
|
<widget class="ConfigureWeb" name="webTab">
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>Web</string>
|
<string>Web</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
|
@ -77,12 +77,12 @@
|
||||||
<header>configuration/configure_general.h</header>
|
<header>configuration/configure_general.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>ConfigureGameList</class>
|
<class>ConfigureGameList</class>
|
||||||
<extends>QWidget</extends>
|
<extends>QWidget</extends>
|
||||||
<header>configuration/configure_gamelist.h</header>
|
<header>configuration/configure_gamelist.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>ConfigureSystem</class>
|
<class>ConfigureSystem</class>
|
||||||
<extends>QWidget</extends>
|
<extends>QWidget</extends>
|
||||||
|
@ -102,9 +102,9 @@
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>ConfigureInput</class>
|
<class>ConfigureInputSimple</class>
|
||||||
<extends>QWidget</extends>
|
<extends>QWidget</extends>
|
||||||
<header>configuration/configure_input.h</header>
|
<header>configuration/configure_input_simple.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
|
@ -113,12 +113,12 @@
|
||||||
<header>configuration/configure_graphics.h</header>
|
<header>configuration/configure_graphics.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>ConfigureWeb</class>
|
<class>ConfigureWeb</class>
|
||||||
<extends>QWidget</extends>
|
<extends>QWidget</extends>
|
||||||
<header>configuration/configure_web.h</header>
|
<header>configuration/configure_web.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections>
|
<connections>
|
||||||
|
|
|
@ -20,6 +20,33 @@
|
||||||
#include "yuzu/configuration/configure_input_player.h"
|
#include "yuzu/configuration/configure_input_player.h"
|
||||||
#include "yuzu/configuration/configure_mouse_advanced.h"
|
#include "yuzu/configuration/configure_mouse_advanced.h"
|
||||||
|
|
||||||
|
void OnDockedModeChanged(bool last_state, bool new_state) {
|
||||||
|
if (last_state == new_state) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::System& system{Core::System::GetInstance()};
|
||||||
|
if (!system.IsPoweredOn()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Service::SM::ServiceManager& sm = system.ServiceManager();
|
||||||
|
|
||||||
|
// Message queue is shared between these services, we just need to signal an operation
|
||||||
|
// change to one and it will handle both automatically
|
||||||
|
auto applet_oe = sm.GetService<Service::AM::AppletOE>("appletOE");
|
||||||
|
auto applet_ae = sm.GetService<Service::AM::AppletAE>("appletAE");
|
||||||
|
bool has_signalled = false;
|
||||||
|
|
||||||
|
if (applet_oe != nullptr) {
|
||||||
|
applet_oe->GetMessageQueue()->OperationModeChanged();
|
||||||
|
has_signalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (applet_ae != nullptr && !has_signalled) {
|
||||||
|
applet_ae->GetMessageQueue()->OperationModeChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
template <typename Dialog, typename... Args>
|
template <typename Dialog, typename... Args>
|
||||||
void CallConfigureDialog(ConfigureInput& parent, Args&&... args) {
|
void CallConfigureDialog(ConfigureInput& parent, Args&&... args) {
|
||||||
|
@ -34,7 +61,7 @@ void CallConfigureDialog(ConfigureInput& parent, Args&&... args) {
|
||||||
} // Anonymous namespace
|
} // Anonymous namespace
|
||||||
|
|
||||||
ConfigureInput::ConfigureInput(QWidget* parent)
|
ConfigureInput::ConfigureInput(QWidget* parent)
|
||||||
: QWidget(parent), ui(std::make_unique<Ui::ConfigureInput>()) {
|
: QDialog(parent), ui(std::make_unique<Ui::ConfigureInput>()) {
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
players_controller = {
|
players_controller = {
|
||||||
|
@ -90,37 +117,6 @@ ConfigureInput::ConfigureInput(QWidget* parent)
|
||||||
|
|
||||||
ConfigureInput::~ConfigureInput() = default;
|
ConfigureInput::~ConfigureInput() = default;
|
||||||
|
|
||||||
void ConfigureInput::OnDockedModeChanged(bool last_state, bool new_state) {
|
|
||||||
if (ui->use_docked_mode->isChecked() && ui->handheld_connected->isChecked()) {
|
|
||||||
ui->handheld_connected->setChecked(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (last_state == new_state) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Core::System& system{Core::System::GetInstance()};
|
|
||||||
if (!system.IsPoweredOn()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Service::SM::ServiceManager& sm = system.ServiceManager();
|
|
||||||
|
|
||||||
// Message queue is shared between these services, we just need to signal an operation
|
|
||||||
// change to one and it will handle both automatically
|
|
||||||
auto applet_oe = sm.GetService<Service::AM::AppletOE>("appletOE");
|
|
||||||
auto applet_ae = sm.GetService<Service::AM::AppletAE>("appletAE");
|
|
||||||
bool has_signalled = false;
|
|
||||||
|
|
||||||
if (applet_oe != nullptr) {
|
|
||||||
applet_oe->GetMessageQueue()->OperationModeChanged();
|
|
||||||
has_signalled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (applet_ae != nullptr && !has_signalled) {
|
|
||||||
applet_ae->GetMessageQueue()->OperationModeChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigureInput::applyConfiguration() {
|
void ConfigureInput::applyConfiguration() {
|
||||||
for (std::size_t i = 0; i < players_controller.size(); ++i) {
|
for (std::size_t i = 0; i < players_controller.size(); ++i) {
|
||||||
const auto controller_type_index = players_controller[i]->currentIndex();
|
const auto controller_type_index = players_controller[i]->currentIndex();
|
||||||
|
|
|
@ -7,8 +7,8 @@
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
#include <QKeyEvent>
|
#include <QKeyEvent>
|
||||||
#include <QWidget>
|
|
||||||
|
|
||||||
#include "ui_configure_input.h"
|
#include "ui_configure_input.h"
|
||||||
|
|
||||||
|
@ -20,7 +20,9 @@ namespace Ui {
|
||||||
class ConfigureInput;
|
class ConfigureInput;
|
||||||
}
|
}
|
||||||
|
|
||||||
class ConfigureInput : public QWidget {
|
void OnDockedModeChanged(bool last_state, bool new_state);
|
||||||
|
|
||||||
|
class ConfigureInput : public QDialog {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -33,8 +35,6 @@ public:
|
||||||
private:
|
private:
|
||||||
void updateUIEnabled();
|
void updateUIEnabled();
|
||||||
|
|
||||||
void OnDockedModeChanged(bool last_state, bool new_state);
|
|
||||||
|
|
||||||
/// Load configuration settings.
|
/// Load configuration settings.
|
||||||
void loadConfiguration();
|
void loadConfiguration();
|
||||||
/// Restore all buttons to their default values.
|
/// Restore all buttons to their default values.
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<ui version="4.0">
|
<ui version="4.0">
|
||||||
<class>ConfigureInput</class>
|
<class>ConfigureInput</class>
|
||||||
<widget class="QWidget" name="ConfigureInput">
|
<widget class="QDialog" name="ConfigureInput">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>473</width>
|
<width>384</width>
|
||||||
<height>685</height>
|
<height>576</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
|
@ -478,6 +478,13 @@
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QDialogButtonBox" name="buttonBox">
|
||||||
|
<property name="standardButtons">
|
||||||
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
@ -485,5 +492,38 @@
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections/>
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>accepted()</signal>
|
||||||
|
<receiver>ConfigureInput</receiver>
|
||||||
|
<slot>accept()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>294</x>
|
||||||
|
<y>553</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>191</x>
|
||||||
|
<y>287</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>rejected()</signal>
|
||||||
|
<receiver>ConfigureInput</receiver>
|
||||||
|
<slot>reject()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>294</x>
|
||||||
|
<y>553</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>191</x>
|
||||||
|
<y>287</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
</ui>
|
</ui>
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <QColorDialog>
|
#include <QColorDialog>
|
||||||
|
#include <QGridLayout>
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
142
src/yuzu/configuration/configure_input_simple.cpp
Normal file
142
src/yuzu/configuration/configure_input_simple.cpp
Normal file
|
@ -0,0 +1,142 @@
|
||||||
|
// Copyright 2016 Citra Emulator Project
|
||||||
|
// Licensed under GPLv2 or any later version
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
#include <cstring>
|
||||||
|
#include <functional>
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
#include "ui_configure_input_simple.h"
|
||||||
|
#include "yuzu/configuration/configure_input.h"
|
||||||
|
#include "yuzu/configuration/configure_input_player.h"
|
||||||
|
#include "yuzu/configuration/configure_input_simple.h"
|
||||||
|
#include "yuzu/ui_settings.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
template <typename Dialog, typename... Args>
|
||||||
|
void CallConfigureDialog(ConfigureInputSimple* caller, Args&&... args) {
|
||||||
|
caller->applyConfiguration();
|
||||||
|
Dialog dialog(caller, std::forward<Args>(args)...);
|
||||||
|
|
||||||
|
const auto res = dialog.exec();
|
||||||
|
if (res == QDialog::Accepted) {
|
||||||
|
dialog.applyConfiguration();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// OnProfileSelect functions should (when applicable):
|
||||||
|
// - Set controller types
|
||||||
|
// - Set controller enabled
|
||||||
|
// - Set docked mode
|
||||||
|
// - Set advanced controller config/enabled (i.e. debug, kbd, mouse, touch)
|
||||||
|
//
|
||||||
|
// OnProfileSelect function should NOT however:
|
||||||
|
// - Reset any button mappings
|
||||||
|
// - Open any dialogs
|
||||||
|
// - Block in any way
|
||||||
|
|
||||||
|
constexpr std::size_t HANDHELD_INDEX = 8;
|
||||||
|
|
||||||
|
void HandheldOnProfileSelect() {
|
||||||
|
Settings::values.players[HANDHELD_INDEX].connected = true;
|
||||||
|
Settings::values.players[HANDHELD_INDEX].type = Settings::ControllerType::DualJoycon;
|
||||||
|
|
||||||
|
for (std::size_t player = 0; player < HANDHELD_INDEX; ++player) {
|
||||||
|
Settings::values.players[player].connected = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Settings::values.use_docked_mode = false;
|
||||||
|
Settings::values.keyboard_enabled = false;
|
||||||
|
Settings::values.mouse_enabled = false;
|
||||||
|
Settings::values.debug_pad_enabled = false;
|
||||||
|
Settings::values.touchscreen.enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DualJoyconsDockedOnProfileSelect() {
|
||||||
|
Settings::values.players[0].connected = true;
|
||||||
|
Settings::values.players[0].type = Settings::ControllerType::DualJoycon;
|
||||||
|
|
||||||
|
for (std::size_t player = 1; player <= HANDHELD_INDEX; ++player) {
|
||||||
|
Settings::values.players[player].connected = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Settings::values.use_docked_mode = true;
|
||||||
|
Settings::values.keyboard_enabled = false;
|
||||||
|
Settings::values.mouse_enabled = false;
|
||||||
|
Settings::values.debug_pad_enabled = false;
|
||||||
|
Settings::values.touchscreen.enabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Name, OnProfileSelect (called when selected in drop down), OnConfigure (called when configure
|
||||||
|
// is clicked)
|
||||||
|
using InputProfile =
|
||||||
|
std::tuple<QString, std::function<void()>, std::function<void(ConfigureInputSimple*)>>;
|
||||||
|
|
||||||
|
const std::array<InputProfile, 3> INPUT_PROFILES{{
|
||||||
|
{ConfigureInputSimple::tr("Single Player - Handheld - Undocked"), HandheldOnProfileSelect,
|
||||||
|
[](ConfigureInputSimple* caller) {
|
||||||
|
CallConfigureDialog<ConfigureInputPlayer>(caller, HANDHELD_INDEX, false);
|
||||||
|
}},
|
||||||
|
{ConfigureInputSimple::tr("Single Player - Dual Joycons - Docked"),
|
||||||
|
DualJoyconsDockedOnProfileSelect,
|
||||||
|
[](ConfigureInputSimple* caller) {
|
||||||
|
CallConfigureDialog<ConfigureInputPlayer>(caller, 1, false);
|
||||||
|
}},
|
||||||
|
{ConfigureInputSimple::tr("Custom"), [] {}, CallConfigureDialog<ConfigureInput>},
|
||||||
|
}};
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
void ApplyInputProfileConfiguration(int profile_index) {
|
||||||
|
std::get<1>(
|
||||||
|
INPUT_PROFILES.at(std::min(profile_index, static_cast<int>(INPUT_PROFILES.size() - 1))))();
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfigureInputSimple::ConfigureInputSimple(QWidget* parent)
|
||||||
|
: QWidget(parent), ui(std::make_unique<Ui::ConfigureInputSimple>()) {
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
for (const auto& profile : INPUT_PROFILES) {
|
||||||
|
ui->profile_combobox->addItem(std::get<0>(profile), std::get<0>(profile));
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(ui->profile_combobox, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
|
||||||
|
&ConfigureInputSimple::OnSelectProfile);
|
||||||
|
connect(ui->profile_configure, &QPushButton::pressed, this, &ConfigureInputSimple::OnConfigure);
|
||||||
|
|
||||||
|
this->loadConfiguration();
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfigureInputSimple::~ConfigureInputSimple() = default;
|
||||||
|
|
||||||
|
void ConfigureInputSimple::applyConfiguration() {
|
||||||
|
auto index = ui->profile_combobox->currentIndex();
|
||||||
|
// Make the stored index for "Custom" very large so that if new profiles are added it
|
||||||
|
// doesn't change.
|
||||||
|
if (index >= static_cast<int>(INPUT_PROFILES.size() - 1))
|
||||||
|
index = std::numeric_limits<int>::max();
|
||||||
|
|
||||||
|
UISettings::values.profile_index = index;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigureInputSimple::loadConfiguration() {
|
||||||
|
const auto index = UISettings::values.profile_index;
|
||||||
|
if (index >= static_cast<int>(INPUT_PROFILES.size()) || index < 0)
|
||||||
|
ui->profile_combobox->setCurrentIndex(static_cast<int>(INPUT_PROFILES.size() - 1));
|
||||||
|
else
|
||||||
|
ui->profile_combobox->setCurrentIndex(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigureInputSimple::OnSelectProfile(int index) {
|
||||||
|
const auto old_docked = Settings::values.use_docked_mode;
|
||||||
|
ApplyInputProfileConfiguration(index);
|
||||||
|
OnDockedModeChanged(old_docked, Settings::values.use_docked_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigureInputSimple::OnConfigure() {
|
||||||
|
std::get<2>(INPUT_PROFILES.at(ui->profile_combobox->currentIndex()))(this);
|
||||||
|
}
|
40
src/yuzu/configuration/configure_input_simple.h
Normal file
40
src/yuzu/configuration/configure_input_simple.h
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
// Copyright 2016 Citra Emulator Project
|
||||||
|
// Licensed under GPLv2 or any later version
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
class QPushButton;
|
||||||
|
class QString;
|
||||||
|
class QTimer;
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class ConfigureInputSimple;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Used by configuration loader to apply a profile if the input is invalid.
|
||||||
|
void ApplyInputProfileConfiguration(int profile_index);
|
||||||
|
|
||||||
|
class ConfigureInputSimple : public QWidget {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ConfigureInputSimple(QWidget* parent = nullptr);
|
||||||
|
~ConfigureInputSimple() override;
|
||||||
|
|
||||||
|
/// Save all button configurations to settings file
|
||||||
|
void applyConfiguration();
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// Load configuration settings.
|
||||||
|
void loadConfiguration();
|
||||||
|
|
||||||
|
void OnSelectProfile(int index);
|
||||||
|
void OnConfigure();
|
||||||
|
|
||||||
|
std::unique_ptr<Ui::ConfigureInputSimple> ui;
|
||||||
|
};
|
97
src/yuzu/configuration/configure_input_simple.ui
Normal file
97
src/yuzu/configuration/configure_input_simple.ui
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>ConfigureInputSimple</class>
|
||||||
|
<widget class="QWidget" name="ConfigureInputSimple">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>473</width>
|
||||||
|
<height>685</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>ConfigureInputSimple</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="gridGroupBox">
|
||||||
|
<property name="title">
|
||||||
|
<string>Profile</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QPushButton" name="profile_configure">
|
||||||
|
<property name="text">
|
||||||
|
<string>Configure</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<spacer name="horizontalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="3">
|
||||||
|
<spacer name="horizontalSpacer_2">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QComboBox" name="profile_combobox">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>250</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1" colspan="2">
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Choose a controller configuration:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
|
@ -58,6 +58,9 @@ struct Values {
|
||||||
// logging
|
// logging
|
||||||
bool show_console;
|
bool show_console;
|
||||||
|
|
||||||
|
// Controllers
|
||||||
|
int profile_index;
|
||||||
|
|
||||||
// Game List
|
// Game List
|
||||||
bool show_unknown;
|
bool show_unknown;
|
||||||
bool show_add_ons;
|
bool show_add_ons;
|
||||||
|
|
Loading…
Reference in a new issue