| | |
| | |
| |
|
| | #include <QButtonGroup> |
| | #include <QMessageBox> |
| | #include <QPushButton> |
| | #include <QtConcurrent/qtconcurrentrun.h> |
| | #include "common/logging/log.h" |
| | #include "common/telemetry.h" |
| | #include "core/telemetry_session.h" |
| | #include "ui_compatdb.h" |
| | #include "yuzu/compatdb.h" |
| |
|
| | CompatDB::CompatDB(Core::TelemetrySession& telemetry_session_, QWidget* parent) |
| | : QWizard(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), |
| | ui{std::make_unique<Ui::CompatDB>()}, telemetry_session{telemetry_session_} { |
| | ui->setupUi(this); |
| |
|
| | connect(ui->radioButton_GameBoot_Yes, &QRadioButton::clicked, this, &CompatDB::EnableNext); |
| | connect(ui->radioButton_GameBoot_No, &QRadioButton::clicked, this, &CompatDB::EnableNext); |
| | connect(ui->radioButton_Gameplay_Yes, &QRadioButton::clicked, this, &CompatDB::EnableNext); |
| | connect(ui->radioButton_Gameplay_No, &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(&testcase_watcher, &QFutureWatcher<bool>::finished, this, |
| | &CompatDB::OnTestcaseSubmitted); |
| | } |
| |
|
| | CompatDB::~CompatDB() = default; |
| |
|
| | enum class CompatDBPage { |
| | Intro = 0, |
| | GameBoot = 1, |
| | GamePlay = 2, |
| | Freeze = 3, |
| | Completion = 4, |
| | Graphical = 5, |
| | Audio = 6, |
| | Final = 7, |
| | }; |
| |
|
| | void CompatDB::Submit() { |
| | QButtonGroup* compatibility_GameBoot = new QButtonGroup(this); |
| | compatibility_GameBoot->addButton(ui->radioButton_GameBoot_Yes, 0); |
| | compatibility_GameBoot->addButton(ui->radioButton_GameBoot_No, 1); |
| |
|
| | QButtonGroup* compatibility_Gameplay = new QButtonGroup(this); |
| | compatibility_Gameplay->addButton(ui->radioButton_Gameplay_Yes, 0); |
| | 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 compatibility = static_cast<int>(CalculateCompatibility()); |
| |
|
| | switch ((static_cast<CompatDBPage>(currentId()))) { |
| | case CompatDBPage::Intro: |
| | 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); |
| | } |
| | break; |
| | case CompatDBPage::Final: |
| | back(); |
| | LOG_INFO(Frontend, "Compatibility Rating: {}", compatibility); |
| | telemetry_session.AddField(Common::Telemetry::FieldType::UserFeedback, "Compatibility", |
| | compatibility); |
| |
|
| | button(NextButton)->setEnabled(false); |
| | button(NextButton)->setText(tr("Submitting")); |
| | button(CancelButton)->setVisible(false); |
| |
|
| | testcase_watcher.setFuture( |
| | QtConcurrent::run([this] { return telemetry_session.SubmitTestcase(); })); |
| | break; |
| | default: |
| | LOG_ERROR(Frontend, "Unexpected page: {}", currentId()); |
| | break; |
| | } |
| | } |
| |
|
| | 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() { |
| | if (!testcase_watcher.result()) { |
| | QMessageBox::critical(this, tr("Communication error"), |
| | tr("An error occurred while sending the Testcase")); |
| | button(NextButton)->setEnabled(true); |
| | button(NextButton)->setText(tr("Next")); |
| | button(CancelButton)->setVisible(true); |
| | } else { |
| | next(); |
| | |
| | |
| | button(CancelButton)->setVisible(false); |
| | } |
| | } |
| |
|
| | void CompatDB::EnableNext() { |
| | button(NextButton)->setEnabled(true); |
| | } |
| |
|