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 | 1 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_player.cpp | 1 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_simple.cpp | 140 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_simple.h | 40 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_simple.ui | 97 | 
6 files changed, 289 insertions, 0 deletions
| diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index ef028cca3..5e0d149cd 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -4,6 +4,7 @@  #include <QSettings>  #include "common/file_util.h" +#include "configure_input_simple.h"  #include "core/hle/service/acc/profile_manager.h"  #include "core/hle/service/hid/controllers/npad.h"  #include "input_common/main.h" @@ -342,6 +343,13 @@ void Config::ReadTouchscreenValues() {      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() {      qt_config->beginGroup("Controls"); @@ -508,6 +516,8 @@ void Config::ReadValues() {      UISettings::values.show_console = qt_config->value("showConsole", false).toBool();      UISettings::values.profile_index = qt_config->value("profileIndex", 0).toUInt(); +    ApplyDefaultProfileIfInputInvalid(); +      qt_config->endGroup();  } diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h index a1c27bbf9..e73ad19bb 100644 --- a/src/yuzu/configuration/config.h +++ b/src/yuzu/configuration/config.h @@ -34,6 +34,7 @@ private:      void ReadKeyboardValues();      void ReadMouseValues();      void ReadTouchscreenValues(); +    void ApplyDefaultProfileIfInputInvalid();      void SaveValues();      void SavePlayerValues(); diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index 7dadd83c1..ba2b32c4f 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -6,6 +6,7 @@  #include <memory>  #include <utility>  #include <QColorDialog> +#include <QGridLayout>  #include <QMenu>  #include <QMessageBox>  #include <QTimer> diff --git a/src/yuzu/configuration/configure_input_simple.cpp b/src/yuzu/configuration/configure_input_simple.cpp new file mode 100644 index 000000000..10c804388 --- /dev/null +++ b/src/yuzu/configuration/configure_input_simple.cpp @@ -0,0 +1,140 @@ +// 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) { +    ApplyInputProfileConfiguration(index); +} + +void ConfigureInputSimple::OnConfigure() { +    std::get<2>(INPUT_PROFILES.at(ui->profile_combobox->currentIndex()))(this); +} diff --git a/src/yuzu/configuration/configure_input_simple.h b/src/yuzu/configuration/configure_input_simple.h new file mode 100644 index 000000000..5b6b69994 --- /dev/null +++ b/src/yuzu/configuration/configure_input_simple.h @@ -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; +}; diff --git a/src/yuzu/configuration/configure_input_simple.ui b/src/yuzu/configuration/configure_input_simple.ui new file mode 100644 index 000000000..c4889caa9 --- /dev/null +++ b/src/yuzu/configuration/configure_input_simple.ui @@ -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> | 
