compatdb.cpp 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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_Perfect, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  17. connect(ui->radioButton_Great, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  18. connect(ui->radioButton_Okay, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  19. connect(ui->radioButton_Bad, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  20. connect(ui->radioButton_IntroMenu, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  21. connect(ui->radioButton_WontBoot, &QRadioButton::clicked, this, &CompatDB::EnableNext);
  22. connect(button(NextButton), &QPushButton::clicked, this, &CompatDB::Submit);
  23. connect(&testcase_watcher, &QFutureWatcher<bool>::finished, this,
  24. &CompatDB::OnTestcaseSubmitted);
  25. }
  26. CompatDB::~CompatDB() = default;
  27. enum class CompatDBPage {
  28. Intro = 0,
  29. Selection = 1,
  30. Final = 2,
  31. };
  32. void CompatDB::Submit() {
  33. QButtonGroup* compatibility = new QButtonGroup(this);
  34. compatibility->addButton(ui->radioButton_Perfect, 0);
  35. compatibility->addButton(ui->radioButton_Great, 1);
  36. compatibility->addButton(ui->radioButton_Okay, 2);
  37. compatibility->addButton(ui->radioButton_Bad, 3);
  38. compatibility->addButton(ui->radioButton_IntroMenu, 4);
  39. compatibility->addButton(ui->radioButton_WontBoot, 5);
  40. switch ((static_cast<CompatDBPage>(currentId()))) {
  41. case CompatDBPage::Selection:
  42. if (compatibility->checkedId() == -1) {
  43. button(NextButton)->setEnabled(false);
  44. }
  45. break;
  46. case CompatDBPage::Final:
  47. back();
  48. LOG_DEBUG(Frontend, "Compatibility Rating: {}", compatibility->checkedId());
  49. telemetry_session.AddField(Common::Telemetry::FieldType::UserFeedback, "Compatibility",
  50. compatibility->checkedId());
  51. button(NextButton)->setEnabled(false);
  52. button(NextButton)->setText(tr("Submitting"));
  53. button(CancelButton)->setVisible(false);
  54. testcase_watcher.setFuture(
  55. QtConcurrent::run([this] { return telemetry_session.SubmitTestcase(); }));
  56. break;
  57. default:
  58. LOG_ERROR(Frontend, "Unexpected page: {}", currentId());
  59. }
  60. }
  61. void CompatDB::OnTestcaseSubmitted() {
  62. if (!testcase_watcher.result()) {
  63. QMessageBox::critical(this, tr("Communication error"),
  64. tr("An error occurred while sending the Testcase"));
  65. button(NextButton)->setEnabled(true);
  66. button(NextButton)->setText(tr("Next"));
  67. button(CancelButton)->setVisible(true);
  68. } else {
  69. next();
  70. // older versions of QT don't support the "NoCancelButtonOnLastPage" option, this is a
  71. // workaround
  72. button(CancelButton)->setVisible(false);
  73. }
  74. }
  75. void CompatDB::EnableNext() {
  76. button(NextButton)->setEnabled(true);
  77. }