configure_input_simple: Add support for checking configuration errors

This commit is contained in:
Zach Hilman
2018-12-24 17:35:18 -05:00
parent 41881d8d26
commit 0f82eb83f9
3 changed files with 113 additions and 4 deletions

View File

@@ -90,8 +90,9 @@ void ApplyInputProfileConfiguration(int profile_index) {
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>()) {
ConfigureInputSimple::ConfigureInputSimple(
QWidget* parent, std::optional<Core::Frontend::ControllerParameters> constraints)
: QWidget(parent), ui(std::make_unique<Ui::ConfigureInputSimple>()), constraints(constraints) {
ui->setupUi(this);
for (const auto& profile : INPUT_PROFILES) {
@@ -104,6 +105,7 @@ ConfigureInputSimple::ConfigureInputSimple(QWidget* parent)
connect(ui->profile_configure, &QPushButton::pressed, this, &ConfigureInputSimple::OnConfigure);
this->loadConfiguration();
UpdateErrors();
}
ConfigureInputSimple::~ConfigureInputSimple() = default;
@@ -130,8 +132,96 @@ void ConfigureInputSimple::OnSelectProfile(int index) {
const auto old_docked = Settings::values.use_docked_mode;
ApplyInputProfileConfiguration(index);
OnDockedModeChanged(old_docked, Settings::values.use_docked_mode);
UpdateErrors();
}
void ConfigureInputSimple::OnConfigure() {
std::get<2>(INPUT_PROFILES.at(ui->profile_combobox->currentIndex()))(this);
UpdateErrors();
}
static bool AnyPlayersMatchingType(Settings::ControllerType type) {
return std::any_of(
Settings::values.players.begin(), Settings::values.players.begin() + 8,
[type](const Settings::PlayerInput& in) { return in.type == type && in.connected; });
}
void ConfigureInputSimple::UpdateErrors() {
if (constraints == std::nullopt) {
ui->error_view->setHidden(true);
return;
}
ui->error_view->setHidden(false);
QString text;
const auto number_player =
std::count_if(Settings::values.players.begin(), Settings::values.players.begin() + 9,
[](const Settings::PlayerInput& in) { return in.connected; });
if (number_player < constraints->min_players) {
text += tr("<li>The game requires a <i>minimum</i> of %1 players, you currently have %2 "
"players.</li>")
.arg(constraints->min_players)
.arg(number_player);
}
if (number_player > constraints->max_players) {
text += tr("<li>The game allows a <i>maximum</i> of %1 players, you currently have %2 "
"players.</li>")
.arg(constraints->max_players)
.arg(number_player);
}
if (AnyPlayersMatchingType(Settings::ControllerType::ProController) &&
!constraints->allowed_pro_controller) {
text += tr("<li>The game does not allow the use of the <i>Pro Controller</i>.</li>");
}
if (AnyPlayersMatchingType(Settings::ControllerType::DualJoycon) &&
!constraints->allowed_joycon_dual) {
text += tr("<li>The game does not allow the use of <i>Dual Joycons</i>.</li>");
}
if (AnyPlayersMatchingType(Settings::ControllerType::LeftJoycon) &&
!constraints->allowed_joycon_left) {
text += tr("<li>The game does not allow the use of the <i>Single Left Joycon</i> "
"controller.</li>");
}
if (AnyPlayersMatchingType(Settings::ControllerType::RightJoycon) &&
!constraints->allowed_joycon_right) {
text += tr("<li>The game does not allow the use of the <i>Single Right Joycon</i> "
"controller.</li>");
}
if (Settings::values.players[HANDHELD_INDEX].connected && !constraints->allowed_handheld) {
text += tr("<li>The game does not allow the use of the <i>Handheld</i> Controller.</li>");
}
const auto has_single = AnyPlayersMatchingType(Settings::ControllerType::LeftJoycon) ||
AnyPlayersMatchingType(Settings::ControllerType::RightJoycon);
if (has_single && !constraints->allowed_single_layout) {
text += tr("<li>The game does not allow <i>single joycon</i> controllers.</li>");
}
if (has_single && constraints->merge_dual_joycons) {
text += tr(
"<li>The game requires that pairs of <i>single joycons</i> be merged into one <i>Dual "
"Joycon</i> controller.</li>");
}
if (!text.isEmpty()) {
is_valid = false;
ui->error_view->setText(
"<h4 style=\"color:#CC0000;\">The following errors were identified in "
"your input configuration:</h4><ul>" +
text + "</ul>");
} else {
is_valid = true;
ui->error_view->setText(
tr("<h4 style=\"color:#00CC00;\">Your input configuration is valid.</h4>"));
}
}

View File

@@ -5,9 +5,12 @@
#pragma once
#include <memory>
#include <optional>
#include <QWidget>
#include "core/frontend/applets/controller.h"
class QPushButton;
class QString;
class QTimer;
@@ -23,7 +26,9 @@ class ConfigureInputSimple : public QWidget {
Q_OBJECT
public:
explicit ConfigureInputSimple(QWidget* parent = nullptr);
explicit ConfigureInputSimple(
QWidget* parent = nullptr,
std::optional<Core::Frontend::ControllerParameters> constraints = std::nullopt);
~ConfigureInputSimple() override;
/// Save all button configurations to settings file
@@ -36,5 +41,9 @@ private:
void OnSelectProfile(int index);
void OnConfigure();
void UpdateErrors();
std::unique_ptr<Ui::ConfigureInputSimple> ui;
std::optional<Core::Frontend::ControllerParameters> constraints;
bool is_valid = true;
};

View File

@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>473</width>
<height>685</height>
<height>247</height>
</rect>
</property>
<property name="windowTitle">
@@ -90,6 +90,16 @@
</property>
</spacer>
</item>
<item>
<widget class="QTextBrowser" name="error_view">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>120</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>