configure_per_game.cpp 4.4 KB

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