compatdb.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. // SPDX-FileCopyrightText: 2017 Citra Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include <QButtonGroup>
  4. #include <QMessageBox>
  5. #include <QPushButton>
  6. #include <QtConcurrent/qtconcurrentrun.h>
  7. #include "common/logging/log.h"
  8. #include "common/telemetry.h"
  9. #include "core/telemetry_session.h"
  10. #include "ui_compatdb.h"
  11. #include "yuzu/compatdb.h"
  12. CompatDB::CompatDB(Core::TelemetrySession& telemetry_session_, QWidget* parent)
  13. : QWizard(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint),
  14. ui{std::make_unique<Ui::CompatDB>()}, telemetry_session{telemetry_session_} {
  15. ui->setupUi(this);
  16. connect(ui->radioButton_GameBoot_Yes, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  17. connect(ui->radioButton_GameBoot_No, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  18. connect(ui->radioButton_Gameplay_Yes, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  19. connect(ui->radioButton_Gameplay_No, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  20. connect(ui->radioButton_NoFreeze_Yes, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  21. connect(ui->radioButton_NoFreeze_No, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  22. connect(ui->radioButton_Complete_Yes, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  23. connect(ui->radioButton_Complete_No, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  24. connect(ui->radioButton_Graphical_Major, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  25. connect(ui->radioButton_Graphical_Minor, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  26. connect(ui->radioButton_Graphical_No, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  27. connect(ui->radioButton_Audio_Major, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  28. connect(ui->radioButton_Audio_Minor, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  29. connect(ui->radioButton_Audio_No, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  30. connect(button(NextButton), &QPushButton::clicked, this, &CompatDB::Submit);
  31. connect(&testcase_watcher, &QFutureWatcher<bool>::finished, this,
  32. &CompatDB::OnTestcaseSubmitted);
  33. }
  34. CompatDB::~CompatDB() = default;
  35. enum class CompatDBPage {
  36. Intro = 0,
  37. GameBoot = 1,
  38. GamePlay = 2,
  39. Freeze = 3,
  40. Completion = 4,
  41. Graphical = 5,
  42. Audio = 6,
  43. Final = 7,
  44. };
  45. void CompatDB::Submit() {
  46. QButtonGroup* compatibility_GameBoot = new QButtonGroup(this);
  47. compatibility_GameBoot->addButton(ui->radioButton_GameBoot_Yes, 0);
  48. compatibility_GameBoot->addButton(ui->radioButton_GameBoot_No, 1);
  49. QButtonGroup* compatibility_Gameplay = new QButtonGroup(this);
  50. compatibility_Gameplay->addButton(ui->radioButton_Gameplay_Yes, 0);
  51. compatibility_Gameplay->addButton(ui->radioButton_Gameplay_No, 1);
  52. QButtonGroup* compatibility_NoFreeze = new QButtonGroup(this);
  53. compatibility_NoFreeze->addButton(ui->radioButton_NoFreeze_Yes, 0);
  54. compatibility_NoFreeze->addButton(ui->radioButton_NoFreeze_No, 1);
  55. QButtonGroup* compatibility_Complete = new QButtonGroup(this);
  56. compatibility_Complete->addButton(ui->radioButton_Complete_Yes, 0);
  57. compatibility_Complete->addButton(ui->radioButton_Complete_No, 1);
  58. QButtonGroup* compatibility_Graphical = new QButtonGroup(this);
  59. compatibility_Graphical->addButton(ui->radioButton_Graphical_Major, 0);
  60. compatibility_Graphical->addButton(ui->radioButton_Graphical_Minor, 1);
  61. compatibility_Graphical->addButton(ui->radioButton_Graphical_No, 2);
  62. QButtonGroup* compatibility_Audio = new QButtonGroup(this);
  63. compatibility_Audio->addButton(ui->radioButton_Audio_Major, 0);
  64. compatibility_Graphical->addButton(ui->radioButton_Audio_Minor, 1);
  65. compatibility_Audio->addButton(ui->radioButton_Audio_No, 2);
  66. const int compatiblity = static_cast<int>(CalculateCompatibility());
  67. switch ((static_cast<CompatDBPage>(currentId()))) {
  68. case CompatDBPage::Intro:
  69. break;
  70. case CompatDBPage::GameBoot:
  71. if (compatibility_GameBoot->checkedId() == -1) {
  72. button(NextButton)->setEnabled(false);
  73. }
  74. break;
  75. case CompatDBPage::GamePlay:
  76. if (compatibility_Gameplay->checkedId() == -1) {
  77. button(NextButton)->setEnabled(false);
  78. }
  79. break;
  80. case CompatDBPage::Freeze:
  81. if (compatibility_NoFreeze->checkedId() == -1) {
  82. button(NextButton)->setEnabled(false);
  83. }
  84. break;
  85. case CompatDBPage::Completion:
  86. if (compatibility_Complete->checkedId() == -1) {
  87. button(NextButton)->setEnabled(false);
  88. }
  89. break;
  90. case CompatDBPage::Graphical:
  91. if (compatibility_Graphical->checkedId() == -1) {
  92. button(NextButton)->setEnabled(false);
  93. }
  94. break;
  95. case CompatDBPage::Audio:
  96. if (compatibility_Audio->checkedId() == -1) {
  97. button(NextButton)->setEnabled(false);
  98. }
  99. break;
  100. case CompatDBPage::Final:
  101. back();
  102. LOG_INFO(Frontend, "Compatibility Rating: {}", compatiblity);
  103. telemetry_session.AddField(Common::Telemetry::FieldType::UserFeedback, "Compatibility",
  104. compatiblity);
  105. button(NextButton)->setEnabled(false);
  106. button(NextButton)->setText(tr("Submitting"));
  107. button(CancelButton)->setVisible(false);
  108. testcase_watcher.setFuture(
  109. QtConcurrent::run([this] { return telemetry_session.SubmitTestcase(); }));
  110. break;
  111. default:
  112. LOG_ERROR(Frontend, "Unexpected page: {}", currentId());
  113. break;
  114. }
  115. }
  116. int CompatDB::nextId() const {
  117. switch ((static_cast<CompatDBPage>(currentId()))) {
  118. case CompatDBPage::Intro:
  119. return static_cast<int>(CompatDBPage::GameBoot);
  120. case CompatDBPage::GameBoot:
  121. if (ui->radioButton_GameBoot_No->isChecked()) {
  122. return static_cast<int>(CompatDBPage::Final);
  123. }
  124. return static_cast<int>(CompatDBPage::GamePlay);
  125. case CompatDBPage::GamePlay:
  126. if (ui->radioButton_Gameplay_No->isChecked()) {
  127. return static_cast<int>(CompatDBPage::Final);
  128. }
  129. return static_cast<int>(CompatDBPage::Freeze);
  130. case CompatDBPage::Freeze:
  131. if (ui->radioButton_NoFreeze_No->isChecked()) {
  132. return static_cast<int>(CompatDBPage::Final);
  133. }
  134. return static_cast<int>(CompatDBPage::Completion);
  135. case CompatDBPage::Completion:
  136. if (ui->radioButton_Complete_No->isChecked()) {
  137. return static_cast<int>(CompatDBPage::Final);
  138. }
  139. return static_cast<int>(CompatDBPage::Graphical);
  140. case CompatDBPage::Graphical:
  141. return static_cast<int>(CompatDBPage::Audio);
  142. case CompatDBPage::Audio:
  143. return static_cast<int>(CompatDBPage::Final);
  144. case CompatDBPage::Final:
  145. return -1;
  146. default:
  147. LOG_ERROR(Frontend, "Unexpected page: {}", currentId());
  148. return static_cast<int>(CompatDBPage::Intro);
  149. }
  150. }
  151. CompatibilityStatus CompatDB::CalculateCompatibility() const {
  152. if (ui->radioButton_GameBoot_No->isChecked()) {
  153. return CompatibilityStatus::WontBoot;
  154. }
  155. if (ui->radioButton_Gameplay_No->isChecked()) {
  156. return CompatibilityStatus::IntroMenu;
  157. }
  158. if (ui->radioButton_NoFreeze_No->isChecked() || ui->radioButton_Complete_No->isChecked()) {
  159. return CompatibilityStatus::Ingame;
  160. }
  161. if (ui->radioButton_Graphical_Major->isChecked() || ui->radioButton_Audio_Major->isChecked()) {
  162. return CompatibilityStatus::Ingame;
  163. }
  164. if (ui->radioButton_Graphical_Minor->isChecked() || ui->radioButton_Audio_Minor->isChecked()) {
  165. return CompatibilityStatus::Playable;
  166. }
  167. return CompatibilityStatus::Perfect;
  168. }
  169. void CompatDB::OnTestcaseSubmitted() {
  170. if (!testcase_watcher.result()) {
  171. QMessageBox::critical(this, tr("Communication error"),
  172. tr("An error occurred while sending the Testcase"));
  173. button(NextButton)->setEnabled(true);
  174. button(NextButton)->setText(tr("Next"));
  175. button(CancelButton)->setVisible(true);
  176. } else {
  177. next();
  178. // older versions of QT don't support the "NoCancelButtonOnLastPage" option, this is a
  179. // workaround
  180. button(CancelButton)->setVisible(false);
  181. }
  182. }
  183. void CompatDB::EnableNext() {
  184. button(NextButton)->setEnabled(true);
  185. }