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