mirror of
https://git.citron-emu.org/Citron/Citron.git
synced 2025-02-18 22:38:48 +01:00
* common: fs: fs_types: Create filesystem types Contains various filesystem types used by the Common::FS library * common: fs: fs_util: Add std::string to std::u8string conversion utility * common: fs: path_util: Add utlity functions for paths Contains various utility functions for getting or manipulating filesystem paths used by the Common::FS library * common: fs: file: Rewrite the IOFile implementation * common: fs: Reimplement Common::FS library using std::filesystem * common: fs: fs_paths: Add fs_paths to replace common_paths * common: fs: path_util: Add the rest of the path functions * common: Remove the previous Common::FS implementation * general: Remove unused fs includes * string_util: Remove unused function and include * nvidia_flags: Migrate to the new Common::FS library * settings: Migrate to the new Common::FS library * logging: backend: Migrate to the new Common::FS library * core: Migrate to the new Common::FS library * perf_stats: Migrate to the new Common::FS library * reporter: Migrate to the new Common::FS library * telemetry_session: Migrate to the new Common::FS library * key_manager: Migrate to the new Common::FS library * bis_factory: Migrate to the new Common::FS library * registered_cache: Migrate to the new Common::FS library * xts_archive: Migrate to the new Common::FS library * service: acc: Migrate to the new Common::FS library * applets/profile: Migrate to the new Common::FS library * applets/web: Migrate to the new Common::FS library * service: filesystem: Migrate to the new Common::FS library * loader: Migrate to the new Common::FS library * gl_shader_disk_cache: Migrate to the new Common::FS library * nsight_aftermath_tracker: Migrate to the new Common::FS library * vulkan_library: Migrate to the new Common::FS library * configure_debug: Migrate to the new Common::FS library * game_list_worker: Migrate to the new Common::FS library * config: Migrate to the new Common::FS library * configure_filesystem: Migrate to the new Common::FS library * configure_per_game_addons: Migrate to the new Common::FS library * configure_profile_manager: Migrate to the new Common::FS library * configure_ui: Migrate to the new Common::FS library * input_profiles: Migrate to the new Common::FS library * yuzu_cmd: config: Migrate to the new Common::FS library * yuzu_cmd: Migrate to the new Common::FS library * vfs_real: Migrate to the new Common::FS library * vfs: Migrate to the new Common::FS library * vfs_libzip: Migrate to the new Common::FS library * service: bcat: Migrate to the new Common::FS library * yuzu: main: Migrate to the new Common::FS library * vfs_real: Delete the contents of an existing file in CreateFile Current usages of CreateFile expect to delete the contents of an existing file, retain this behavior for now. * input_profiles: Don't iterate the input profile dir if it does not exist Silences an error produced in the log if the directory does not exist. * game_list_worker: Skip parsing file if the returned VfsFile is nullptr Prevents crashes in GetLoader when the virtual file is nullptr * common: fs: Validate paths for path length * service: filesystem: Open the mod load directory as read only
143 lines
4.6 KiB
C++
143 lines
4.6 KiB
C++
// Copyright 2020 yuzu Emulator Project
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#include <algorithm>
|
|
#include <memory>
|
|
#include <utility>
|
|
|
|
#include <QCheckBox>
|
|
#include <QHeaderView>
|
|
#include <QMenu>
|
|
#include <QStandardItemModel>
|
|
#include <QString>
|
|
#include <QTimer>
|
|
#include <QTreeView>
|
|
|
|
#include "core/core.h"
|
|
#include "core/file_sys/control_metadata.h"
|
|
#include "core/file_sys/patch_manager.h"
|
|
#include "core/file_sys/xts_archive.h"
|
|
#include "core/loader/loader.h"
|
|
#include "ui_configure_per_game.h"
|
|
#include "yuzu/configuration/config.h"
|
|
#include "yuzu/configuration/configure_input.h"
|
|
#include "yuzu/configuration/configure_per_game.h"
|
|
#include "yuzu/uisettings.h"
|
|
#include "yuzu/util/util.h"
|
|
|
|
ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id)
|
|
: QDialog(parent), ui(std::make_unique<Ui::ConfigurePerGame>()), title_id(title_id) {
|
|
game_config = std::make_unique<Config>(fmt::format("{:016X}", title_id),
|
|
Config::ConfigType::PerGameConfig);
|
|
|
|
Settings::SetConfiguringGlobal(false);
|
|
|
|
ui->setupUi(this);
|
|
setFocusPolicy(Qt::ClickFocus);
|
|
setWindowTitle(tr("Properties"));
|
|
|
|
ui->addonsTab->SetTitleId(title_id);
|
|
|
|
scene = new QGraphicsScene;
|
|
ui->icon_view->setScene(scene);
|
|
|
|
LoadConfiguration();
|
|
}
|
|
|
|
ConfigurePerGame::~ConfigurePerGame() = default;
|
|
|
|
void ConfigurePerGame::ApplyConfiguration() {
|
|
ui->addonsTab->ApplyConfiguration();
|
|
ui->generalTab->ApplyConfiguration();
|
|
ui->cpuTab->ApplyConfiguration();
|
|
ui->systemTab->ApplyConfiguration();
|
|
ui->graphicsTab->ApplyConfiguration();
|
|
ui->graphicsAdvancedTab->ApplyConfiguration();
|
|
ui->audioTab->ApplyConfiguration();
|
|
|
|
Core::System::GetInstance().ApplySettings();
|
|
Settings::LogSettings();
|
|
|
|
game_config->Save();
|
|
}
|
|
|
|
void ConfigurePerGame::changeEvent(QEvent* event) {
|
|
if (event->type() == QEvent::LanguageChange) {
|
|
RetranslateUI();
|
|
}
|
|
|
|
QDialog::changeEvent(event);
|
|
}
|
|
|
|
void ConfigurePerGame::RetranslateUI() {
|
|
ui->retranslateUi(this);
|
|
}
|
|
|
|
void ConfigurePerGame::LoadFromFile(FileSys::VirtualFile file) {
|
|
this->file = std::move(file);
|
|
LoadConfiguration();
|
|
}
|
|
|
|
void ConfigurePerGame::LoadConfiguration() {
|
|
if (file == nullptr) {
|
|
return;
|
|
}
|
|
|
|
ui->addonsTab->LoadFromFile(file);
|
|
|
|
ui->display_title_id->setText(
|
|
QStringLiteral("%1").arg(title_id, 16, 16, QLatin1Char{'0'}).toUpper());
|
|
|
|
auto& system = Core::System::GetInstance();
|
|
const FileSys::PatchManager pm{title_id, system.GetFileSystemController(),
|
|
system.GetContentProvider()};
|
|
const auto control = pm.GetControlMetadata();
|
|
const auto loader = Loader::GetLoader(system, file);
|
|
|
|
if (control.first != nullptr) {
|
|
ui->display_version->setText(QString::fromStdString(control.first->GetVersionString()));
|
|
ui->display_name->setText(QString::fromStdString(control.first->GetApplicationName()));
|
|
ui->display_developer->setText(QString::fromStdString(control.first->GetDeveloperName()));
|
|
} else {
|
|
std::string title;
|
|
if (loader->ReadTitle(title) == Loader::ResultStatus::Success)
|
|
ui->display_name->setText(QString::fromStdString(title));
|
|
|
|
FileSys::NACP nacp;
|
|
if (loader->ReadControlData(nacp) == Loader::ResultStatus::Success)
|
|
ui->display_developer->setText(QString::fromStdString(nacp.GetDeveloperName()));
|
|
|
|
ui->display_version->setText(QStringLiteral("1.0.0"));
|
|
}
|
|
|
|
if (control.second != nullptr) {
|
|
scene->clear();
|
|
|
|
QPixmap map;
|
|
const auto bytes = control.second->ReadAllBytes();
|
|
map.loadFromData(bytes.data(), static_cast<u32>(bytes.size()));
|
|
|
|
scene->addPixmap(map.scaled(ui->icon_view->width(), ui->icon_view->height(),
|
|
Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
|
|
} else {
|
|
std::vector<u8> bytes;
|
|
if (loader->ReadIcon(bytes) == Loader::ResultStatus::Success) {
|
|
scene->clear();
|
|
|
|
QPixmap map;
|
|
map.loadFromData(bytes.data(), static_cast<u32>(bytes.size()));
|
|
|
|
scene->addPixmap(map.scaled(ui->icon_view->width(), ui->icon_view->height(),
|
|
Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
|
|
}
|
|
}
|
|
|
|
ui->display_filename->setText(QString::fromStdString(file->GetName()));
|
|
|
|
ui->display_format->setText(
|
|
QString::fromStdString(Loader::GetFileTypeString(loader->GetFileType())));
|
|
|
|
const auto valueText = ReadableByteSize(file->GetSize());
|
|
ui->display_size->setText(valueText);
|
|
}
|