Browse Source

[qt] nuke game compat list (again) (#4201)

we have no use for it
it's dead code
most of the time users just complain about how the list isn't updated
ok so what if we update it? great now its more noise added to the git, awesome
even if we constantly update it, we introduce new breakage that makes keeping
track of things extremely difficult

either we integrate with emuready (would violate self containment principles)

or we integrate with emuready in a similar fashion to eden news outlet
(where we cache the list with some TTL of like 60 mins or whatever)
that would be better respecting of "self containment" but would probably
require having a quick way to update the list additively, probably filtered to the user's
device instead of a global thing, and i dont think emuready has that granularity
nor we have the "connect this to that" for the api stuffs

another (which is what i propose here) is throw everything out of the window
until someone can come up with something better

Signed-off-by: lizzie <lizzie@eden-emu.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4201
Reviewed-by: Maufeat <sahyno1996@gmail.com>
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
pull/4202/head
lizzie 2 days ago
committed by crueter
parent
commit
7f85c6e282
No known key found for this signature in database GPG Key ID: 425ACD2D4830EBC6
  1. 5
      .reuse/dep5
  2. 19
      CMakeLists.txt
  3. 354
      dist/compatibility_list/compatibility_list.json
  4. 5
      dist/compatibility_list/compatibility_list.qrc
  5. 50
      src/qt_common/game_list/model.cpp
  6. 6
      src/qt_common/game_list/model.h
  7. 15
      src/qt_common/game_list/worker.cpp
  8. 3
      src/qt_common/game_list/worker.h
  9. 13
      src/yuzu/CMakeLists.txt
  10. 206
      src/yuzu/compatdb.cpp
  11. 40
      src/yuzu/compatdb.h
  12. 398
      src/yuzu/compatdb.ui
  13. 17
      src/yuzu/compatibility_list.cpp
  14. 19
      src/yuzu/compatibility_list.h
  15. 12
      src/yuzu/game/game_list.cpp
  16. 4
      src/yuzu/game/game_list.h
  17. 11
      src/yuzu/main.ui
  18. 23
      src/yuzu/main_window.cpp
  19. 3
      src/yuzu/main_window.h

5
.reuse/dep5

@ -112,11 +112,6 @@ Files: src/yuzu/*.ui
Copyright: 2018-2022 yuzu Emulator Project Copyright: 2018-2022 yuzu Emulator Project
License: GPL-2.0-or-later License: GPL-2.0-or-later
Files: src/yuzu/compatdb.ui
src/yuzu/main.ui
Copyright: 2014-2017 Citra Emulator Project
License: GPL-2.0-or-later
Files: src/yuzu/loading_screen.ui Files: src/yuzu/loading_screen.ui
Copyright: 2019 James Rowe <jroweboy@gmail.com> Copyright: 2019 James Rowe <jroweboy@gmail.com>
License: GPL-2.0-or-later License: GPL-2.0-or-later

19
CMakeLists.txt

@ -281,25 +281,6 @@ if(EXISTS ${PROJECT_SOURCE_DIR}/hooks/pre-commit AND NOT EXISTS ${PROJECT_SOURCE
endif() endif()
endif() endif()
set(compat_base dist/compatibility_list/compatibility_list)
set(compat_qrc ${compat_base}.qrc)
set(compat_json ${compat_base}.json)
configure_file(${PROJECT_SOURCE_DIR}/${compat_qrc}
${PROJECT_BINARY_DIR}/${compat_qrc}
COPYONLY)
if (EXISTS ${PROJECT_SOURCE_DIR}/${compat_json})
configure_file("${PROJECT_SOURCE_DIR}/${compat_json}"
"${PROJECT_BINARY_DIR}/${compat_json}"
COPYONLY)
endif()
# TODO: Compat list download
if (NOT EXISTS ${PROJECT_BINARY_DIR}/${compat_json})
file(WRITE ${PROJECT_BINARY_DIR}/${compat_json} "")
endif()
if (ARCHITECTURE_arm64 AND (ANDROID OR PLATFORM_LINUX)) if (ARCHITECTURE_arm64 AND (ANDROID OR PLATFORM_LINUX))
set(HAS_NCE 1) set(HAS_NCE 1)
add_compile_definitions(HAS_NCE=1) add_compile_definitions(HAS_NCE=1)

354
dist/compatibility_list/compatibility_list.json

@ -1,354 +0,0 @@
[
{
"compatibility": 0,
"directory": "the-legend-of-zelda-breath-of-the-wild",
"releases": [
{"id": "01007EF00011E000"}
],
"title": "The Legend of Zelda: Breath of the Wild"
},
{
"compatibility": 1,
"directory": "super-mario-odyssey",
"releases": [
{"id": "0100000000010000"}
],
"title": "Super Mario Odyssey"
},
{
"compatibility": 0,
"directory": "animal-crossing-new-horizons",
"releases": [
{"id": "01006F8002326000"}
],
"title": "Animal Crossing: New Horizons"
},
{
"compatibility": 1,
"directory": "pokemon-legends-z-a",
"releases": [
{"id": "0100F43008C44000"}
],
"title": "Pokémon Legends: Z-A"
},
{
"compatibility": 1,
"directory": "the-legend-of-zelda-tears-of-the-kingdom",
"releases": [
{"id": "0100F2C0115B6000"}
],
"title": "The Legend of Zelda: Tears of the Kingdom"
},
{
"compatibility": 0,
"directory": "super-mario-galaxy",
"releases": [
{"id": "010099C022B96000"}
],
"title": "Super Mario Galaxy"
},
{
"compatibility": 3,
"directory": "star-wars-republic-commando",
"releases": [
{"id": "0100FA10115F8000"}
],
"title": "Star Wars: Republic Commando"
},
{
"compatibility": 0,
"directory": "doki-doki-literature-club-plus",
"releases": [
{"id": "010086901543E000"}
],
"title": "Doki Doki Literature Club Plus"
},
{
"compatibility": 1,
"directory": "pokemon-scarlet",
"releases": [
{"id": "0100A3D008C5C000"}
],
"title": "Pokémon Scarlet"
},
{
"compatibility": 1,
"directory": "pokemon-violet",
"releases": [
{"id": "01008F6008C5E000"}
],
"title": "Pokémon Violet"
},
{
"compatibility": 2,
"directory": "pokemon-legends-arceus",
"releases": [
{"id": "01001E300D162000"}
],
"title": "Pokémon Legends: Arceus"
},
{
"compatibility": 0,
"directory": "splatoon-2",
"releases": [
{"id": "01003BC0000A0000"}
],
"title": "Splatoon 2"
},
{
"compatibility": 1,
"directory": "super-smash-bros-ultimate",
"releases": [
{"id": "01006A800016E000"}
],
"title": "Super Smash Bros. Ultimate"
},
{
"compatibility": 0,
"directory": "mario-kart-8-deluxe",
"releases": [
{"id": "0100152000022000"}
],
"title": "Mario Kart 8 Deluxe"
},
{
"compatibility": 0,
"directory": "splatoon-3",
"releases": [
{"id": "0100C2500FC20000"}
],
"title": "Splatoon 3"
},
{
"compatibility": 0,
"directory": "new-super-mario-bros-u-deluxe",
"releases": [
{"id": "0100EA80032EA000"}
],
"title": "New Super Mario Bros. U Deluxe"
},
{
"compatibility": 0,
"directory": "hyrule-warriors-age-of-calamity",
"releases": [
{"id": "01002B00111A2000"}
],
"title": "Hyrule Warriors: Age of Calamity"
},
{
"compatibility": 2,
"directory": "luigis-mansion-3",
"releases": [
{"id": "0100DCA0064A6000"}
],
"title": "Luigi's Mansion 3"
},
{
"compatibility": 2,
"directory": "pokemon-brilliant-diamond",
"releases": [
{"id": "0100000011D90000"}
],
"title": "Pokémon Brilliant Diamond"
},
{
"compatibility": 2,
"directory": "pokemon-shining-pearl",
"releases": [
{"id": "010018E011D92000"}
],
"title": "Pokémon Shining Pearl"
},
{
"compatibility": 1,
"directory": "super-mario-3d-world-bowsers-fury",
"releases": [
{"id": "010028600EBDA000"}
],
"title": "Super Mario 3D World + Bowser's Fury"
},
{
"compatibility": 0,
"directory": "the-legend-of-zelda-links-awakening",
"releases": [
{"id": "01006BB00C6F0000"}
],
"title": "The Legend of Zelda: Link's Awakening"
},
{
"compatibility": 1,
"directory": "fire-emblem-three-houses",
"releases": [
{"id": "010055D009F78000"}
],
"title": "Fire Emblem: Three Houses"
},
{
"compatibility": 2,
"directory": "metroid-dread",
"releases": [
{"id": "010093801237C000"}
],
"title": "Metroid Dread"
},
{
"compatibility": 0,
"directory": "paper-mario-the-origami-king",
"releases": [
{"id": "0100A3900C3E2000"}
],
"title": "Paper Mario: The Origami King"
},
{
"compatibility": 1,
"directory": "xenoblade-chronicles-definitive-edition",
"releases": [
{"id": "0100FF500E34A000"}
],
"title": "Xenoblade Chronicles: Definitive Edition"
},
{
"compatibility": 2,
"directory": "xenoblade-chronicles-3",
"releases": [
{"id": "010074F013262000"}
],
"title": "Xenoblade Chronicles 3"
},
{
"compatibility": 1,
"directory": "pikmin-3-deluxe",
"releases": [
{"id": "0100F8600D4B0000"}
],
"title": "Pikmin 3 Deluxe"
},
{
"compatibility": 0,
"directory": "donkey-kong-country-tropical-freeze",
"releases": [
{"id": "0100C1F0054B6000"}
],
"title": "Donkey Kong Country: Tropical Freeze"
},
{
"compatibility": 1,
"directory": "kirby-and-the-forgotten-land",
"releases": [
{"id": "01004D300C5AE000"}
],
"title": "Kirby and the Forgotten Land"
},
{
"compatibility": 2,
"directory": "mario-party-superstars",
"releases": [
{"id": "01006B400D8B2000"}
],
"title": "Mario Party Superstars"
},
{
"compatibility": 0,
"directory": "clubhouse-games-51-worldwide-classics",
"releases": [
{"id": "0100F8600D4B0000"}
],
"title": "Clubhouse Games: 51 Worldwide Classics"
},
{
"compatibility": 1,
"directory": "ring-fit-adventure",
"releases": [
{"id": "01006B300BAF8000"}
],
"title": "Ring Fit Adventure"
},
{
"compatibility": 2,
"directory": "arms",
"releases": [
{"id": "01009B500007C000"}
],
"title": "ARMS"
},
{
"compatibility": 0,
"directory": "super-mario-maker-2",
"releases": [
{"id": "01009B90006DC000"}
],
"title": "Super Mario Maker 2"
},
{
"compatibility": 0,
"directory": "pokemon-lets-go-pikachu",
"releases": [
{"id": "010003F003A34000"}
],
"title": "Pokémon: Let's Go, Pikachu!"
},
{
"compatibility": 1,
"directory": "pokemon-lets-go-eevee",
"releases": [
{"id": "0100187003A36000"}
],
"title": "Pokémon: Let's Go, Eevee!"
},
{
"compatibility": 2,
"directory": "pokemon-sword",
"releases": [
{"id": "0100ABF008968000"}
],
"title": "Pokémon Sword"
},
{
"compatibility": 2,
"directory": "pokemon-shield",
"releases": [
{"id": "01008DB008C2C000"}
],
"title": "Pokémon Shield"
},
{
"compatibility": 1,
"directory": "new-pokemon-snap",
"releases": [
{"id": "0100F4300C182000"}
],
"title": "New Pokémon Snap"
},
{
"compatibility": 0,
"directory": "mario-golf-super-rush",
"releases": [
{"id": "0100C9C00E25C000"}
],
"title": "Mario Golf: Super Rush"
},
{
"compatibility": 1,
"directory": "mario-tennis-aces",
"releases": [
{"id": "0100BDE00862A000"}
],
"title": "Mario Tennis Aces"
},
{
"compatibility": 2,
"directory": "wario-ware-get-it-together",
"releases": [
{"id": "0100563010F22000"}
],
"title": "WarioWare: Get It Together!"
},
{
"compatibility": 0,
"directory": "big-brain-academy-brain-vs-brain",
"releases": [
{"id": "0100190010F24000"}
],
"title": "Big Brain Academy: Brain vs. Brain"
}
]

5
dist/compatibility_list/compatibility_list.qrc

@ -1,5 +0,0 @@
<RCC>
<qresource prefix="compatibility_list">
<file>compatibility_list.json</file>
</qresource>
</RCC>

50
src/qt_common/game_list/model.cpp

@ -52,7 +52,7 @@ void GameListModel::PopulateAsync(QVector<UISettings::GameDir>& game_dirs) {
current_worker.reset(); current_worker.reset();
removeRows(0, rowCount()); removeRows(0, rowCount());
current_worker = std::make_unique<GameListWorker>(vfs, provider, game_dirs, compatibility_list,
current_worker = std::make_unique<GameListWorker>(vfs, provider, game_dirs,
play_time_manager, system); play_time_manager, system);
connect(current_worker.get(), &GameListWorker::DataAvailable, this, &GameListModel::WorkerEvent, connect(current_worker.get(), &GameListWorker::DataAvailable, this, &GameListModel::WorkerEvent,
@ -157,50 +157,6 @@ void GameListModel::RemoveFavorite(u64 program_id) {
} }
} }
void GameListModel::LoadCompatibilityList() {
QFile compat_list{QStringLiteral(":compatibility_list/compatibility_list.json")};
if (!compat_list.open(QFile::ReadOnly | QFile::Text)) {
LOG_ERROR(Frontend, "Unable to open game compatibility list");
return;
}
if (compat_list.size() == 0) {
LOG_WARNING(Frontend, "Game compatibility list is empty");
return;
}
const QByteArray content = compat_list.readAll();
if (content.isEmpty()) {
LOG_ERROR(Frontend, "Unable to completely read game compatibility list");
return;
}
const QJsonDocument json = QJsonDocument::fromJson(content);
const QJsonArray arr = json.array();
for (const QJsonValue& value : arr) {
const QJsonObject game = value.toObject();
const QString compatibility_key = QStringLiteral("compatibility");
if (!game.contains(compatibility_key) || !game[compatibility_key].isDouble()) {
continue;
}
const int compatibility = game[compatibility_key].toInt();
const QString directory = game[QStringLiteral("directory")].toString();
const QJsonArray ids = game[QStringLiteral("releases")].toArray();
for (const QJsonValue& id_ref : ids) {
const QJsonObject id_object = id_ref.toObject();
const QString id = id_object[QStringLiteral("id")].toString();
compatibility_list.emplace(id.toUpper().toStdString(),
std::make_pair(QString::number(compatibility), directory));
}
}
}
void GameListModel::Repopulate() { void GameListModel::Repopulate() {
current_worker.reset(); current_worker.reset();
QtCommon::system->GetFileSystemController().CreateFactories(*QtCommon::vfs); QtCommon::system->GetFileSystemController().CreateFactories(*QtCommon::vfs);
@ -247,10 +203,6 @@ QFileSystemWatcher* GameListModel::GetWatcher() const {
return watcher; return watcher;
} }
const CompatibilityList& GameListModel::GetCompatibilityList() const {
return compatibility_list;
}
void GameListModel::SetFlat(bool flat) { void GameListModel::SetFlat(bool flat) {
m_flat = flat; m_flat = flat;
} }

6
src/qt_common/game_list/model.h

@ -12,7 +12,6 @@
#include "common/common_types.h" #include "common/common_types.h"
#include "frontend_common/play_time_manager.h" #include "frontend_common/play_time_manager.h"
#include "qt_common/config/uisettings.h" #include "qt_common/config/uisettings.h"
#include "yuzu/compatibility_list.h"
namespace Core { namespace Core {
class System; class System;
@ -62,14 +61,10 @@ public:
void RefreshExternalContent(); void RefreshExternalContent();
void ResetExternalWatcher(); void ResetExternalWatcher();
void LoadCompatibilityList();
void RetranslateUI(); void RetranslateUI();
QFileSystemWatcher* GetWatcher() const; QFileSystemWatcher* GetWatcher() const;
const CompatibilityList& GetCompatibilityList() const;
void SetFlat(bool flat); void SetFlat(bool flat);
signals: signals:
@ -89,7 +84,6 @@ private:
std::shared_ptr<FileSys::VfsFilesystem> vfs; std::shared_ptr<FileSys::VfsFilesystem> vfs;
FileSys::ManualContentProvider* provider; FileSys::ManualContentProvider* provider;
CompatibilityList compatibility_list;
const PlayTime::PlayTimeManager& play_time_manager; const PlayTime::PlayTimeManager& play_time_manager;
Core::System& system; Core::System& system;

15
src/qt_common/game_list/worker.cpp

@ -33,7 +33,6 @@
#include "qt_common/qt_common.h" #include "qt_common/qt_common.h"
#include "qt_common/game_list/game_list_p.h" #include "qt_common/game_list/game_list_p.h"
#include "yuzu/compatibility_list.h"
#include "qt_common/game_list/model.h" #include "qt_common/game_list/model.h"
#include "qt_common/game_list/worker.h" #include "qt_common/game_list/worker.h"
@ -203,14 +202,8 @@ QString FormatPatchNameVersions(const FileSys::PatchManager& patch_manager,
QList<QStandardItem*> MakeGameListEntry(const std::string& path, const std::string& name, QList<QStandardItem*> MakeGameListEntry(const std::string& path, const std::string& name,
const std::size_t size, const std::vector<u8>& icon, const std::size_t size, const std::vector<u8>& icon,
Loader::AppLoader& loader, u64 program_id, Loader::AppLoader& loader, u64 program_id,
const CompatibilityList& compatibility_list,
const PlayTime::PlayTimeManager& play_time_manager, const PlayTime::PlayTimeManager& play_time_manager,
const FileSys::PatchManager& patch) { const FileSys::PatchManager& patch) {
auto const it = FindMatchingCompatibilityEntry(compatibility_list, program_id);
// The game list uses 99 as compatibility number for untested games
QString compatibility =
it != compatibility_list.end() ? it->second.first : QStringLiteral("99");
auto const file_type = loader.GetFileType(); auto const file_type = loader.GetFileType();
auto const file_type_string = QString::fromStdString(Loader::GetFileTypeString(file_type)); auto const file_type_string = QString::fromStdString(Loader::GetFileTypeString(file_type));
@ -227,7 +220,6 @@ QList<QStandardItem*> MakeGameListEntry(const std::string& path, const std::stri
new GameListItemSize(size), new GameListItemSize(size),
new GameListItemPlayTime(play_time), new GameListItemPlayTime(play_time),
new GameListItem(patch_versions), new GameListItem(patch_versions),
new GameListItemCompat(compatibility),
}; };
} }
} // Anonymous namespace } // Anonymous namespace
@ -235,11 +227,10 @@ QList<QStandardItem*> MakeGameListEntry(const std::string& path, const std::stri
GameListWorker::GameListWorker(FileSys::VirtualFilesystem vfs_, GameListWorker::GameListWorker(FileSys::VirtualFilesystem vfs_,
FileSys::ManualContentProvider* provider_, FileSys::ManualContentProvider* provider_,
QVector<UISettings::GameDir>& game_dirs_, QVector<UISettings::GameDir>& game_dirs_,
const CompatibilityList& compatibility_list_,
const PlayTime::PlayTimeManager& play_time_manager_, const PlayTime::PlayTimeManager& play_time_manager_,
Core::System& system_) Core::System& system_)
: vfs{std::move(vfs_)}, provider{provider_}, game_dirs{game_dirs_}, : vfs{std::move(vfs_)}, provider{provider_}, game_dirs{game_dirs_},
compatibility_list{compatibility_list_}, play_time_manager{play_time_manager_},
play_time_manager{play_time_manager_},
system{system_} { system{system_} {
// We want the game list to manage our lifetime. // We want the game list to manage our lifetime.
setAutoDelete(false); setAutoDelete(false);
@ -335,7 +326,7 @@ void GameListWorker::AddTitlesToGameList(GameListDir* parent_dir) {
} }
auto entry = MakeGameListEntry(file->GetFullPath(), name, file->GetSize(), icon, *loader, auto entry = MakeGameListEntry(file->GetFullPath(), name, file->GetSize(), icon, *loader,
program_id, compatibility_list, play_time_manager, patch);
program_id, play_time_manager, patch);
RecordEvent([=](GameListModel* model) { model->AddEntry(entry, parent_dir); }); RecordEvent([=](GameListModel* model) { model->AddEntry(entry, parent_dir); });
} }
} }
@ -405,7 +396,7 @@ void GameListWorker::ScanFileSystem(ScanTarget target, const std::string& dir_pa
auto entry = MakeGameListEntry( auto entry = MakeGameListEntry(
physical_name, name, Common::FS::GetSize(physical_name), icon, *app_loader, physical_name, name, Common::FS::GetSize(physical_name), icon, *app_loader,
id, compatibility_list, play_time_manager, patch);
id, play_time_manager, patch);
RecordEvent([=](GameListModel* model) { model->AddEntry(entry, parent_dir); }); RecordEvent([=](GameListModel* model) { model->AddEntry(entry, parent_dir); });
}; };

3
src/qt_common/game_list/worker.h

@ -20,7 +20,6 @@
#include "core/file_sys/registered_cache.h" #include "core/file_sys/registered_cache.h"
#include "frontend_common/play_time_manager.h" #include "frontend_common/play_time_manager.h"
#include "qt_common/config/uisettings.h" #include "qt_common/config/uisettings.h"
#include "yuzu/compatibility_list.h"
namespace Core { namespace Core {
class System; class System;
@ -46,7 +45,6 @@ public:
explicit GameListWorker(std::shared_ptr<FileSys::VfsFilesystem> vfs_, explicit GameListWorker(std::shared_ptr<FileSys::VfsFilesystem> vfs_,
FileSys::ManualContentProvider* provider_, FileSys::ManualContentProvider* provider_,
QVector<UISettings::GameDir>& game_dirs_, QVector<UISettings::GameDir>& game_dirs_,
const CompatibilityList& compatibility_list_,
const PlayTime::PlayTimeManager& play_time_manager_, const PlayTime::PlayTimeManager& play_time_manager_,
Core::System& system_); Core::System& system_);
~GameListWorker() override; ~GameListWorker() override;
@ -85,7 +83,6 @@ private:
std::shared_ptr<FileSys::VfsFilesystem> vfs; std::shared_ptr<FileSys::VfsFilesystem> vfs;
FileSys::ManualContentProvider* provider; FileSys::ManualContentProvider* provider;
QVector<UISettings::GameDir>& game_dirs; QVector<UISettings::GameDir>& game_dirs;
const CompatibilityList& compatibility_list;
const PlayTime::PlayTimeManager& play_time_manager; const PlayTime::PlayTimeManager& play_time_manager;
QStringList watch_list; QStringList watch_list;

13
src/yuzu/CMakeLists.txt

@ -37,9 +37,6 @@ add_executable(yuzu
applets/qt_web_browser_scripts.h applets/qt_web_browser_scripts.h
bootmanager.cpp bootmanager.cpp
bootmanager.h bootmanager.h
compatdb.ui
compatibility_list.cpp
compatibility_list.h
configuration/configuration_shared.cpp configuration/configuration_shared.cpp
configuration/configuration_shared.h configuration/configuration_shared.h
configuration/configure.ui configuration/configure.ui
@ -216,8 +213,6 @@ add_executable(yuzu
util/url_request_interceptor.h util/url_request_interceptor.h
util/util.cpp util/util.cpp
util/util.h util/util.h
compatdb.cpp
compatdb.h
user_data_migration.h user_data_migration.cpp user_data_migration.h user_data_migration.cpp
@ -260,9 +255,6 @@ if (CXX_CLANG)
$<$<VERSION_LESS:$<CXX_COMPILER_VERSION>,15>:CANNOT_EXPLICITLY_INSTANTIATE>) $<$<VERSION_LESS:$<CXX_COMPILER_VERSION>,15>:CANNOT_EXPLICITLY_INSTANTIATE>)
endif() endif()
file(GLOB COMPAT_LIST
${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc
${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json)
file(GLOB_RECURSE ICONS ${PROJECT_SOURCE_DIR}/dist/icons/*) file(GLOB_RECURSE ICONS ${PROJECT_SOURCE_DIR}/dist/icons/*)
file(GLOB_RECURSE THEMES ${PROJECT_SOURCE_DIR}/dist/qt_themes/*) file(GLOB_RECURSE THEMES ${PROJECT_SOURCE_DIR}/dist/qt_themes/*)
@ -354,7 +346,6 @@ endif()
target_sources(yuzu target_sources(yuzu
PRIVATE PRIVATE
${COMPAT_LIST}
${ICONS} ${ICONS}
${LANGUAGES} ${LANGUAGES}
${THEMES}) ${THEMES})
@ -416,10 +407,6 @@ if (UNIX AND NOT APPLE)
target_link_libraries(yuzu PRIVATE Qt6::DBus) target_link_libraries(yuzu PRIVATE Qt6::DBus)
endif() endif()
if (YUZU_ENABLE_COMPATIBILITY_REPORTING)
target_compile_definitions(yuzu PRIVATE YUZU_ENABLE_COMPATIBILITY_REPORTING)
endif()
if (ENABLE_WEB_SERVICE) if (ENABLE_WEB_SERVICE)
target_compile_definitions(yuzu PRIVATE ENABLE_WEB_SERVICE) target_compile_definitions(yuzu PRIVATE ENABLE_WEB_SERVICE)
endif() endif()

206
src/yuzu/compatdb.cpp

@ -1,206 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2017 Citra Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <QButtonGroup>
#include <QMessageBox>
#include <QPushButton>
#include <qtconcurrentrun.h>
#include "common/logging.h"
#include "ui_compatdb.h"
#include "yuzu/compatdb.h"
CompatDB::CompatDB(QWidget* parent)
: QWizard(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint),
ui{std::make_unique<Ui::CompatDB>()} {
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);
button(NextButton)->setEnabled(false);
button(NextButton)->setText(tr("Submitting"));
button(CancelButton)->setVisible(false);
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();
// older versions of QT don't support the "NoCancelButtonOnLastPage" option, this is a
// workaround
button(CancelButton)->setVisible(false);
}
}
void CompatDB::EnableNext() {
button(NextButton)->setEnabled(true);
}

40
src/yuzu/compatdb.h

@ -1,40 +0,0 @@
// SPDX-FileCopyrightText: 2017 Citra Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <memory>
#include <QFutureWatcher>
#include <QWizard>
namespace Ui {
class CompatDB;
}
enum class CompatibilityStatus {
Perfect = 0,
Playable = 1,
// Unused: Okay = 2,
Ingame = 3,
IntroMenu = 4,
WontBoot = 5,
};
class CompatDB : public QWizard {
Q_OBJECT
public:
explicit CompatDB(QWidget* parent = nullptr);
~CompatDB();
int nextId() const override;
private:
QFutureWatcher<bool> testcase_watcher;
std::unique_ptr<Ui::CompatDB> ui;
void Submit();
CompatibilityStatus CalculateCompatibility() const;
void OnTestcaseSubmitted();
void EnableNext();
};

398
src/yuzu/compatdb.ui

@ -1,398 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CompatDB</class>
<widget class="QWizard" name="CompatDB">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>600</width>
<height>482</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>500</width>
<height>410</height>
</size>
</property>
<property name="windowTitle">
<string>Report Compatibility</string>
</property>
<property name="options">
<set>QWizard::WizardOption::DisabledBackButtonOnLastPage|QWizard::WizardOption::HelpButtonOnRight|QWizard::WizardOption::NoBackButtonOnStartPage</set>
</property>
<widget class="QWizardPage" name="wizard_Info">
<property name="title">
<string>Report Game Compatibility</string>
</property>
<attribute name="pageId">
<string notr="true">0</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="lbl_Spiel">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Should you choose to submit a test case to the &lt;/span&gt;&lt;a href=&quot;https://eden-emulator.github.io/game/&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;eden Compatibility List&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;, The following information will be collected and displayed on the site:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;&quot;&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Hardware Information (CPU / GPU / Operating System)&lt;/li&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Which version of eden you are running&lt;/li&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The connected eden account&lt;/li&gt;&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWizardPage" name="wizard_GameBoot">
<property name="title">
<string>Report Game Compatibility</string>
</property>
<attribute name="pageId">
<string notr="true">1</string>
</attribute>
<layout class="QFormLayout" name="formLayout1">
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="lbl_Independent1">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Does the game boot?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<spacer name="verticalSpacer1">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0">
<widget class="QRadioButton" name="radioButton_GameBoot_Yes">
<property name="text">
<string>Yes The game starts to output video or audio</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QRadioButton" name="radioButton_GameBoot_No">
<property name="text">
<string>No The game doesn't get past the &quot;Launching...&quot; screen</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWizardPage" name="wizard_GamePlay">
<property name="title">
<string>Report Game Compatibility</string>
</property>
<attribute name="pageId">
<string notr="true">2</string>
</attribute>
<layout class="QFormLayout" name="formLayout2">
<item row="2" column="0">
<widget class="QRadioButton" name="radioButton_Gameplay_Yes">
<property name="text">
<string>Yes The game gets past the intro/menu and into gameplay</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QRadioButton" name="radioButton_Gameplay_No">
<property name="text">
<string>No The game crashes or freezes while loading or using the menu</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="lbl_Independent2">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Does the game reach gameplay?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<spacer name="verticalSpacer2">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWizardPage" name="wizard_NoFreeze">
<property name="title">
<string>Report Game Compatibility</string>
</property>
<attribute name="pageId">
<string notr="true">3</string>
</attribute>
<layout class="QFormLayout" name="formLayout3">
<item row="2" column="0">
<widget class="QRadioButton" name="radioButton_NoFreeze_Yes">
<property name="text">
<string>Yes The game works without crashes</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QRadioButton" name="radioButton_NoFreeze_No">
<property name="text">
<string>No The game crashes or freezes during gameplay</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="lbl_Independent3">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Does the game work without crashing, freezing or locking up during gameplay?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<spacer name="verticalSpacer3">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWizardPage" name="wizard_Complete">
<property name="title">
<string>Report Game Compatibility</string>
</property>
<attribute name="pageId">
<string notr="true">4</string>
</attribute>
<layout class="QFormLayout" name="formLayout4">
<item row="2" column="0">
<widget class="QRadioButton" name="radioButton_Complete_Yes">
<property name="text">
<string>Yes The game can be finished without any workarounds</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QRadioButton" name="radioButton_Complete_No">
<property name="text">
<string>No The game can't progress past a certain area</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="lbl_Independent4">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Is the game completely playable from start to finish?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<spacer name="verticalSpacer4">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWizardPage" name="wizard_Graphical">
<property name="title">
<string>Report Game Compatibility</string>
</property>
<attribute name="pageId">
<string notr="true">5</string>
</attribute>
<layout class="QFormLayout" name="formLayout5">
<item row="2" column="0">
<widget class="QRadioButton" name="radioButton_Graphical_Major">
<property name="text">
<string>Major The game has major graphical errors</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QRadioButton" name="radioButton_Graphical_Minor">
<property name="text">
<string>Minor The game has minor graphical errors</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QRadioButton" name="radioButton_Graphical_No">
<property name="text">
<string>None Everything is rendered as it looks on the Nintendo Switch</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="lbl_Independent5">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Does the game have any graphical glitches?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<spacer name="verticalSpacer5">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWizardPage" name="wizard_Audio">
<property name="title">
<string>Report Game Compatibility</string>
</property>
<attribute name="pageId">
<string notr="true">6</string>
</attribute>
<layout class="QFormLayout" name="formLayout6">
<item row="2" column="0">
<widget class="QRadioButton" name="radioButton_Audio_Major">
<property name="text">
<string>Major The game has major audio errors</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QRadioButton" name="radioButton_Audio_Minor">
<property name="text">
<string>Minor The game has minor audio errors</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QRadioButton" name="radioButton_Audio_No">
<property name="text">
<string>None Audio is played perfectly</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="lbl_Independent6">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Does the game have any audio glitches / missing effects?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<spacer name="verticalSpacer6">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWizardPage" name="wizard_ThankYou">
<property name="title">
<string>Thank you for your submission!</string>
</property>
<attribute name="pageId">
<string notr="true">7</string>
</attribute>
</widget>
</widget>
<resources/>
<connections/>
</ui>

17
src/yuzu/compatibility_list.cpp

@ -1,17 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <algorithm>
#include <fmt/ranges.h>
#include "yuzu/compatibility_list.h"
CompatibilityList::const_iterator FindMatchingCompatibilityEntry(
const CompatibilityList& compatibility_list, u64 program_id) {
return std::find_if(compatibility_list.begin(), compatibility_list.end(),
[program_id](const auto& element) {
std::string pid = fmt::format("{:016X}", program_id);
return element.first == pid;
});
}

19
src/yuzu/compatibility_list.h

@ -1,19 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <string>
#include <ankerl/unordered_dense.h>
#include <QString>
#include "common/common_types.h"
using CompatibilityList = ankerl::unordered_dense::map<std::string, std::pair<QString, QString>>;
CompatibilityList::const_iterator FindMatchingCompatibilityEntry(
const CompatibilityList& compatibility_list, u64 program_id);

12
src/yuzu/game/game_list.cpp

@ -31,7 +31,6 @@
#include "qt_common/game_list/model.h" #include "qt_common/game_list/model.h"
#include "qt_common/qt_common.h" #include "qt_common/qt_common.h"
#include "qt_common/util/game.h" #include "qt_common/util/game.h"
#include "yuzu/compatibility_list.h"
#include "yuzu/game/carousel.h" #include "yuzu/game/carousel.h"
#include "yuzu/game/game_grid.h" #include "yuzu/game/game_grid.h"
#include "yuzu/game/game_list.h" #include "yuzu/game/game_list.h"
@ -136,10 +135,6 @@ bool GameList::IsEmpty() const {
return item_model->IsEmpty(); return item_model->IsEmpty();
} }
void GameList::LoadCompatibilityList() {
item_model->LoadCompatibilityList();
}
void GameList::OnPopulate() { void GameList::OnPopulate() {
m_currentView->setEnabled(false); m_currentView->setEnabled(false);
@ -483,7 +478,6 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri
QAction* dump_romfs_sdmc = dump_romfs_menu->addAction(tr("Dump RomFS to SDMC")); QAction* dump_romfs_sdmc = dump_romfs_menu->addAction(tr("Dump RomFS to SDMC"));
QAction* verify_integrity = context_menu.addAction(tr("Verify Integrity")); QAction* verify_integrity = context_menu.addAction(tr("Verify Integrity"));
QAction* copy_tid = context_menu.addAction(tr("Copy Title ID to Clipboard")); QAction* copy_tid = context_menu.addAction(tr("Copy Title ID to Clipboard"));
QAction* navigate_to_gamedb_entry = context_menu.addAction(tr("Navigate to GameDB entry"));
#if !defined(__APPLE__) #if !defined(__APPLE__)
QMenu* shortcut_menu = context_menu.addMenu(tr("Create Shortcut")); QMenu* shortcut_menu = context_menu.addMenu(tr("Create Shortcut"));
QAction* create_desktop_shortcut = shortcut_menu->addAction(tr("Add to Desktop")); QAction* create_desktop_shortcut = shortcut_menu->addAction(tr("Add to Desktop"));
@ -505,9 +499,6 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri
remove_vk_shader_cache->setVisible(program_id != 0); remove_vk_shader_cache->setVisible(program_id != 0);
remove_shader_cache->setVisible(program_id != 0); remove_shader_cache->setVisible(program_id != 0);
remove_all_content->setVisible(program_id != 0); remove_all_content->setVisible(program_id != 0);
auto& compat_list = item_model->GetCompatibilityList();
auto it = FindMatchingCompatibilityEntry(compat_list, program_id);
navigate_to_gamedb_entry->setVisible(it != compat_list.end() && program_id != 0);
connect(favorite, &QAction::triggered, this, connect(favorite, &QAction::triggered, this,
[this, program_id]() { ToggleFavorite(program_id); }); [this, program_id]() { ToggleFavorite(program_id); });
@ -567,9 +558,6 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri
[this, path]() { emit VerifyIntegrityRequested(path); }); [this, path]() { emit VerifyIntegrityRequested(path); });
connect(copy_tid, &QAction::triggered, this, connect(copy_tid, &QAction::triggered, this,
[this, program_id]() { emit CopyTIDRequested(program_id); }); [this, program_id]() { emit CopyTIDRequested(program_id); });
connect(navigate_to_gamedb_entry, &QAction::triggered, this, [this, program_id]() {
emit NavigateToGamedbEntryRequested(program_id, item_model->GetCompatibilityList());
});
#if !defined(__APPLE__) #if !defined(__APPLE__)
connect(create_desktop_shortcut, &QAction::triggered, this, [this, program_id, path]() { connect(create_desktop_shortcut, &QAction::triggered, this, [this, program_id, path]() {
emit CreateShortcut(program_id, path, QtCommon::Game::ShortcutTarget::Desktop); emit CreateShortcut(program_id, path, QtCommon::Game::ShortcutTarget::Desktop);

4
src/yuzu/game/game_list.h

@ -22,7 +22,6 @@
#include "qt_common/config/uisettings.h" #include "qt_common/config/uisettings.h"
#include "qt_common/game_list/model.h" #include "qt_common/game_list/model.h"
#include "qt_common/util/game.h" #include "qt_common/util/game.h"
#include "yuzu/compatibility_list.h"
class QVariantAnimation; class QVariantAnimation;
@ -76,7 +75,6 @@ public:
void SetFilterVisible(bool visibility); void SetFilterVisible(bool visibility);
bool IsEmpty() const; bool IsEmpty() const;
void LoadCompatibilityList();
void PopulateAsync(QVector<UISettings::GameDir>& game_dirs); void PopulateAsync(QVector<UISettings::GameDir>& game_dirs);
void SaveInterfaceLayout(); void SaveInterfaceLayout();
@ -111,8 +109,6 @@ signals:
void CopyTIDRequested(u64 program_id); void CopyTIDRequested(u64 program_id);
void CreateShortcut(u64 program_id, const std::string& game_path, void CreateShortcut(u64 program_id, const std::string& game_path,
const QtCommon::Game::ShortcutTarget target); const QtCommon::Game::ShortcutTarget target);
void NavigateToGamedbEntryRequested(u64 program_id,
const CompatibilityList& compatibility_list);
void OpenPerGameGeneralRequested(const std::string& file); void OpenPerGameGeneralRequested(const std::string& file);
void LinkToRyujinxRequested(const u64& program_id); void LinkToRyujinxRequested(const u64& program_id);
void OpenDirectory(const QString& directory); void OpenDirectory(const QString& directory);

11
src/yuzu/main.ui

@ -402,17 +402,6 @@
<string>Load/Remove &amp;Amiibo...</string> <string>Load/Remove &amp;Amiibo...</string>
</property> </property>
</action> </action>
<action name="action_Report_Compatibility">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>&amp;Report Compatibility</string>
</property>
<property name="visible">
<bool>false</bool>
</property>
</action>
<action name="action_Open_Mods_Page"> <action name="action_Open_Mods_Page">
<property name="text"> <property name="text">
<string>Open &amp;Mods Page</string> <string>Open &amp;Mods Page</string>

23
src/yuzu/main_window.cpp

@ -447,7 +447,6 @@ MainWindow::MainWindow(bool has_broken_vulkan)
if (Settings::values.use_dev_keys.GetValue()) { if (Settings::values.use_dev_keys.GetValue()) {
Core::Crypto::KeyManager::Instance().ReloadKeys(); Core::Crypto::KeyManager::Instance().ReloadKeys();
} }
game_list->LoadCompatibilityList();
game_list->PopulateAsync(UISettings::values.game_dirs); game_list->PopulateAsync(UISettings::values.game_dirs);
// Set up game list mode checkboxes. // Set up game list mode checkboxes.
@ -957,9 +956,6 @@ void MainWindow::WebBrowserRequestExit() {
} }
void MainWindow::InitializeWidgets() { void MainWindow::InitializeWidgets() {
#ifdef YUZU_ENABLE_COMPATIBILITY_REPORTING
ui->action_Report_Compatibility->setVisible(true);
#endif
render_window = new GRenderWindow(this, input_subsystem); render_window = new GRenderWindow(this, input_subsystem);
render_window->hide(); render_window->hide();
@ -1459,8 +1455,6 @@ void MainWindow::ConnectWidgetEvents() {
connect(game_list, &GameList::VerifyIntegrityRequested, this, connect(game_list, &GameList::VerifyIntegrityRequested, this,
&MainWindow::OnGameListVerifyIntegrity); &MainWindow::OnGameListVerifyIntegrity);
connect(game_list, &GameList::CopyTIDRequested, this, &MainWindow::OnGameListCopyTID); connect(game_list, &GameList::CopyTIDRequested, this, &MainWindow::OnGameListCopyTID);
connect(game_list, &GameList::NavigateToGamedbEntryRequested, this,
&MainWindow::OnGameListNavigateToGamedbEntry);
connect(game_list, &GameList::CreateShortcut, this, &MainWindow::OnGameListCreateShortcut); connect(game_list, &GameList::CreateShortcut, this, &MainWindow::OnGameListCreateShortcut);
connect(game_list, &GameList::AddDirectory, this, &MainWindow::OnGameListAddDirectory); connect(game_list, &GameList::AddDirectory, this, &MainWindow::OnGameListAddDirectory);
connect(game_list_placeholder, &GameListPlaceholder::AddDirectory, this, connect(game_list_placeholder, &GameListPlaceholder::AddDirectory, this,
@ -1505,7 +1499,6 @@ void MainWindow::ConnectMenuEvents() {
// Emulation // Emulation
connect_menu(ui->action_Pause, &MainWindow::OnPauseContinueGame); connect_menu(ui->action_Pause, &MainWindow::OnPauseContinueGame);
connect_menu(ui->action_Stop, &MainWindow::OnStopGame); connect_menu(ui->action_Stop, &MainWindow::OnStopGame);
connect_menu(ui->action_Report_Compatibility, &MainWindow::OnMenuReportCompatibility);
connect_menu(ui->action_Open_Mods_Page, &MainWindow::OnOpenModsPage); connect_menu(ui->action_Open_Mods_Page, &MainWindow::OnOpenModsPage);
connect_menu(ui->action_Open_Quickstart_Guide, &MainWindow::OnOpenQuickstartGuide); connect_menu(ui->action_Open_Quickstart_Guide, &MainWindow::OnOpenQuickstartGuide);
connect_menu(ui->action_Open_FAQ, &MainWindow::OnOpenFAQ); connect_menu(ui->action_Open_FAQ, &MainWindow::OnOpenFAQ);
@ -1639,7 +1632,6 @@ void MainWindow::UpdateMenuState() {
ui->action_Stop, ui->action_Stop,
ui->action_Restart, ui->action_Restart,
ui->action_Configure_Current_Game, ui->action_Configure_Current_Game,
ui->action_Report_Compatibility,
ui->action_Load_Amiibo, ui->action_Load_Amiibo,
ui->action_Pause, ui->action_Pause,
}; };
@ -2616,21 +2608,6 @@ void MainWindow::OnGameListCopyTID(u64 program_id) {
clipboard->setText(QString::fromStdString(fmt::format("{:016X}", program_id))); clipboard->setText(QString::fromStdString(fmt::format("{:016X}", program_id)));
} }
void MainWindow::OnGameListNavigateToGamedbEntry(u64 program_id,
const CompatibilityList& compatibility_list) {
const auto it = FindMatchingCompatibilityEntry(compatibility_list, program_id);
QString directory;
if (it != compatibility_list.end()) {
directory = it->second.second;
}
QDesktopServices::openUrl(QUrl(
QStringLiteral(
"https://www.emuready.com/listings?emulatorIds=43bfc023-ec22-422d-8324-048a8ec9f28f") +
directory));
}
void MainWindow::OnGameListCreateShortcut(u64 program_id, const std::string& game_path, void MainWindow::OnGameListCreateShortcut(u64 program_id, const std::string& game_path,
const QtCommon::Game::ShortcutTarget target) { const QtCommon::Game::ShortcutTarget target) {
// Create shortcu // Create shortcu

3
src/yuzu/main_window.h

@ -24,7 +24,6 @@
#include "qt_common/config/qt_config.h" #include "qt_common/config/qt_config.h"
#include "qt_common/qt_common.h" #include "qt_common/qt_common.h"
#include "qt_common/util/game.h" #include "qt_common/util/game.h"
#include "yuzu/compatibility_list.h"
#include "yuzu/hotkeys.h" #include "yuzu/hotkeys.h"
#include "yuzu/user_data_migration.h" #include "yuzu/user_data_migration.h"
@ -352,8 +351,6 @@ private slots:
void OnGameListDumpRomFS(u64 program_id, const std::string& game_path, DumpRomFSTarget target); void OnGameListDumpRomFS(u64 program_id, const std::string& game_path, DumpRomFSTarget target);
void OnGameListVerifyIntegrity(const std::string& game_path); void OnGameListVerifyIntegrity(const std::string& game_path);
void OnGameListCopyTID(u64 program_id); void OnGameListCopyTID(u64 program_id);
void OnGameListNavigateToGamedbEntry(u64 program_id,
const CompatibilityList& compatibility_list);
void OnGameListCreateShortcut(u64 program_id, const std::string& game_path, void OnGameListCreateShortcut(u64 program_id, const std::string& game_path,
const QtCommon::Game::ShortcutTarget target); const QtCommon::Game::ShortcutTarget target);
void OnGameListOpenDirectory(const QString& directory); void OnGameListOpenDirectory(const QString& directory);

Loading…
Cancel
Save