summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Morph2020-08-27 01:21:48 -0400
committerGravatar Morph2020-09-04 12:23:25 -0400
commit5ce3015945e327751a053f7a5a1331a33f07819e (patch)
treed12f57a8b573e466c2b5a18bf0a40a019782219a
parentProject Mjölnir: Part 2 - Controller Applet (diff)
downloadyuzu-5ce3015945e327751a053f7a5a1331a33f07819e.tar.gz
yuzu-5ce3015945e327751a053f7a5a1331a33f07819e.tar.xz
yuzu-5ce3015945e327751a053f7a5a1331a33f07819e.zip
applets/controller: Implement "Explain Text"
"Explain Text" is additional text that is shown for each player in the controller applet.
-rw-r--r--src/core/frontend/applets/controller.h3
-rw-r--r--src/core/hle/service/am/applets/controller.cpp37
-rw-r--r--src/core/hle/service/am/applets/controller.h5
-rw-r--r--src/yuzu/applets/controller.cpp20
-rw-r--r--src/yuzu/applets/controller.h6
-rw-r--r--src/yuzu/applets/controller.ui258
6 files changed, 304 insertions, 25 deletions
diff --git a/src/core/frontend/applets/controller.h b/src/core/frontend/applets/controller.h
index 0908f2b69..a227f15cd 100644
--- a/src/core/frontend/applets/controller.h
+++ b/src/core/frontend/applets/controller.h
@@ -11,6 +11,7 @@
11namespace Core::Frontend { 11namespace Core::Frontend {
12 12
13using BorderColor = std::array<u8, 4>; 13using BorderColor = std::array<u8, 4>;
14using ExplainText = std::array<char, 0x81>;
14 15
15struct ControllerParameters { 16struct ControllerParameters {
16 s8 min_players{}; 17 s8 min_players{};
@@ -19,6 +20,8 @@ struct ControllerParameters {
19 bool enable_single_mode{}; 20 bool enable_single_mode{};
20 bool enable_border_color{}; 21 bool enable_border_color{};
21 std::vector<BorderColor> border_colors{}; 22 std::vector<BorderColor> border_colors{};
23 bool enable_explain_text{};
24 std::vector<ExplainText> explain_text{};
22 bool allow_pro_controller{}; 25 bool allow_pro_controller{};
23 bool allow_handheld{}; 26 bool allow_handheld{};
24 bool allow_dual_joycons{}; 27 bool allow_dual_joycons{};
diff --git a/src/core/hle/service/am/applets/controller.cpp b/src/core/hle/service/am/applets/controller.cpp
index 2a45a388f..63c85256d 100644
--- a/src/core/hle/service/am/applets/controller.cpp
+++ b/src/core/hle/service/am/applets/controller.cpp
@@ -19,8 +19,8 @@ namespace Service::AM::Applets {
19[[maybe_unused]] constexpr ResultCode ERR_CONTROLLER_APPLET_3102{ErrorModule::HID, 3102}; 19[[maybe_unused]] constexpr ResultCode ERR_CONTROLLER_APPLET_3102{ErrorModule::HID, 3102};
20 20
21static Core::Frontend::ControllerParameters ConvertToFrontendParameters( 21static Core::Frontend::ControllerParameters ConvertToFrontendParameters(
22 ControllerSupportArgPrivate private_arg, ControllerSupportArgHeader header, 22 ControllerSupportArgPrivate private_arg, ControllerSupportArgHeader header, bool enable_text,
23 std::vector<IdentificationColor> identification_colors) { 23 std::vector<IdentificationColor> identification_colors, std::vector<ExplainText> text) {
24 HID::Controller_NPad::NPadType npad_style_set; 24 HID::Controller_NPad::NPadType npad_style_set;
25 npad_style_set.raw = private_arg.style_set; 25 npad_style_set.raw = private_arg.style_set;
26 26
@@ -31,6 +31,8 @@ static Core::Frontend::ControllerParameters ConvertToFrontendParameters(
31 .enable_single_mode = header.enable_single_mode, 31 .enable_single_mode = header.enable_single_mode,
32 .enable_border_color = header.enable_identification_color, 32 .enable_border_color = header.enable_identification_color,
33 .border_colors = identification_colors, 33 .border_colors = identification_colors,
34 .enable_explain_text = enable_text,
35 .explain_text = text,
34 .allow_pro_controller = npad_style_set.pro_controller == 1, 36 .allow_pro_controller = npad_style_set.pro_controller == 1,
35 .allow_handheld = npad_style_set.handheld == 1, 37 .allow_handheld = npad_style_set.handheld == 1,
36 .allow_dual_joycons = npad_style_set.joycon_dual == 1, 38 .allow_dual_joycons = npad_style_set.joycon_dual == 1,
@@ -126,31 +128,38 @@ void Controller::Execute() {
126 case LibraryAppletVersion::Version5: 128 case LibraryAppletVersion::Version5:
127 return ConvertToFrontendParameters( 129 return ConvertToFrontendParameters(
128 controller_private_arg, controller_user_arg_old.header, 130 controller_private_arg, controller_user_arg_old.header,
131 controller_user_arg_old.enable_explain_text,
129 std::vector<IdentificationColor>( 132 std::vector<IdentificationColor>(
130 controller_user_arg_old.identification_colors.begin(), 133 controller_user_arg_old.identification_colors.begin(),
131 controller_user_arg_old.identification_colors.end())); 134 controller_user_arg_old.identification_colors.end()),
135 std::vector<ExplainText>(controller_user_arg_old.explain_text.begin(),
136 controller_user_arg_old.explain_text.end()));
132 case LibraryAppletVersion::Version7: 137 case LibraryAppletVersion::Version7:
133 default: 138 default:
134 return ConvertToFrontendParameters( 139 return ConvertToFrontendParameters(
135 controller_private_arg, controller_user_arg_new.header, 140 controller_private_arg, controller_user_arg_new.header,
141 controller_user_arg_new.enable_explain_text,
136 std::vector<IdentificationColor>( 142 std::vector<IdentificationColor>(
137 controller_user_arg_new.identification_colors.begin(), 143 controller_user_arg_new.identification_colors.begin(),
138 controller_user_arg_new.identification_colors.end())); 144 controller_user_arg_new.identification_colors.end()),
145 std::vector<ExplainText>(controller_user_arg_new.explain_text.begin(),
146 controller_user_arg_new.explain_text.end()));
139 } 147 }
140 }(); 148 }();
141 149
142 is_single_mode = parameters.enable_single_mode; 150 is_single_mode = parameters.enable_single_mode;
143 151
144 LOG_DEBUG( 152 LOG_DEBUG(Service_HID,
145 Service_HID, 153 "Controller Parameters: min_players={}, max_players={}, "
146 "Controller Parameters: min_players={}, max_players={}, keep_controllers_connected={}, " 154 "keep_controllers_connected={}, enable_single_mode={}, enable_border_color={}, "
147 "enable_single_mode={}, enable_border_color={}, allow_pro_controller={}, " 155 "enable_explain_text={}, allow_pro_controller={}, allow_handheld={}, "
148 "allow_handheld={}, allow_dual_joycons={}, allow_left_joycon={}, allow_right_joycon={}", 156 "allow_dual_joycons={}, allow_left_joycon={}, allow_right_joycon={}",
149 parameters.min_players, parameters.max_players, parameters.keep_controllers_connected, 157 parameters.min_players, parameters.max_players,
150 parameters.enable_single_mode, parameters.enable_border_color, 158 parameters.keep_controllers_connected, parameters.enable_single_mode,
151 parameters.allow_pro_controller, parameters.allow_handheld, 159 parameters.enable_border_color, parameters.enable_explain_text,
152 parameters.allow_dual_joycons, parameters.allow_left_joycon, 160 parameters.allow_pro_controller, parameters.allow_handheld,
153 parameters.allow_right_joycon); 161 parameters.allow_dual_joycons, parameters.allow_left_joycon,
162 parameters.allow_right_joycon);
154 163
155 frontend.ReconfigureControllers([this] { ConfigurationComplete(); }, parameters); 164 frontend.ReconfigureControllers([this] { ConfigurationComplete(); }, parameters);
156 break; 165 break;
diff --git a/src/core/hle/service/am/applets/controller.h b/src/core/hle/service/am/applets/controller.h
index 90a78d508..31ba2af4f 100644
--- a/src/core/hle/service/am/applets/controller.h
+++ b/src/core/hle/service/am/applets/controller.h
@@ -16,6 +16,7 @@ class System;
16namespace Service::AM::Applets { 16namespace Service::AM::Applets {
17 17
18using IdentificationColor = std::array<u8, 4>; 18using IdentificationColor = std::array<u8, 4>;
19using ExplainText = std::array<char, 0x81>;
19 20
20enum class LibraryAppletVersion : u32_le { 21enum class LibraryAppletVersion : u32_le {
21 Version3 = 0x3, // 1.0.0 - 2.3.0 22 Version3 = 0x3, // 1.0.0 - 2.3.0
@@ -65,7 +66,7 @@ struct ControllerSupportArgOld {
65 ControllerSupportArgHeader header{}; 66 ControllerSupportArgHeader header{};
66 std::array<IdentificationColor, 4> identification_colors{}; 67 std::array<IdentificationColor, 4> identification_colors{};
67 bool enable_explain_text{}; 68 bool enable_explain_text{};
68 std::array<std::array<char, 0x81>, 4> explain_text{}; 69 std::array<ExplainText, 4> explain_text{};
69}; 70};
70static_assert(sizeof(ControllerSupportArgOld) == 0x21C, 71static_assert(sizeof(ControllerSupportArgOld) == 0x21C,
71 "ControllerSupportArgOld has incorrect size."); 72 "ControllerSupportArgOld has incorrect size.");
@@ -75,7 +76,7 @@ struct ControllerSupportArgNew {
75 ControllerSupportArgHeader header{}; 76 ControllerSupportArgHeader header{};
76 std::array<IdentificationColor, 8> identification_colors{}; 77 std::array<IdentificationColor, 8> identification_colors{};
77 bool enable_explain_text{}; 78 bool enable_explain_text{};
78 std::array<std::array<char, 0x81>, 8> explain_text{}; 79 std::array<ExplainText, 8> explain_text{};
79}; 80};
80static_assert(sizeof(ControllerSupportArgNew) == 0x430, 81static_assert(sizeof(ControllerSupportArgNew) == 0x430,
81 "ControllerSupportArgNew has incorrect size."); 82 "ControllerSupportArgNew has incorrect size.");
diff --git a/src/yuzu/applets/controller.cpp b/src/yuzu/applets/controller.cpp
index 8ccf61be0..7482174c6 100644
--- a/src/yuzu/applets/controller.cpp
+++ b/src/yuzu/applets/controller.cpp
@@ -4,6 +4,7 @@
4 4
5#include <algorithm> 5#include <algorithm>
6 6
7#include "common/string_util.h"
7#include "core/core.h" 8#include "core/core.h"
8#include "core/hle/lock.h" 9#include "core/hle/lock.h"
9#include "core/hle/service/hid/controllers/npad.h" 10#include "core/hle/service/hid/controllers/npad.h"
@@ -45,6 +46,7 @@ void UpdateController(Settings::ControllerType controller_type, std::size_t npad
45 npad.UpdateControllerAt(npad.MapSettingsTypeToNPad(controller_type), npad_index, connected); 46 npad.UpdateControllerAt(npad.MapSettingsTypeToNPad(controller_type), npad_index, connected);
46} 47}
47 48
49// Returns true if the given controller type is compatible with the given parameters.
48bool IsControllerCompatible(Settings::ControllerType controller_type, 50bool IsControllerCompatible(Settings::ControllerType controller_type,
49 Core::Frontend::ControllerParameters parameters) { 51 Core::Frontend::ControllerParameters parameters) {
50 switch (controller_type) { 52 switch (controller_type) {
@@ -140,6 +142,12 @@ QtControllerSelectorDialog::QtControllerSelectorDialog(
140 ui->checkboxPlayer8LED4}, 142 ui->checkboxPlayer8LED4},
141 }}; 143 }};
142 144
145 explain_text_labels = {
146 ui->labelPlayer1Explain, ui->labelPlayer2Explain, ui->labelPlayer3Explain,
147 ui->labelPlayer4Explain, ui->labelPlayer5Explain, ui->labelPlayer6Explain,
148 ui->labelPlayer7Explain, ui->labelPlayer8Explain,
149 };
150
143 emulated_controllers = { 151 emulated_controllers = {
144 ui->comboPlayer1Emulated, ui->comboPlayer2Emulated, ui->comboPlayer3Emulated, 152 ui->comboPlayer1Emulated, ui->comboPlayer2Emulated, ui->comboPlayer3Emulated,
145 ui->comboPlayer4Emulated, ui->comboPlayer5Emulated, ui->comboPlayer6Emulated, 153 ui->comboPlayer4Emulated, ui->comboPlayer5Emulated, ui->comboPlayer6Emulated,
@@ -200,6 +208,8 @@ QtControllerSelectorDialog::QtControllerSelectorDialog(
200 Settings::ControllerType::Handheld); 208 Settings::ControllerType::Handheld);
201 }); 209 });
202 } 210 }
211
212 SetExplainText(i);
203 } 213 }
204 214
205 connect(ui->inputConfigButton, &QPushButton::clicked, this, 215 connect(ui->inputConfigButton, &QPushButton::clicked, this,
@@ -468,6 +478,16 @@ void QtControllerSelectorDialog::UpdateBorderColor(std::size_t player_index) {
468 .arg(parameters.border_colors[player_index][3]))); 478 .arg(parameters.border_colors[player_index][3])));
469} 479}
470 480
481void QtControllerSelectorDialog::SetExplainText(std::size_t player_index) {
482 if (!parameters.enable_explain_text || player_index >= parameters.max_players) {
483 return;
484 }
485
486 explain_text_labels[player_index]->setText(QString::fromStdString(
487 Common::StringFromFixedZeroTerminatedBuffer(parameters.explain_text[player_index].data(),
488 parameters.explain_text[player_index].size())));
489}
490
471void QtControllerSelectorDialog::UpdateDockedState(bool is_handheld) { 491void QtControllerSelectorDialog::UpdateDockedState(bool is_handheld) {
472 // Disallow changing the console mode if the controller type is handheld. 492 // Disallow changing the console mode if the controller type is handheld.
473 ui->radioDocked->setEnabled(!is_handheld); 493 ui->radioDocked->setEnabled(!is_handheld);
diff --git a/src/yuzu/applets/controller.h b/src/yuzu/applets/controller.h
index 1ec290e6c..db59dd631 100644
--- a/src/yuzu/applets/controller.h
+++ b/src/yuzu/applets/controller.h
@@ -59,6 +59,9 @@ private:
59 // Updates the border color per player. 59 // Updates the border color per player.
60 void UpdateBorderColor(std::size_t player_index); 60 void UpdateBorderColor(std::size_t player_index);
61 61
62 // Sets the "Explain Text" per player.
63 void SetExplainText(std::size_t player_index);
64
62 // Updates the console mode. 65 // Updates the console mode.
63 void UpdateDockedState(bool is_handheld); 66 void UpdateDockedState(bool is_handheld);
64 67
@@ -94,6 +97,9 @@ private:
94 // LED patterns for currently connected controllers/players. 97 // LED patterns for currently connected controllers/players.
95 std::array<std::array<QCheckBox*, 4>, 8> led_patterns_boxes; 98 std::array<std::array<QCheckBox*, 4>, 8> led_patterns_boxes;
96 99
100 // Labels representing additional information known as "Explain Text" per player.
101 std::array<QLabel*, 8> explain_text_labels;
102
97 // Comboboxes with a list of emulated controllers per player. 103 // Comboboxes with a list of emulated controllers per player.
98 std::array<QComboBox*, 8> emulated_controllers; 104 std::array<QComboBox*, 8> emulated_controllers;
99 105
diff --git a/src/yuzu/applets/controller.ui b/src/yuzu/applets/controller.ui
index d7db46613..c4108a979 100644
--- a/src/yuzu/applets/controller.ui
+++ b/src/yuzu/applets/controller.ui
@@ -468,13 +468,43 @@
468 </widget> 468 </widget>
469 </item> 469 </item>
470 <item> 470 <item>
471 <widget class="QWidget" name="fakeSpacerPlayer4" native="true"> 471 <widget class="QWidget" name="Player4Explain" native="true">
472 <property name="minimumSize"> 472 <property name="minimumSize">
473 <size> 473 <size>
474 <width>0</width> 474 <width>0</width>
475 <height>10</height> 475 <height>10</height>
476 </size> 476 </size>
477 </property> 477 </property>
478 <property name="maximumSize">
479 <size>
480 <width>150</width>
481 <height>16777215</height>
482 </size>
483 </property>
484 <layout class="QVBoxLayout" name="verticalLayout_39">
485 <property name="spacing">
486 <number>0</number>
487 </property>
488 <property name="leftMargin">
489 <number>0</number>
490 </property>
491 <property name="topMargin">
492 <number>0</number>
493 </property>
494 <property name="rightMargin">
495 <number>0</number>
496 </property>
497 <property name="bottomMargin">
498 <number>0</number>
499 </property>
500 <item>
501 <widget class="QLabel" name="labelPlayer4Explain">
502 <property name="alignment">
503 <set>Qt::AlignCenter</set>
504 </property>
505 </widget>
506 </item>
507 </layout>
478 </widget> 508 </widget>
479 </item> 509 </item>
480 <item> 510 <item>
@@ -635,13 +665,43 @@
635 </widget> 665 </widget>
636 </item> 666 </item>
637 <item> 667 <item>
638 <widget class="QWidget" name="fakeSpacerPlayer2" native="true"> 668 <widget class="QWidget" name="Player2Explain" native="true">
639 <property name="minimumSize"> 669 <property name="minimumSize">
640 <size> 670 <size>
641 <width>0</width> 671 <width>0</width>
642 <height>10</height> 672 <height>10</height>
643 </size> 673 </size>
644 </property> 674 </property>
675 <property name="maximumSize">
676 <size>
677 <width>150</width>
678 <height>16777215</height>
679 </size>
680 </property>
681 <layout class="QVBoxLayout" name="verticalLayout_37">
682 <property name="spacing">
683 <number>0</number>
684 </property>
685 <property name="leftMargin">
686 <number>0</number>
687 </property>
688 <property name="topMargin">
689 <number>0</number>
690 </property>
691 <property name="rightMargin">
692 <number>0</number>
693 </property>
694 <property name="bottomMargin">
695 <number>0</number>
696 </property>
697 <item>
698 <widget class="QLabel" name="labelPlayer2Explain">
699 <property name="alignment">
700 <set>Qt::AlignCenter</set>
701 </property>
702 </widget>
703 </item>
704 </layout>
645 </widget> 705 </widget>
646 </item> 706 </item>
647 <item> 707 <item>
@@ -806,13 +866,43 @@
806 </widget> 866 </widget>
807 </item> 867 </item>
808 <item> 868 <item>
809 <widget class="QWidget" name="fakeSpacerPlayer1" native="true"> 869 <widget class="QWidget" name="Player1Explain" native="true">
810 <property name="minimumSize"> 870 <property name="minimumSize">
811 <size> 871 <size>
812 <width>0</width> 872 <width>0</width>
813 <height>10</height> 873 <height>10</height>
814 </size> 874 </size>
815 </property> 875 </property>
876 <property name="maximumSize">
877 <size>
878 <width>150</width>
879 <height>16777215</height>
880 </size>
881 </property>
882 <layout class="QVBoxLayout" name="verticalLayout_36">
883 <property name="spacing">
884 <number>0</number>
885 </property>
886 <property name="leftMargin">
887 <number>0</number>
888 </property>
889 <property name="topMargin">
890 <number>0</number>
891 </property>
892 <property name="rightMargin">
893 <number>0</number>
894 </property>
895 <property name="bottomMargin">
896 <number>0</number>
897 </property>
898 <item>
899 <widget class="QLabel" name="labelPlayer1Explain">
900 <property name="alignment">
901 <set>Qt::AlignCenter</set>
902 </property>
903 </widget>
904 </item>
905 </layout>
816 </widget> 906 </widget>
817 </item> 907 </item>
818 <item> 908 <item>
@@ -1086,13 +1176,43 @@
1086 </widget> 1176 </widget>
1087 </item> 1177 </item>
1088 <item> 1178 <item>
1089 <widget class="QWidget" name="fakeSpacerPlayer3" native="true"> 1179 <widget class="QWidget" name="Player3Explain" native="true">
1090 <property name="minimumSize"> 1180 <property name="minimumSize">
1091 <size> 1181 <size>
1092 <width>0</width> 1182 <width>0</width>
1093 <height>10</height> 1183 <height>10</height>
1094 </size> 1184 </size>
1095 </property> 1185 </property>
1186 <property name="maximumSize">
1187 <size>
1188 <width>150</width>
1189 <height>16777215</height>
1190 </size>
1191 </property>
1192 <layout class="QVBoxLayout" name="verticalLayout_38">
1193 <property name="spacing">
1194 <number>0</number>
1195 </property>
1196 <property name="leftMargin">
1197 <number>0</number>
1198 </property>
1199 <property name="topMargin">
1200 <number>0</number>
1201 </property>
1202 <property name="rightMargin">
1203 <number>0</number>
1204 </property>
1205 <property name="bottomMargin">
1206 <number>0</number>
1207 </property>
1208 <item>
1209 <widget class="QLabel" name="labelPlayer3Explain">
1210 <property name="alignment">
1211 <set>Qt::AlignCenter</set>
1212 </property>
1213 </widget>
1214 </item>
1215 </layout>
1096 </widget> 1216 </widget>
1097 </item> 1217 </item>
1098 <item> 1218 <item>
@@ -1296,13 +1416,43 @@
1296 </widget> 1416 </widget>
1297 </item> 1417 </item>
1298 <item> 1418 <item>
1299 <widget class="QWidget" name="fakeSpacerPlayer7" native="true"> 1419 <widget class="QWidget" name="Player7Explain" native="true">
1300 <property name="minimumSize"> 1420 <property name="minimumSize">
1301 <size> 1421 <size>
1302 <width>0</width> 1422 <width>0</width>
1303 <height>10</height> 1423 <height>10</height>
1304 </size> 1424 </size>
1305 </property> 1425 </property>
1426 <property name="maximumSize">
1427 <size>
1428 <width>150</width>
1429 <height>16777215</height>
1430 </size>
1431 </property>
1432 <layout class="QVBoxLayout" name="verticalLayout_42">
1433 <property name="spacing">
1434 <number>0</number>
1435 </property>
1436 <property name="leftMargin">
1437 <number>0</number>
1438 </property>
1439 <property name="topMargin">
1440 <number>0</number>
1441 </property>
1442 <property name="rightMargin">
1443 <number>0</number>
1444 </property>
1445 <property name="bottomMargin">
1446 <number>0</number>
1447 </property>
1448 <item>
1449 <widget class="QLabel" name="labelPlayer7Explain">
1450 <property name="alignment">
1451 <set>Qt::AlignCenter</set>
1452 </property>
1453 </widget>
1454 </item>
1455 </layout>
1306 </widget> 1456 </widget>
1307 </item> 1457 </item>
1308 <item> 1458 <item>
@@ -1463,13 +1613,43 @@
1463 </widget> 1613 </widget>
1464 </item> 1614 </item>
1465 <item> 1615 <item>
1466 <widget class="QWidget" name="fakeSpacerPlayer8" native="true"> 1616 <widget class="QWidget" name="Player8Explain" native="true">
1467 <property name="minimumSize"> 1617 <property name="minimumSize">
1468 <size> 1618 <size>
1469 <width>0</width> 1619 <width>0</width>
1470 <height>10</height> 1620 <height>10</height>
1471 </size> 1621 </size>
1472 </property> 1622 </property>
1623 <property name="maximumSize">
1624 <size>
1625 <width>150</width>
1626 <height>16777215</height>
1627 </size>
1628 </property>
1629 <layout class="QVBoxLayout" name="verticalLayout_35">
1630 <property name="spacing">
1631 <number>0</number>
1632 </property>
1633 <property name="leftMargin">
1634 <number>0</number>
1635 </property>
1636 <property name="topMargin">
1637 <number>0</number>
1638 </property>
1639 <property name="rightMargin">
1640 <number>0</number>
1641 </property>
1642 <property name="bottomMargin">
1643 <number>0</number>
1644 </property>
1645 <item>
1646 <widget class="QLabel" name="labelPlayer8Explain">
1647 <property name="alignment">
1648 <set>Qt::AlignCenter</set>
1649 </property>
1650 </widget>
1651 </item>
1652 </layout>
1473 </widget> 1653 </widget>
1474 </item> 1654 </item>
1475 <item> 1655 <item>
@@ -1634,13 +1814,43 @@
1634 </widget> 1814 </widget>
1635 </item> 1815 </item>
1636 <item> 1816 <item>
1637 <widget class="QWidget" name="fakeSpacerPlayer5" native="true"> 1817 <widget class="QWidget" name="Player5Explain" native="true">
1638 <property name="minimumSize"> 1818 <property name="minimumSize">
1639 <size> 1819 <size>
1640 <width>0</width> 1820 <width>0</width>
1641 <height>10</height> 1821 <height>10</height>
1642 </size> 1822 </size>
1643 </property> 1823 </property>
1824 <property name="maximumSize">
1825 <size>
1826 <width>150</width>
1827 <height>16777215</height>
1828 </size>
1829 </property>
1830 <layout class="QVBoxLayout" name="verticalLayout_40">
1831 <property name="spacing">
1832 <number>0</number>
1833 </property>
1834 <property name="leftMargin">
1835 <number>0</number>
1836 </property>
1837 <property name="topMargin">
1838 <number>0</number>
1839 </property>
1840 <property name="rightMargin">
1841 <number>0</number>
1842 </property>
1843 <property name="bottomMargin">
1844 <number>0</number>
1845 </property>
1846 <item>
1847 <widget class="QLabel" name="labelPlayer5Explain">
1848 <property name="alignment">
1849 <set>Qt::AlignCenter</set>
1850 </property>
1851 </widget>
1852 </item>
1853 </layout>
1644 </widget> 1854 </widget>
1645 </item> 1855 </item>
1646 <item> 1856 <item>
@@ -1801,13 +2011,43 @@
1801 </widget> 2011 </widget>
1802 </item> 2012 </item>
1803 <item> 2013 <item>
1804 <widget class="QWidget" name="fakeSpacerPlayer6" native="true"> 2014 <widget class="QWidget" name="Player6Explain" native="true">
1805 <property name="minimumSize"> 2015 <property name="minimumSize">
1806 <size> 2016 <size>
1807 <width>0</width> 2017 <width>0</width>
1808 <height>10</height> 2018 <height>10</height>
1809 </size> 2019 </size>
1810 </property> 2020 </property>
2021 <property name="maximumSize">
2022 <size>
2023 <width>150</width>
2024 <height>16777215</height>
2025 </size>
2026 </property>
2027 <layout class="QVBoxLayout" name="verticalLayout_41">
2028 <property name="spacing">
2029 <number>0</number>
2030 </property>
2031 <property name="leftMargin">
2032 <number>0</number>
2033 </property>
2034 <property name="topMargin">
2035 <number>0</number>
2036 </property>
2037 <property name="rightMargin">
2038 <number>0</number>
2039 </property>
2040 <property name="bottomMargin">
2041 <number>0</number>
2042 </property>
2043 <item>
2044 <widget class="QLabel" name="labelPlayer6Explain">
2045 <property name="alignment">
2046 <set>Qt::AlignCenter</set>
2047 </property>
2048 </widget>
2049 </item>
2050 </layout>
1811 </widget> 2051 </widget>
1812 </item> 2052 </item>
1813 <item> 2053 <item>
@@ -2395,7 +2635,7 @@
2395 <item alignment="Qt::AlignBottom"> 2635 <item alignment="Qt::AlignBottom">
2396 <widget class="QDialogButtonBox" name="buttonBox"> 2636 <widget class="QDialogButtonBox" name="buttonBox">
2397 <property name="enabled"> 2637 <property name="enabled">
2398 <bool>false</bool> 2638 <bool>true</bool>
2399 </property> 2639 </property>
2400 <property name="standardButtons"> 2640 <property name="standardButtons">
2401 <set>QDialogButtonBox::Ok</set> 2641 <set>QDialogButtonBox::Ok</set>