mirror of
https://git.eden-emu.dev/archive/citron
synced 2026-03-22 17:46:08 -04:00
Fix Compiler Issues Multiplatform
This commit is contained in:
@@ -8,14 +8,21 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include <QHeaderView>
|
#include <QDesktopServices>
|
||||||
|
#include <QDir>
|
||||||
#include <QHBoxLayout>
|
#include <QHBoxLayout>
|
||||||
|
#include <QHeaderView>
|
||||||
|
#include <QMenu>
|
||||||
|
#include <QMessageBox>
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
#include <QSignalBlocker>
|
#include <QSignalBlocker>
|
||||||
#include <QStandardItemModel>
|
#include <QStandardItemModel>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QTreeView>
|
#include <QTreeView>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
|
#include "citron/configuration/configure_per_game_cheats.h"
|
||||||
|
#include "common/fs/path_util.h"
|
||||||
#include "common/hex_util.h"
|
#include "common/hex_util.h"
|
||||||
#include "common/settings.h"
|
#include "common/settings.h"
|
||||||
#include "common/string_util.h"
|
#include "common/string_util.h"
|
||||||
@@ -28,7 +35,6 @@
|
|||||||
#include "core/loader/loader.h"
|
#include "core/loader/loader.h"
|
||||||
#include "core/memory/cheat_engine.h"
|
#include "core/memory/cheat_engine.h"
|
||||||
#include "ui_configure_per_game_cheats.h"
|
#include "ui_configure_per_game_cheats.h"
|
||||||
#include "citron/configuration/configure_per_game_cheats.h"
|
|
||||||
|
|
||||||
ConfigurePerGameCheats::ConfigurePerGameCheats(Core::System& system_, QWidget* parent)
|
ConfigurePerGameCheats::ConfigurePerGameCheats(Core::System& system_, QWidget* parent)
|
||||||
: QWidget(parent), ui{std::make_unique<Ui::ConfigurePerGameCheats>()}, system{system_} {
|
: QWidget(parent), ui{std::make_unique<Ui::ConfigurePerGameCheats>()}, system{system_} {
|
||||||
@@ -46,7 +52,10 @@ ConfigurePerGameCheats::ConfigurePerGameCheats(Core::System& system_, QWidget* p
|
|||||||
tree_view->setSortingEnabled(true);
|
tree_view->setSortingEnabled(true);
|
||||||
tree_view->setEditTriggers(QHeaderView::NoEditTriggers);
|
tree_view->setEditTriggers(QHeaderView::NoEditTriggers);
|
||||||
tree_view->setUniformRowHeights(true);
|
tree_view->setUniformRowHeights(true);
|
||||||
tree_view->setContextMenuPolicy(Qt::NoContextMenu);
|
tree_view->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||||
|
|
||||||
|
connect(tree_view, &QTreeView::customContextMenuRequested, this,
|
||||||
|
&ConfigurePerGameCheats::OnContextMenu);
|
||||||
|
|
||||||
item_model->insertColumns(0, 1);
|
item_model->insertColumns(0, 1);
|
||||||
item_model->setHeaderData(0, Qt::Horizontal, tr("Cheat Name"));
|
item_model->setHeaderData(0, Qt::Horizontal, tr("Cheat Name"));
|
||||||
@@ -64,9 +73,11 @@ ConfigurePerGameCheats::ConfigurePerGameCheats(Core::System& system_, QWidget* p
|
|||||||
enable_all_button = new QPushButton(tr("Enable All"));
|
enable_all_button = new QPushButton(tr("Enable All"));
|
||||||
disable_all_button = new QPushButton(tr("Disable All"));
|
disable_all_button = new QPushButton(tr("Disable All"));
|
||||||
save_button = new QPushButton(tr("Save"));
|
save_button = new QPushButton(tr("Save"));
|
||||||
|
refresh_button = new QPushButton(tr("Refresh"));
|
||||||
|
|
||||||
button_layout->addWidget(enable_all_button);
|
button_layout->addWidget(enable_all_button);
|
||||||
button_layout->addWidget(disable_all_button);
|
button_layout->addWidget(disable_all_button);
|
||||||
|
button_layout->addWidget(refresh_button);
|
||||||
button_layout->addStretch();
|
button_layout->addStretch();
|
||||||
button_layout->addWidget(save_button);
|
button_layout->addWidget(save_button);
|
||||||
|
|
||||||
@@ -83,8 +94,8 @@ ConfigurePerGameCheats::ConfigurePerGameCheats(Core::System& system_, QWidget* p
|
|||||||
&ConfigurePerGameCheats::EnableAllCheats);
|
&ConfigurePerGameCheats::EnableAllCheats);
|
||||||
connect(disable_all_button, &QPushButton::clicked, this,
|
connect(disable_all_button, &QPushButton::clicked, this,
|
||||||
&ConfigurePerGameCheats::DisableAllCheats);
|
&ConfigurePerGameCheats::DisableAllCheats);
|
||||||
connect(save_button, &QPushButton::clicked, this,
|
connect(save_button, &QPushButton::clicked, this, &ConfigurePerGameCheats::SaveCheatSettings);
|
||||||
&ConfigurePerGameCheats::SaveCheatSettings);
|
connect(refresh_button, &QPushButton::clicked, this, &ConfigurePerGameCheats::RefreshCheats);
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigurePerGameCheats::~ConfigurePerGameCheats() = default;
|
ConfigurePerGameCheats::~ConfigurePerGameCheats() = default;
|
||||||
@@ -194,7 +205,8 @@ void ConfigurePerGameCheats::LoadConfiguration() {
|
|||||||
FileSys::XCI xci(file, title_id, 0);
|
FileSys::XCI xci(file, title_id, 0);
|
||||||
if (xci.GetStatus() == Loader::ResultStatus::Success) {
|
if (xci.GetStatus() == Loader::ResultStatus::Success) {
|
||||||
auto program_nca = xci.GetNCAByType(FileSys::NCAContentType::Program);
|
auto program_nca = xci.GetNCAByType(FileSys::NCAContentType::Program);
|
||||||
if (program_nca && program_nca->GetStatus() == Loader::ResultStatus::Success) {
|
if (program_nca &&
|
||||||
|
program_nca->GetStatus() == Loader::ResultStatus::Success) {
|
||||||
auto exefs = program_nca->GetExeFS();
|
auto exefs = program_nca->GetExeFS();
|
||||||
if (exefs) {
|
if (exefs) {
|
||||||
main_nso = exefs->GetFile("main");
|
main_nso = exefs->GetFile("main");
|
||||||
@@ -241,7 +253,8 @@ void ConfigurePerGameCheats::LoadConfiguration() {
|
|||||||
if (load_dir) {
|
if (load_dir) {
|
||||||
auto patch_dirs = load_dir->GetSubdirectories();
|
auto patch_dirs = load_dir->GetSubdirectories();
|
||||||
for (const auto& subdir : patch_dirs) {
|
for (const auto& subdir : patch_dirs) {
|
||||||
if (!subdir) continue;
|
if (!subdir)
|
||||||
|
continue;
|
||||||
|
|
||||||
// Use case-insensitive directory search (same as FindSubdirectoryCaseless)
|
// Use case-insensitive directory search (same as FindSubdirectoryCaseless)
|
||||||
FileSys::VirtualDir cheats_dir;
|
FileSys::VirtualDir cheats_dir;
|
||||||
@@ -288,8 +301,10 @@ void ConfigurePerGameCheats::LoadConfiguration() {
|
|||||||
try {
|
try {
|
||||||
// Pad to full 64 chars (32 bytes) with zeros
|
// Pad to full 64 chars (32 bytes) with zeros
|
||||||
// Keep the case as-is from the filename
|
// Keep the case as-is from the filename
|
||||||
auto full_build_id_hex = potential_build_id + std::string(48, '0');
|
auto full_build_id_hex =
|
||||||
auto build_id_bytes = Common::HexStringToArray<0x20>(full_build_id_hex);
|
potential_build_id + std::string(48, '0');
|
||||||
|
auto build_id_bytes =
|
||||||
|
Common::HexStringToArray<0x20>(full_build_id_hex);
|
||||||
|
|
||||||
// Verify the result is not all zeros
|
// Verify the result is not all zeros
|
||||||
bool is_valid_result = false;
|
bool is_valid_result = false;
|
||||||
@@ -311,7 +326,8 @@ void ConfigurePerGameCheats::LoadConfiguration() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (has_build_id) break;
|
if (has_build_id)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -353,9 +369,9 @@ void ConfigurePerGameCheats::LoadConfiguration() {
|
|||||||
// Add cheats to tree view
|
// Add cheats to tree view
|
||||||
for (const auto& cheat : cheats) {
|
for (const auto& cheat : cheats) {
|
||||||
// Extract cheat name from readable_name (null-terminated)
|
// Extract cheat name from readable_name (null-terminated)
|
||||||
const std::string cheat_name_str(cheat.definition.readable_name.data(),
|
const std::string cheat_name_str(
|
||||||
strnlen(cheat.definition.readable_name.data(),
|
cheat.definition.readable_name.data(),
|
||||||
cheat.definition.readable_name.size()));
|
strnlen(cheat.definition.readable_name.data(), cheat.definition.readable_name.size()));
|
||||||
|
|
||||||
// Skip empty cheat names or cheats with no opcodes
|
// Skip empty cheat names or cheats with no opcodes
|
||||||
if (cheat_name_str.empty() || cheat.definition.num_opcodes == 0) {
|
if (cheat_name_str.empty() || cheat.definition.num_opcodes == 0) {
|
||||||
@@ -369,7 +385,8 @@ void ConfigurePerGameCheats::LoadConfiguration() {
|
|||||||
cheat_item->setCheckable(true);
|
cheat_item->setCheckable(true);
|
||||||
|
|
||||||
// Check if cheat is disabled
|
// Check if cheat is disabled
|
||||||
const bool cheat_disabled = disabled_cheats_set.find(cheat_name_str) != disabled_cheats_set.end();
|
const bool cheat_disabled =
|
||||||
|
disabled_cheats_set.find(cheat_name_str) != disabled_cheats_set.end();
|
||||||
cheat_item->setCheckState(cheat_disabled ? Qt::Unchecked : Qt::Checked);
|
cheat_item->setCheckState(cheat_disabled ? Qt::Unchecked : Qt::Checked);
|
||||||
|
|
||||||
list_items.push_back(QList<QStandardItem*>{cheat_item});
|
list_items.push_back(QList<QStandardItem*>{cheat_item});
|
||||||
@@ -474,3 +491,26 @@ void ConfigurePerGameCheats::ReloadCheatEngine() const {
|
|||||||
const auto cheats = pm.CreateCheatList(current_build_id);
|
const auto cheats = pm.CreateCheatList(current_build_id);
|
||||||
cheat_engine->Reload(cheats);
|
cheat_engine->Reload(cheats);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ConfigurePerGameCheats::OnContextMenu(const QPoint& pos) {
|
||||||
|
const auto index = tree_view->indexAt(pos);
|
||||||
|
if (!index.isValid()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QMenu context_menu;
|
||||||
|
|
||||||
|
auto* open_folder_action = context_menu.addAction(tr("Open Cheats Folder"));
|
||||||
|
connect(open_folder_action, &QAction::triggered, this, [this] {
|
||||||
|
const auto cheats_dir = Common::FS::GetCitronPath(Common::FS::CitronPath::LoadDir) /
|
||||||
|
fmt::format("{:016X}", title_id) / "cheats";
|
||||||
|
QDir().mkpath(QString::fromStdString(cheats_dir.string()));
|
||||||
|
QDesktopServices::openUrl(QUrl::fromLocalFile(QString::fromStdString(cheats_dir.string())));
|
||||||
|
});
|
||||||
|
|
||||||
|
context_menu.exec(tree_view->viewport()->mapToGlobal(pos));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigurePerGameCheats::RefreshCheats() {
|
||||||
|
LoadConfiguration();
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,8 +1,29 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
// Suppress warnings from stb headers - use compiler-specific pragmas
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable : 4244) // conversion, possible loss of data
|
||||||
|
#pragma warning(disable : 4456) // declaration hides previous local declaration
|
||||||
|
#pragma warning(disable : 4457) // declaration hides function parameter
|
||||||
|
#pragma warning(disable : 4701) // potentially uninitialized local variable
|
||||||
|
#pragma warning(disable : 4703) // potentially uninitialized local pointer variable
|
||||||
|
#elif defined(__clang__)
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Wunused-function"
|
||||||
|
#pragma clang diagnostic ignored "-Wimplicit-int-conversion"
|
||||||
|
#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion"
|
||||||
|
#pragma clang diagnostic ignored "-Wimplicit-fallthrough"
|
||||||
|
#pragma clang diagnostic ignored "-Wfloat-conversion"
|
||||||
|
#pragma clang diagnostic ignored "-Wconversion"
|
||||||
|
#pragma clang diagnostic ignored "-Wsign-conversion"
|
||||||
|
#elif defined(__GNUC__)
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
|
#pragma GCC diagnostic ignored "-Wconversion"
|
||||||
|
#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define STB_IMAGE_IMPLEMENTATION
|
#define STB_IMAGE_IMPLEMENTATION
|
||||||
#define STB_IMAGE_STATIC
|
#define STB_IMAGE_STATIC
|
||||||
@@ -14,7 +35,13 @@
|
|||||||
#include <stb_image_resize.h>
|
#include <stb_image_resize.h>
|
||||||
#include <stb_image_write.h>
|
#include <stb_image_write.h>
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(pop)
|
||||||
|
#elif defined(__clang__)
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
#elif defined(__GNUC__)
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|||||||
Reference in New Issue
Block a user