Merge pull request #9133 from FearlessTobi/compat-improvements
yuzu/compatdb: Improve compatibility submission system
This commit is contained in:
		| @@ -15,12 +15,22 @@ CompatDB::CompatDB(Core::TelemetrySession& telemetry_session_, QWidget* parent) | |||||||
|     : QWizard(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), |     : QWizard(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), | ||||||
|       ui{std::make_unique<Ui::CompatDB>()}, telemetry_session{telemetry_session_} { |       ui{std::make_unique<Ui::CompatDB>()}, telemetry_session{telemetry_session_} { | ||||||
|     ui->setupUi(this); |     ui->setupUi(this); | ||||||
|     connect(ui->radioButton_Perfect, &QRadioButton::clicked, this, &CompatDB::EnableNext); |  | ||||||
|     connect(ui->radioButton_Great, &QRadioButton::clicked, this, &CompatDB::EnableNext); |     connect(ui->radioButton_GameBoot_Yes, &QRadioButton::clicked, this, &CompatDB::EnableNext); | ||||||
|     connect(ui->radioButton_Okay, &QRadioButton::clicked, this, &CompatDB::EnableNext); |     connect(ui->radioButton_GameBoot_No, &QRadioButton::clicked, this, &CompatDB::EnableNext); | ||||||
|     connect(ui->radioButton_Bad, &QRadioButton::clicked, this, &CompatDB::EnableNext); |     connect(ui->radioButton_Gameplay_Yes, &QRadioButton::clicked, this, &CompatDB::EnableNext); | ||||||
|     connect(ui->radioButton_IntroMenu, &QRadioButton::clicked, this, &CompatDB::EnableNext); |     connect(ui->radioButton_Gameplay_No, &QRadioButton::clicked, this, &CompatDB::EnableNext); | ||||||
|     connect(ui->radioButton_WontBoot, &QRadioButton::clicked, this, &CompatDB::EnableNext); |     connect(ui->radioButton_NoFreeze_Yes, &QRadioButton::clicked, this, &CompatDB::EnableNext); | ||||||
|  |     connect(ui->radioButton_NoFreeze_No, &QRadioButton::clicked, this, &CompatDB::EnableNext); | ||||||
|  |     connect(ui->radioButton_Complete_Yes, &QRadioButton::clicked, this, &CompatDB::EnableNext); | ||||||
|  |     connect(ui->radioButton_Complete_No, &QRadioButton::clicked, this, &CompatDB::EnableNext); | ||||||
|  |     connect(ui->radioButton_Graphical_Major, &QRadioButton::clicked, this, &CompatDB::EnableNext); | ||||||
|  |     connect(ui->radioButton_Graphical_Minor, &QRadioButton::clicked, this, &CompatDB::EnableNext); | ||||||
|  |     connect(ui->radioButton_Graphical_No, &QRadioButton::clicked, this, &CompatDB::EnableNext); | ||||||
|  |     connect(ui->radioButton_Audio_Major, &QRadioButton::clicked, this, &CompatDB::EnableNext); | ||||||
|  |     connect(ui->radioButton_Audio_Minor, &QRadioButton::clicked, this, &CompatDB::EnableNext); | ||||||
|  |     connect(ui->radioButton_Audio_No, &QRadioButton::clicked, this, &CompatDB::EnableNext); | ||||||
|  |  | ||||||
|     connect(button(NextButton), &QPushButton::clicked, this, &CompatDB::Submit); |     connect(button(NextButton), &QPushButton::clicked, this, &CompatDB::Submit); | ||||||
|     connect(&testcase_watcher, &QFutureWatcher<bool>::finished, this, |     connect(&testcase_watcher, &QFutureWatcher<bool>::finished, this, | ||||||
|             &CompatDB::OnTestcaseSubmitted); |             &CompatDB::OnTestcaseSubmitted); | ||||||
| @@ -30,29 +40,82 @@ CompatDB::~CompatDB() = default; | |||||||
|  |  | ||||||
| enum class CompatDBPage { | enum class CompatDBPage { | ||||||
|     Intro = 0, |     Intro = 0, | ||||||
|     Selection = 1, |     GameBoot = 1, | ||||||
|     Final = 2, |     GamePlay = 2, | ||||||
|  |     Freeze = 3, | ||||||
|  |     Completion = 4, | ||||||
|  |     Graphical = 5, | ||||||
|  |     Audio = 6, | ||||||
|  |     Final = 7, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| void CompatDB::Submit() { | void CompatDB::Submit() { | ||||||
|     QButtonGroup* compatibility = new QButtonGroup(this); |     QButtonGroup* compatibility_GameBoot = new QButtonGroup(this); | ||||||
|     compatibility->addButton(ui->radioButton_Perfect, 0); |     compatibility_GameBoot->addButton(ui->radioButton_GameBoot_Yes, 0); | ||||||
|     compatibility->addButton(ui->radioButton_Great, 1); |     compatibility_GameBoot->addButton(ui->radioButton_GameBoot_No, 1); | ||||||
|     compatibility->addButton(ui->radioButton_Okay, 2); |  | ||||||
|     compatibility->addButton(ui->radioButton_Bad, 3); |     QButtonGroup* compatibility_Gameplay = new QButtonGroup(this); | ||||||
|     compatibility->addButton(ui->radioButton_IntroMenu, 4); |     compatibility_Gameplay->addButton(ui->radioButton_Gameplay_Yes, 0); | ||||||
|     compatibility->addButton(ui->radioButton_WontBoot, 5); |     compatibility_Gameplay->addButton(ui->radioButton_Gameplay_No, 1); | ||||||
|  |  | ||||||
|  |     QButtonGroup* compatibility_NoFreeze = new QButtonGroup(this); | ||||||
|  |     compatibility_NoFreeze->addButton(ui->radioButton_NoFreeze_Yes, 0); | ||||||
|  |     compatibility_NoFreeze->addButton(ui->radioButton_NoFreeze_No, 1); | ||||||
|  |  | ||||||
|  |     QButtonGroup* compatibility_Complete = new QButtonGroup(this); | ||||||
|  |     compatibility_Complete->addButton(ui->radioButton_Complete_Yes, 0); | ||||||
|  |     compatibility_Complete->addButton(ui->radioButton_Complete_No, 1); | ||||||
|  |  | ||||||
|  |     QButtonGroup* compatibility_Graphical = new QButtonGroup(this); | ||||||
|  |     compatibility_Graphical->addButton(ui->radioButton_Graphical_Major, 0); | ||||||
|  |     compatibility_Graphical->addButton(ui->radioButton_Graphical_Minor, 1); | ||||||
|  |     compatibility_Graphical->addButton(ui->radioButton_Graphical_No, 2); | ||||||
|  |  | ||||||
|  |     QButtonGroup* compatibility_Audio = new QButtonGroup(this); | ||||||
|  |     compatibility_Audio->addButton(ui->radioButton_Audio_Major, 0); | ||||||
|  |     compatibility_Graphical->addButton(ui->radioButton_Audio_Minor, 1); | ||||||
|  |     compatibility_Audio->addButton(ui->radioButton_Audio_No, 2); | ||||||
|  |  | ||||||
|  |     const int compatiblity = static_cast<int>(CalculateCompatibility()); | ||||||
|  |  | ||||||
|     switch ((static_cast<CompatDBPage>(currentId()))) { |     switch ((static_cast<CompatDBPage>(currentId()))) { | ||||||
|     case CompatDBPage::Selection: |     case CompatDBPage::Intro: | ||||||
|         if (compatibility->checkedId() == -1) { |         break; | ||||||
|  |     case CompatDBPage::GameBoot: | ||||||
|  |         if (compatibility_GameBoot->checkedId() == -1) { | ||||||
|  |             button(NextButton)->setEnabled(false); | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  |     case CompatDBPage::GamePlay: | ||||||
|  |         if (compatibility_Gameplay->checkedId() == -1) { | ||||||
|  |             button(NextButton)->setEnabled(false); | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  |     case CompatDBPage::Freeze: | ||||||
|  |         if (compatibility_NoFreeze->checkedId() == -1) { | ||||||
|  |             button(NextButton)->setEnabled(false); | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  |     case CompatDBPage::Completion: | ||||||
|  |         if (compatibility_Complete->checkedId() == -1) { | ||||||
|  |             button(NextButton)->setEnabled(false); | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  |     case CompatDBPage::Graphical: | ||||||
|  |         if (compatibility_Graphical->checkedId() == -1) { | ||||||
|  |             button(NextButton)->setEnabled(false); | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  |     case CompatDBPage::Audio: | ||||||
|  |         if (compatibility_Audio->checkedId() == -1) { | ||||||
|             button(NextButton)->setEnabled(false); |             button(NextButton)->setEnabled(false); | ||||||
|         } |         } | ||||||
|         break; |         break; | ||||||
|     case CompatDBPage::Final: |     case CompatDBPage::Final: | ||||||
|         back(); |         back(); | ||||||
|         LOG_DEBUG(Frontend, "Compatibility Rating: {}", compatibility->checkedId()); |         LOG_INFO(Frontend, "Compatibility Rating: {}", compatiblity); | ||||||
|         telemetry_session.AddField(Common::Telemetry::FieldType::UserFeedback, "Compatibility", |         telemetry_session.AddField(Common::Telemetry::FieldType::UserFeedback, "Compatibility", | ||||||
|                                    compatibility->checkedId()); |                                    compatiblity); | ||||||
|  |  | ||||||
|         button(NextButton)->setEnabled(false); |         button(NextButton)->setEnabled(false); | ||||||
|         button(NextButton)->setText(tr("Submitting")); |         button(NextButton)->setText(tr("Submitting")); | ||||||
| @@ -66,6 +129,66 @@ void CompatDB::Submit() { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int CompatDB::nextId() const { | ||||||
|  |     switch ((static_cast<CompatDBPage>(currentId()))) { | ||||||
|  |     case CompatDBPage::Intro: | ||||||
|  |         return static_cast<int>(CompatDBPage::GameBoot); | ||||||
|  |     case CompatDBPage::GameBoot: | ||||||
|  |         if (ui->radioButton_GameBoot_No->isChecked()) { | ||||||
|  |             return static_cast<int>(CompatDBPage::Final); | ||||||
|  |         } | ||||||
|  |         return static_cast<int>(CompatDBPage::GamePlay); | ||||||
|  |     case CompatDBPage::GamePlay: | ||||||
|  |         if (ui->radioButton_Gameplay_No->isChecked()) { | ||||||
|  |             return static_cast<int>(CompatDBPage::Final); | ||||||
|  |         } | ||||||
|  |         return static_cast<int>(CompatDBPage::Freeze); | ||||||
|  |     case CompatDBPage::Freeze: | ||||||
|  |         if (ui->radioButton_NoFreeze_No->isChecked()) { | ||||||
|  |             return static_cast<int>(CompatDBPage::Final); | ||||||
|  |         } | ||||||
|  |         return static_cast<int>(CompatDBPage::Completion); | ||||||
|  |     case CompatDBPage::Completion: | ||||||
|  |         if (ui->radioButton_Complete_No->isChecked()) { | ||||||
|  |             return static_cast<int>(CompatDBPage::Final); | ||||||
|  |         } | ||||||
|  |         return static_cast<int>(CompatDBPage::Graphical); | ||||||
|  |     case CompatDBPage::Graphical: | ||||||
|  |         return static_cast<int>(CompatDBPage::Audio); | ||||||
|  |     case CompatDBPage::Audio: | ||||||
|  |         return static_cast<int>(CompatDBPage::Final); | ||||||
|  |     case CompatDBPage::Final: | ||||||
|  |         return -1; | ||||||
|  |     default: | ||||||
|  |         LOG_ERROR(Frontend, "Unexpected page: {}", currentId()); | ||||||
|  |         return static_cast<int>(CompatDBPage::Intro); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | CompatibilityStatus CompatDB::CalculateCompatibility() const { | ||||||
|  |     if (ui->radioButton_GameBoot_No->isChecked()) { | ||||||
|  |         return CompatibilityStatus::WontBoot; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (ui->radioButton_Gameplay_No->isChecked()) { | ||||||
|  |         return CompatibilityStatus::IntroMenu; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (ui->radioButton_NoFreeze_No->isChecked() || ui->radioButton_Complete_No->isChecked()) { | ||||||
|  |         return CompatibilityStatus::Ingame; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (ui->radioButton_Graphical_Major->isChecked() || ui->radioButton_Audio_Major->isChecked()) { | ||||||
|  |         return CompatibilityStatus::Ingame; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (ui->radioButton_Graphical_Minor->isChecked() || ui->radioButton_Audio_Minor->isChecked()) { | ||||||
|  |         return CompatibilityStatus::Playable; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return CompatibilityStatus::Perfect; | ||||||
|  | } | ||||||
|  |  | ||||||
| void CompatDB::OnTestcaseSubmitted() { | void CompatDB::OnTestcaseSubmitted() { | ||||||
|     if (!testcase_watcher.result()) { |     if (!testcase_watcher.result()) { | ||||||
|         QMessageBox::critical(this, tr("Communication error"), |         QMessageBox::critical(this, tr("Communication error"), | ||||||
|   | |||||||
| @@ -12,12 +12,22 @@ namespace Ui { | |||||||
| class CompatDB; | class CompatDB; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | enum class CompatibilityStatus { | ||||||
|  |     Perfect = 0, | ||||||
|  |     Playable = 1, | ||||||
|  |     // Unused: Okay = 2, | ||||||
|  |     Ingame = 3, | ||||||
|  |     IntroMenu = 4, | ||||||
|  |     WontBoot = 5, | ||||||
|  | }; | ||||||
|  |  | ||||||
| class CompatDB : public QWizard { | class CompatDB : public QWizard { | ||||||
|     Q_OBJECT |     Q_OBJECT | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit CompatDB(Core::TelemetrySession& telemetry_session_, QWidget* parent = nullptr); |     explicit CompatDB(Core::TelemetrySession& telemetry_session_, QWidget* parent = nullptr); | ||||||
|     ~CompatDB(); |     ~CompatDB(); | ||||||
|  |     int nextId() const override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     QFutureWatcher<bool> testcase_watcher; |     QFutureWatcher<bool> testcase_watcher; | ||||||
| @@ -25,6 +35,7 @@ private: | |||||||
|     std::unique_ptr<Ui::CompatDB> ui; |     std::unique_ptr<Ui::CompatDB> ui; | ||||||
|  |  | ||||||
|     void Submit(); |     void Submit(); | ||||||
|  |     CompatibilityStatus CalculateCompatibility() const; | ||||||
|     void OnTestcaseSubmitted(); |     void OnTestcaseSubmitted(); | ||||||
|     void EnableNext(); |     void EnableNext(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -58,128 +58,23 @@ | |||||||
|     </item> |     </item> | ||||||
|    </layout> |    </layout> | ||||||
|   </widget> |   </widget> | ||||||
|   <widget class="QWizardPage" name="wizard_Report"> |   <widget class="QWizardPage" name="wizard_GameBoot"> | ||||||
|    <property name="title"> |    <property name="title"> | ||||||
|     <string>Report Game Compatibility</string> |     <string>Report Game Compatibility</string> | ||||||
|    </property> |    </property> | ||||||
|    <attribute name="pageId"> |    <attribute name="pageId"> | ||||||
|     <string notr="true">1</string> |     <string notr="true">1</string> | ||||||
|    </attribute> |    </attribute> | ||||||
|    <layout class="QFormLayout" name="formLayout"> |    <layout class="QFormLayout" name="formLayout1"> | ||||||
|     <item row="2" column="0"> |  | ||||||
|      <widget class="QRadioButton" name="radioButton_Perfect"> |  | ||||||
|       <property name="text"> |  | ||||||
|        <string>Perfect</string> |  | ||||||
|       </property> |  | ||||||
|      </widget> |  | ||||||
|     </item> |  | ||||||
|     <item row="2" column="1"> |  | ||||||
|      <widget class="QLabel" name="lbl_Perfect"> |  | ||||||
|       <property name="text"> |  | ||||||
|        <string><html><head/><body><p>Game functions flawlessly with no audio or graphical glitches.</p></body></html></string> |  | ||||||
|       </property> |  | ||||||
|       <property name="wordWrap"> |  | ||||||
|        <bool>true</bool> |  | ||||||
|       </property> |  | ||||||
|      </widget> |  | ||||||
|     </item> |  | ||||||
|     <item row="4" column="0"> |  | ||||||
|      <widget class="QRadioButton" name="radioButton_Great"> |  | ||||||
|       <property name="text"> |  | ||||||
|        <string>Great</string> |  | ||||||
|       </property> |  | ||||||
|      </widget> |  | ||||||
|     </item> |  | ||||||
|     <item row="4" column="1"> |  | ||||||
|      <widget class="QLabel" name="lbl_Great"> |  | ||||||
|       <property name="text"> |  | ||||||
|        <string><html><head/><body><p>Game functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds.</p></body></html></string> |  | ||||||
|       </property> |  | ||||||
|       <property name="wordWrap"> |  | ||||||
|        <bool>true</bool> |  | ||||||
|       </property> |  | ||||||
|      </widget> |  | ||||||
|     </item> |  | ||||||
|     <item row="5" column="0"> |  | ||||||
|      <widget class="QRadioButton" name="radioButton_Okay"> |  | ||||||
|       <property name="text"> |  | ||||||
|        <string>Okay</string> |  | ||||||
|       </property> |  | ||||||
|      </widget> |  | ||||||
|     </item> |  | ||||||
|     <item row="5" column="1"> |  | ||||||
|      <widget class="QLabel" name="lbl_Okay"> |  | ||||||
|       <property name="text"> |  | ||||||
|        <string><html><head/><body><p>Game functions with major graphical or audio glitches, but game is playable from start to finish with workarounds.</p></body></html></string> |  | ||||||
|       </property> |  | ||||||
|       <property name="wordWrap"> |  | ||||||
|        <bool>true</bool> |  | ||||||
|       </property> |  | ||||||
|      </widget> |  | ||||||
|     </item> |  | ||||||
|     <item row="6" column="0"> |  | ||||||
|      <widget class="QRadioButton" name="radioButton_Bad"> |  | ||||||
|       <property name="text"> |  | ||||||
|        <string>Bad</string> |  | ||||||
|       </property> |  | ||||||
|      </widget> |  | ||||||
|     </item> |  | ||||||
|     <item row="6" column="1"> |  | ||||||
|      <widget class="QLabel" name="lbl_Bad"> |  | ||||||
|       <property name="text"> |  | ||||||
|        <string><html><head/><body><p>Game functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds.</p></body></html></string> |  | ||||||
|       </property> |  | ||||||
|       <property name="wordWrap"> |  | ||||||
|        <bool>true</bool> |  | ||||||
|       </property> |  | ||||||
|      </widget> |  | ||||||
|     </item> |  | ||||||
|     <item row="7" column="0"> |  | ||||||
|      <widget class="QRadioButton" name="radioButton_IntroMenu"> |  | ||||||
|       <property name="text"> |  | ||||||
|        <string>Intro/Menu</string> |  | ||||||
|       </property> |  | ||||||
|      </widget> |  | ||||||
|     </item> |  | ||||||
|     <item row="7" column="1"> |  | ||||||
|      <widget class="QLabel" name="lbl_IntroMenu"> |  | ||||||
|       <property name="text"> |  | ||||||
|        <string><html><head/><body><p>Game is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen.</p></body></html></string> |  | ||||||
|       </property> |  | ||||||
|       <property name="wordWrap"> |  | ||||||
|        <bool>true</bool> |  | ||||||
|       </property> |  | ||||||
|      </widget> |  | ||||||
|     </item> |  | ||||||
|     <item row="8" column="0"> |  | ||||||
|      <widget class="QRadioButton" name="radioButton_WontBoot"> |  | ||||||
|       <property name="text"> |  | ||||||
|        <string>Won't Boot</string> |  | ||||||
|       </property> |  | ||||||
|       <property name="checkable"> |  | ||||||
|        <bool>true</bool> |  | ||||||
|       </property> |  | ||||||
|       <property name="checked"> |  | ||||||
|        <bool>false</bool> |  | ||||||
|       </property> |  | ||||||
|      </widget> |  | ||||||
|     </item> |  | ||||||
|     <item row="8" column="1"> |  | ||||||
|      <widget class="QLabel" name="lbl_WontBoot"> |  | ||||||
|       <property name="text"> |  | ||||||
|        <string><html><head/><body><p>The game crashes when attempting to startup.</p></body></html></string> |  | ||||||
|       </property> |  | ||||||
|      </widget> |  | ||||||
|     </item> |  | ||||||
|     <item row="0" column="0" colspan="2"> |     <item row="0" column="0" colspan="2"> | ||||||
|      <widget class="QLabel" name="lbl_Independent"> |      <widget class="QLabel" name="lbl_Independent1"> | ||||||
|       <property name="font"> |       <property name="font"> | ||||||
|        <font> |        <font> | ||||||
|         <pointsize>10</pointsize> |         <pointsize>10</pointsize> | ||||||
|        </font> |        </font> | ||||||
|       </property> |       </property> | ||||||
|       <property name="text"> |       <property name="text"> | ||||||
|        <string><html><head/><body><p>Independent of speed or performance, how well does this game play from start to finish on this version of yuzu?</p></body></html></string> |        <string><html><head/><body><p>Does the game boot?</p></body></html></string> | ||||||
|       </property> |       </property> | ||||||
|       <property name="wordWrap"> |       <property name="wordWrap"> | ||||||
|        <bool>true</bool> |        <bool>true</bool> | ||||||
| @@ -187,7 +82,295 @@ | |||||||
|      </widget> |      </widget> | ||||||
|     </item> |     </item> | ||||||
|     <item row="1" column="0" colspan="2"> |     <item row="1" column="0" colspan="2"> | ||||||
|      <spacer name="verticalSpacer"> |      <spacer name="verticalSpacer1"> | ||||||
|  |       <property name="orientation"> | ||||||
|  |        <enum>Qt::Vertical</enum> | ||||||
|  |       </property> | ||||||
|  |       <property name="sizeHint" stdset="0"> | ||||||
|  |        <size> | ||||||
|  |         <width>20</width> | ||||||
|  |         <height>0</height> | ||||||
|  |        </size> | ||||||
|  |       </property> | ||||||
|  |      </spacer> | ||||||
|  |     </item> | ||||||
|  |     <item row="2" column="0"> | ||||||
|  |      <widget class="QRadioButton" name="radioButton_GameBoot_Yes"> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string>Yes   The game starts to output video or audio</string> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="4" column="0"> | ||||||
|  |      <widget class="QRadioButton" name="radioButton_GameBoot_No"> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string>No    The game doesn't get past the "Launching..." screen</string> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |    </layout> | ||||||
|  |   </widget> | ||||||
|  |   <widget class="QWizardPage" name="wizard_GamePlay"> | ||||||
|  |    <property name="title"> | ||||||
|  |     <string>Report Game Compatibility</string> | ||||||
|  |    </property> | ||||||
|  |    <attribute name="pageId"> | ||||||
|  |     <string notr="true">2</string> | ||||||
|  |    </attribute> | ||||||
|  |    <layout class="QFormLayout" name="formLayout2"> | ||||||
|  |     <item row="2" column="0"> | ||||||
|  |      <widget class="QRadioButton" name="radioButton_Gameplay_Yes"> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string>Yes   The game gets past the intro/menu and into gameplay</string> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="4" column="0"> | ||||||
|  |      <widget class="QRadioButton" name="radioButton_Gameplay_No"> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string>No    The game crashes or freezes while loading or using the menu</string> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="0" column="0" colspan="2"> | ||||||
|  |      <widget class="QLabel" name="lbl_Independent2"> | ||||||
|  |       <property name="font"> | ||||||
|  |        <font> | ||||||
|  |         <pointsize>10</pointsize> | ||||||
|  |        </font> | ||||||
|  |       </property> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string><html><head/><body><p>Does the game reach gameplay?</p></body></html></string> | ||||||
|  |       </property> | ||||||
|  |       <property name="wordWrap"> | ||||||
|  |        <bool>true</bool> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="1" column="0" colspan="2"> | ||||||
|  |      <spacer name="verticalSpacer2"> | ||||||
|  |       <property name="orientation"> | ||||||
|  |        <enum>Qt::Vertical</enum> | ||||||
|  |       </property> | ||||||
|  |       <property name="sizeHint" stdset="0"> | ||||||
|  |        <size> | ||||||
|  |         <width>20</width> | ||||||
|  |         <height>0</height> | ||||||
|  |        </size> | ||||||
|  |       </property> | ||||||
|  |      </spacer> | ||||||
|  |     </item> | ||||||
|  |    </layout> | ||||||
|  |   </widget> | ||||||
|  |   <widget class="QWizardPage" name="wizard_NoFreeze"> | ||||||
|  |    <property name="title"> | ||||||
|  |     <string>Report Game Compatibility</string> | ||||||
|  |    </property> | ||||||
|  |    <attribute name="pageId"> | ||||||
|  |     <string notr="true">3</string> | ||||||
|  |    </attribute> | ||||||
|  |    <layout class="QFormLayout" name="formLayout3"> | ||||||
|  |     <item row="2" column="0"> | ||||||
|  |      <widget class="QRadioButton" name="radioButton_NoFreeze_Yes"> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string>Yes   The game works without crashes</string> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="4" column="0"> | ||||||
|  |      <widget class="QRadioButton" name="radioButton_NoFreeze_No"> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string>No    The game crashes or freezes during gameplay</string> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="0" column="0" colspan="2"> | ||||||
|  |      <widget class="QLabel" name="lbl_Independent3"> | ||||||
|  |       <property name="font"> | ||||||
|  |        <font> | ||||||
|  |         <pointsize>10</pointsize> | ||||||
|  |        </font> | ||||||
|  |       </property> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string><html><head/><body><p>Does the game work without crashing, freezing or locking up during gameplay?</p></body></html></string> | ||||||
|  |       </property> | ||||||
|  |       <property name="wordWrap"> | ||||||
|  |        <bool>true</bool> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="1" column="0" colspan="2"> | ||||||
|  |      <spacer name="verticalSpacer3"> | ||||||
|  |       <property name="orientation"> | ||||||
|  |        <enum>Qt::Vertical</enum> | ||||||
|  |       </property> | ||||||
|  |       <property name="sizeHint" stdset="0"> | ||||||
|  |        <size> | ||||||
|  |         <width>20</width> | ||||||
|  |         <height>0</height> | ||||||
|  |        </size> | ||||||
|  |       </property> | ||||||
|  |      </spacer> | ||||||
|  |     </item> | ||||||
|  |    </layout> | ||||||
|  |   </widget> | ||||||
|  |   <widget class="QWizardPage" name="wizard_Complete"> | ||||||
|  |    <property name="title"> | ||||||
|  |     <string>Report Game Compatibility</string> | ||||||
|  |    </property> | ||||||
|  |    <attribute name="pageId"> | ||||||
|  |     <string notr="true">4</string> | ||||||
|  |    </attribute> | ||||||
|  |    <layout class="QFormLayout" name="formLayout4"> | ||||||
|  |     <item row="2" column="0"> | ||||||
|  |      <widget class="QRadioButton" name="radioButton_Complete_Yes"> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string>Yes   The game can be finished without any workarounds</string> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="4" column="0"> | ||||||
|  |      <widget class="QRadioButton" name="radioButton_Complete_No"> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string>No    The game can't progress past a certain area</string> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="0" column="0" colspan="2"> | ||||||
|  |      <widget class="QLabel" name="lbl_Independent4"> | ||||||
|  |       <property name="font"> | ||||||
|  |        <font> | ||||||
|  |         <pointsize>10</pointsize> | ||||||
|  |        </font> | ||||||
|  |       </property> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string><html><head/><body><p>Is the game completely playable from start to finish?</p></body></html></string> | ||||||
|  |       </property> | ||||||
|  |       <property name="wordWrap"> | ||||||
|  |        <bool>true</bool> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="1" column="0" colspan="2"> | ||||||
|  |      <spacer name="verticalSpacer4"> | ||||||
|  |       <property name="orientation"> | ||||||
|  |        <enum>Qt::Vertical</enum> | ||||||
|  |       </property> | ||||||
|  |       <property name="sizeHint" stdset="0"> | ||||||
|  |        <size> | ||||||
|  |         <width>20</width> | ||||||
|  |         <height>0</height> | ||||||
|  |        </size> | ||||||
|  |       </property> | ||||||
|  |      </spacer> | ||||||
|  |     </item> | ||||||
|  |    </layout> | ||||||
|  |   </widget> | ||||||
|  |   <widget class="QWizardPage" name="wizard_Graphical"> | ||||||
|  |    <property name="title"> | ||||||
|  |     <string>Report Game Compatibility</string> | ||||||
|  |    </property> | ||||||
|  |    <attribute name="pageId"> | ||||||
|  |     <string notr="true">5</string> | ||||||
|  |    </attribute> | ||||||
|  |    <layout class="QFormLayout" name="formLayout5"> | ||||||
|  |     <item row="2" column="0"> | ||||||
|  |      <widget class="QRadioButton" name="radioButton_Graphical_Major"> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string>Major   The game has major graphical errors</string> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="4" column="0"> | ||||||
|  |      <widget class="QRadioButton" name="radioButton_Graphical_Minor"> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string>Minor   The game has minor graphical errors</string> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="6" column="0"> | ||||||
|  |      <widget class="QRadioButton" name="radioButton_Graphical_No"> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string>None     Everything is rendered as it looks on the Nintendo Switch</string> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="0" column="0" colspan="2"> | ||||||
|  |      <widget class="QLabel" name="lbl_Independent5"> | ||||||
|  |       <property name="font"> | ||||||
|  |        <font> | ||||||
|  |         <pointsize>10</pointsize> | ||||||
|  |        </font> | ||||||
|  |       </property> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string><html><head/><body><p>Does the game have any graphical glitches?</p></body></html></string> | ||||||
|  |       </property> | ||||||
|  |       <property name="wordWrap"> | ||||||
|  |        <bool>true</bool> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="1" column="0" colspan="2"> | ||||||
|  |      <spacer name="verticalSpacer5"> | ||||||
|  |       <property name="orientation"> | ||||||
|  |        <enum>Qt::Vertical</enum> | ||||||
|  |       </property> | ||||||
|  |       <property name="sizeHint" stdset="0"> | ||||||
|  |        <size> | ||||||
|  |         <width>20</width> | ||||||
|  |         <height>0</height> | ||||||
|  |        </size> | ||||||
|  |       </property> | ||||||
|  |      </spacer> | ||||||
|  |     </item> | ||||||
|  |    </layout> | ||||||
|  |   </widget> | ||||||
|  |   <widget class="QWizardPage" name="wizard_Audio"> | ||||||
|  |    <property name="title"> | ||||||
|  |     <string>Report Game Compatibility</string> | ||||||
|  |    </property> | ||||||
|  |    <attribute name="pageId"> | ||||||
|  |     <string notr="true">6</string> | ||||||
|  |    </attribute> | ||||||
|  |    <layout class="QFormLayout" name="formLayout6"> | ||||||
|  |     <item row="2" column="0"> | ||||||
|  |      <widget class="QRadioButton" name="radioButton_Audio_Major"> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string>Major   The game has major audio errors</string> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="4" column="0"> | ||||||
|  |      <widget class="QRadioButton" name="radioButton_Audio_Minor"> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string>Minor   The game has minor audio errors</string> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="6" column="0"> | ||||||
|  |      <widget class="QRadioButton" name="radioButton_Audio_No"> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string>None     Audio is played perfectly</string> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="0" column="0" colspan="2"> | ||||||
|  |      <widget class="QLabel" name="lbl_Independent6"> | ||||||
|  |       <property name="font"> | ||||||
|  |        <font> | ||||||
|  |         <pointsize>10</pointsize> | ||||||
|  |        </font> | ||||||
|  |       </property> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string><html><head/><body><p>Does the game have any audio glitches / missing effects?</p></body></html></string> | ||||||
|  |       </property> | ||||||
|  |       <property name="wordWrap"> | ||||||
|  |        <bool>true</bool> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="1" column="0" colspan="2"> | ||||||
|  |      <spacer name="verticalSpacer6"> | ||||||
|       <property name="orientation"> |       <property name="orientation"> | ||||||
|        <enum>Qt::Vertical</enum> |        <enum>Qt::Vertical</enum> | ||||||
|       </property> |       </property> | ||||||
| @@ -206,7 +389,7 @@ | |||||||
|     <string>Thank you for your submission!</string> |     <string>Thank you for your submission!</string> | ||||||
|    </property> |    </property> | ||||||
|    <attribute name="pageId"> |    <attribute name="pageId"> | ||||||
|     <string notr="true">2</string> |     <string notr="true">7</string> | ||||||
|    </attribute> |    </attribute> | ||||||
|   </widget> |   </widget> | ||||||
|  </widget> |  </widget> | ||||||
|   | |||||||
| @@ -145,12 +145,14 @@ public: | |||||||
|             const char* tooltip; |             const char* tooltip; | ||||||
|         }; |         }; | ||||||
|         // clang-format off |         // clang-format off | ||||||
|  |         const auto ingame_status = | ||||||
|  |                        CompatStatus{QStringLiteral("#f2d624"), QT_TR_NOOP("Ingame"),     QT_TR_NOOP("Game starts, but crashes or major glitches prevent it from being completed.")}; | ||||||
|         static const std::map<QString, CompatStatus> status_data = { |         static const std::map<QString, CompatStatus> status_data = { | ||||||
|             {QStringLiteral("0"),  {QStringLiteral("#5c93ed"), QT_TR_NOOP("Perfect"),    QT_TR_NOOP("Game functions flawless with no audio or graphical glitches, all tested functionality works as intended without\nany workarounds needed.")}}, |             {QStringLiteral("0"),  {QStringLiteral("#5c93ed"), QT_TR_NOOP("Perfect"),    QT_TR_NOOP("Game can be played without issues.")}}, | ||||||
|             {QStringLiteral("1"),  {QStringLiteral("#47d35c"), QT_TR_NOOP("Great"),      QT_TR_NOOP("Game functions with minor graphical or audio glitches and is playable from start to finish. May require some\nworkarounds.")}}, |             {QStringLiteral("1"),  {QStringLiteral("#47d35c"), QT_TR_NOOP("Playable"),   QT_TR_NOOP("Game functions with minor graphical or audio glitches and is playable from start to finish.")}}, | ||||||
|             {QStringLiteral("2"),  {QStringLiteral("#94b242"), QT_TR_NOOP("Okay"),       QT_TR_NOOP("Game functions with major graphical or audio glitches, but game is playable from start to finish with\nworkarounds.")}}, |             {QStringLiteral("2"),  ingame_status}, | ||||||
|             {QStringLiteral("3"),  {QStringLiteral("#f2d624"), QT_TR_NOOP("Bad"),        QT_TR_NOOP("Game functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches\neven with workarounds.")}}, |             {QStringLiteral("3"),  ingame_status}, // Fallback for the removed "Okay" category | ||||||
|             {QStringLiteral("4"),  {QStringLiteral("#FF0000"), QT_TR_NOOP("Intro/Menu"), QT_TR_NOOP("Game is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start\nScreen.")}}, |             {QStringLiteral("4"),  {QStringLiteral("#FF0000"), QT_TR_NOOP("Intro/Menu"), QT_TR_NOOP("Game loads, but is unable to progress past the Start Screen.")}}, | ||||||
|             {QStringLiteral("5"),  {QStringLiteral("#828282"), QT_TR_NOOP("Won't Boot"), QT_TR_NOOP("The game crashes when attempting to startup.")}}, |             {QStringLiteral("5"),  {QStringLiteral("#828282"), QT_TR_NOOP("Won't Boot"), QT_TR_NOOP("The game crashes when attempting to startup.")}}, | ||||||
|             {QStringLiteral("99"), {QStringLiteral("#000000"), QT_TR_NOOP("Not Tested"), QT_TR_NOOP("The game has not yet been tested.")}}, |             {QStringLiteral("99"), {QStringLiteral("#000000"), QT_TR_NOOP("Not Tested"), QT_TR_NOOP("The game has not yet been tested.")}}, | ||||||
|         }; |         }; | ||||||
|   | |||||||
| @@ -2817,6 +2817,20 @@ void GMainWindow::ErrorDisplayDisplayError(QString error_code, QString error_tex | |||||||
| } | } | ||||||
|  |  | ||||||
| void GMainWindow::OnMenuReportCompatibility() { | void GMainWindow::OnMenuReportCompatibility() { | ||||||
|  |     const auto& caps = Common::GetCPUCaps(); | ||||||
|  |     const bool has_fma = caps.fma || caps.fma4; | ||||||
|  |     const auto processor_count = std::thread::hardware_concurrency(); | ||||||
|  |     const bool has_4threads = processor_count == 0 || processor_count >= 4; | ||||||
|  |     const bool has_8gb_ram = Common::GetMemInfo().TotalPhysicalMemory >= 8_GiB; | ||||||
|  |     const bool has_broken_vulkan = UISettings::values.has_broken_vulkan; | ||||||
|  |  | ||||||
|  |     if (!has_fma || !has_4threads || !has_8gb_ram || has_broken_vulkan) { | ||||||
|  |         QMessageBox::critical(this, tr("Hardware requirements not met"), | ||||||
|  |                               tr("Your system does not meet the recommended hardware requirements. " | ||||||
|  |                                  "Compatibility reporting has been disabled.")); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (!Settings::values.yuzu_token.GetValue().empty() && |     if (!Settings::values.yuzu_token.GetValue().empty() && | ||||||
|         !Settings::values.yuzu_username.GetValue().empty()) { |         !Settings::values.yuzu_username.GetValue().empty()) { | ||||||
|         CompatDB compatdb{system->TelemetrySession(), this}; |         CompatDB compatdb{system->TelemetrySession(), this}; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user