1 // Copyright 2017 Citra Emulator Project
2 // Licensed under GPLv2 or any later version
3 // Refer to the license.txt file included.
4
5 #include <QButtonGroup>
6 #include <QMessageBox>
7 #include <QPushButton>
8 #include <QtConcurrent/qtconcurrentrun.h>
9 #include "common/logging/log.h"
10 #include "common/telemetry.h"
11 #include "core/core.h"
12 #include "core/telemetry_session.h"
13 #include "ui_compatdb.h"
14 #include "yuzu/compatdb.h"
15
CompatDB(QWidget * parent)16 CompatDB::CompatDB(QWidget* parent)
17 : QWizard(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint),
18 ui{std::make_unique<Ui::CompatDB>()} {
19 ui->setupUi(this);
20 connect(ui->radioButton_Perfect, &QRadioButton::clicked, this, &CompatDB::EnableNext);
21 connect(ui->radioButton_Great, &QRadioButton::clicked, this, &CompatDB::EnableNext);
22 connect(ui->radioButton_Okay, &QRadioButton::clicked, this, &CompatDB::EnableNext);
23 connect(ui->radioButton_Bad, &QRadioButton::clicked, this, &CompatDB::EnableNext);
24 connect(ui->radioButton_IntroMenu, &QRadioButton::clicked, this, &CompatDB::EnableNext);
25 connect(ui->radioButton_WontBoot, &QRadioButton::clicked, this, &CompatDB::EnableNext);
26 connect(button(NextButton), &QPushButton::clicked, this, &CompatDB::Submit);
27 connect(&testcase_watcher, &QFutureWatcher<bool>::finished, this,
28 &CompatDB::OnTestcaseSubmitted);
29 }
30
31 CompatDB::~CompatDB() = default;
32
33 enum class CompatDBPage {
34 Intro = 0,
35 Selection = 1,
36 Final = 2,
37 };
38
Submit()39 void CompatDB::Submit() {
40 QButtonGroup* compatibility = new QButtonGroup(this);
41 compatibility->addButton(ui->radioButton_Perfect, 0);
42 compatibility->addButton(ui->radioButton_Great, 1);
43 compatibility->addButton(ui->radioButton_Okay, 2);
44 compatibility->addButton(ui->radioButton_Bad, 3);
45 compatibility->addButton(ui->radioButton_IntroMenu, 4);
46 compatibility->addButton(ui->radioButton_WontBoot, 5);
47 switch ((static_cast<CompatDBPage>(currentId()))) {
48 case CompatDBPage::Selection:
49 if (compatibility->checkedId() == -1) {
50 button(NextButton)->setEnabled(false);
51 }
52 break;
53 case CompatDBPage::Final:
54 back();
55 LOG_DEBUG(Frontend, "Compatibility Rating: {}", compatibility->checkedId());
56 Core::System::GetInstance().TelemetrySession().AddField(
57 Common::Telemetry::FieldType::UserFeedback, "Compatibility",
58 compatibility->checkedId());
59
60 button(NextButton)->setEnabled(false);
61 button(NextButton)->setText(tr("Submitting"));
62 button(CancelButton)->setVisible(false);
63
64 testcase_watcher.setFuture(QtConcurrent::run(
65 [] { return Core::System::GetInstance().TelemetrySession().SubmitTestcase(); }));
66 break;
67 default:
68 LOG_ERROR(Frontend, "Unexpected page: {}", currentId());
69 }
70 }
71
OnTestcaseSubmitted()72 void CompatDB::OnTestcaseSubmitted() {
73 if (!testcase_watcher.result()) {
74 QMessageBox::critical(this, tr("Communication error"),
75 tr("An error occured while sending the Testcase"));
76 button(NextButton)->setEnabled(true);
77 button(NextButton)->setText(tr("Next"));
78 button(CancelButton)->setVisible(true);
79 } else {
80 next();
81 // older versions of QT don't support the "NoCancelButtonOnLastPage" option, this is a
82 // workaround
83 button(CancelButton)->setVisible(false);
84 }
85 }
86
EnableNext()87 void CompatDB::EnableNext() {
88 button(NextButton)->setEnabled(true);
89 }
90