configure_per_game.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. // Copyright 2020 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <algorithm>
  5. #include <memory>
  6. #include <utility>
  7. #include <QCheckBox>
  8. #include <QHeaderView>
  9. #include <QMenu>
  10. #include <QStandardItemModel>
  11. #include <QString>
  12. #include <QTimer>
  13. #include <QTreeView>
  14. #include "common/common_paths.h"
  15. #include "common/file_util.h"
  16. #include "core/core.h"
  17. #include "core/file_sys/control_metadata.h"
  18. #include "core/file_sys/patch_manager.h"
  19. #include "core/file_sys/xts_archive.h"
  20. #include "core/loader/loader.h"
  21. #include "ui_configure_per_game.h"
  22. #include "yuzu/configuration/config.h"
  23. #include "yuzu/configuration/configure_input.h"
  24. #include "yuzu/configuration/configure_per_game.h"
  25. #include "yuzu/uisettings.h"
  26. #include "yuzu/util/util.h"
  27. ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id)
  28. : QDialog(parent), ui(std::make_unique<Ui::ConfigurePerGame>()), title_id(title_id) {
  29. game_config = std::make_unique<Config>(fmt::format("{:016X}", title_id),
  30. Config::ConfigType::PerGameConfig);
  31. Settings::SetConfiguringGlobal(false);
  32. ui->setupUi(this);
  33. setFocusPolicy(Qt::ClickFocus);
  34. setWindowTitle(tr("Properties"));
  35. ui->addonsTab->SetTitleId(title_id);
  36. scene = new QGraphicsScene;
  37. ui->icon_view->setScene(scene);
  38. LoadConfiguration();
  39. }
  40. ConfigurePerGame::~ConfigurePerGame() = default;
  41. void ConfigurePerGame::ApplyConfiguration() {
  42. ui->addonsTab->ApplyConfiguration();
  43. ui->generalTab->ApplyConfiguration();
  44. ui->systemTab->ApplyConfiguration();
  45. ui->graphicsTab->ApplyConfiguration();
  46. ui->graphicsAdvancedTab->ApplyConfiguration();
  47. ui->audioTab->ApplyConfiguration();
  48. Settings::Apply(Core::System::GetInstance());
  49. Settings::LogSettings();
  50. game_config->Save();
  51. }
  52. void ConfigurePerGame::changeEvent(QEvent* event) {
  53. if (event->type() == QEvent::LanguageChange) {
  54. RetranslateUI();
  55. }
  56. QDialog::changeEvent(event);
  57. }
  58. void ConfigurePerGame::RetranslateUI() {
  59. ui->retranslateUi(this);
  60. }
  61. void ConfigurePerGame::LoadFromFile(FileSys::VirtualFile file) {
  62. this->file = std::move(file);
  63. LoadConfiguration();
  64. }
  65. void ConfigurePerGame::LoadConfiguration() {
  66. if (file == nullptr) {
  67. return;
  68. }
  69. ui->addonsTab->LoadFromFile(file);
  70. ui->display_title_id->setText(
  71. QStringLiteral("%1").arg(title_id, 16, 16, QLatin1Char{'0'}).toUpper());
  72. auto& system = Core::System::GetInstance();
  73. const FileSys::PatchManager pm{title_id, system.GetFileSystemController(),
  74. system.GetContentProvider()};
  75. const auto control = pm.GetControlMetadata();
  76. const auto loader = Loader::GetLoader(system, file);
  77. if (control.first != nullptr) {
  78. ui->display_version->setText(QString::fromStdString(control.first->GetVersionString()));
  79. ui->display_name->setText(QString::fromStdString(control.first->GetApplicationName()));
  80. ui->display_developer->setText(QString::fromStdString(control.first->GetDeveloperName()));
  81. } else {
  82. std::string title;
  83. if (loader->ReadTitle(title) == Loader::ResultStatus::Success)
  84. ui->display_name->setText(QString::fromStdString(title));
  85. FileSys::NACP nacp;
  86. if (loader->ReadControlData(nacp) == Loader::ResultStatus::Success)
  87. ui->display_developer->setText(QString::fromStdString(nacp.GetDeveloperName()));
  88. ui->display_version->setText(QStringLiteral("1.0.0"));
  89. }
  90. if (control.second != nullptr) {
  91. scene->clear();
  92. QPixmap map;
  93. const auto bytes = control.second->ReadAllBytes();
  94. map.loadFromData(bytes.data(), static_cast<u32>(bytes.size()));
  95. scene->addPixmap(map.scaled(ui->icon_view->width(), ui->icon_view->height(),
  96. Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
  97. } else {
  98. std::vector<u8> bytes;
  99. if (loader->ReadIcon(bytes) == Loader::ResultStatus::Success) {
  100. scene->clear();
  101. QPixmap map;
  102. map.loadFromData(bytes.data(), static_cast<u32>(bytes.size()));
  103. scene->addPixmap(map.scaled(ui->icon_view->width(), ui->icon_view->height(),
  104. Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
  105. }
  106. }
  107. ui->display_filename->setText(QString::fromStdString(file->GetName()));
  108. ui->display_format->setText(
  109. QString::fromStdString(Loader::GetFileTypeString(loader->GetFileType())));
  110. const auto valueText = ReadableByteSize(file->GetSize());
  111. ui->display_size->setText(valueText);
  112. }