configure_filesystem.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include <QFileDialog>
  4. #include <QMessageBox>
  5. #include "common/fs/fs.h"
  6. #include "common/fs/path_util.h"
  7. #include "common/settings.h"
  8. #include "ui_configure_filesystem.h"
  9. #include "yuzu/configuration/configure_filesystem.h"
  10. #include "yuzu/uisettings.h"
  11. ConfigureFilesystem::ConfigureFilesystem(QWidget* parent)
  12. : QWidget(parent), ui(std::make_unique<Ui::ConfigureFilesystem>()) {
  13. ui->setupUi(this);
  14. SetConfiguration();
  15. connect(ui->nand_directory_button, &QToolButton::pressed, this,
  16. [this] { SetDirectory(DirectoryTarget::NAND, ui->nand_directory_edit); });
  17. connect(ui->sdmc_directory_button, &QToolButton::pressed, this,
  18. [this] { SetDirectory(DirectoryTarget::SD, ui->sdmc_directory_edit); });
  19. connect(ui->gamecard_path_button, &QToolButton::pressed, this,
  20. [this] { SetDirectory(DirectoryTarget::Gamecard, ui->gamecard_path_edit); });
  21. connect(ui->dump_path_button, &QToolButton::pressed, this,
  22. [this] { SetDirectory(DirectoryTarget::Dump, ui->dump_path_edit); });
  23. connect(ui->load_path_button, &QToolButton::pressed, this,
  24. [this] { SetDirectory(DirectoryTarget::Load, ui->load_path_edit); });
  25. connect(ui->reset_game_list_cache, &QPushButton::pressed, this,
  26. &ConfigureFilesystem::ResetMetadata);
  27. connect(ui->gamecard_inserted, &QCheckBox::stateChanged, this,
  28. &ConfigureFilesystem::UpdateEnabledControls);
  29. connect(ui->gamecard_current_game, &QCheckBox::stateChanged, this,
  30. &ConfigureFilesystem::UpdateEnabledControls);
  31. }
  32. ConfigureFilesystem::~ConfigureFilesystem() = default;
  33. void ConfigureFilesystem::changeEvent(QEvent* event) {
  34. if (event->type() == QEvent::LanguageChange) {
  35. RetranslateUI();
  36. }
  37. QWidget::changeEvent(event);
  38. }
  39. void ConfigureFilesystem::SetConfiguration() {
  40. ui->nand_directory_edit->setText(
  41. QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::NANDDir)));
  42. ui->sdmc_directory_edit->setText(
  43. QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::SDMCDir)));
  44. ui->gamecard_path_edit->setText(
  45. QString::fromStdString(Settings::values.gamecard_path.GetValue()));
  46. ui->dump_path_edit->setText(
  47. QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::DumpDir)));
  48. ui->load_path_edit->setText(
  49. QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::LoadDir)));
  50. ui->gamecard_inserted->setChecked(Settings::values.gamecard_inserted.GetValue());
  51. ui->gamecard_current_game->setChecked(Settings::values.gamecard_current_game.GetValue());
  52. ui->dump_exefs->setChecked(Settings::values.dump_exefs.GetValue());
  53. ui->dump_nso->setChecked(Settings::values.dump_nso.GetValue());
  54. ui->cache_game_list->setChecked(UISettings::values.cache_game_list.GetValue());
  55. UpdateEnabledControls();
  56. }
  57. void ConfigureFilesystem::ApplyConfiguration() {
  58. Common::FS::SetYuzuPath(Common::FS::YuzuPath::NANDDir,
  59. ui->nand_directory_edit->text().toStdString());
  60. Common::FS::SetYuzuPath(Common::FS::YuzuPath::SDMCDir,
  61. ui->sdmc_directory_edit->text().toStdString());
  62. Common::FS::SetYuzuPath(Common::FS::YuzuPath::DumpDir,
  63. ui->dump_path_edit->text().toStdString());
  64. Common::FS::SetYuzuPath(Common::FS::YuzuPath::LoadDir,
  65. ui->load_path_edit->text().toStdString());
  66. Settings::values.gamecard_inserted = ui->gamecard_inserted->isChecked();
  67. Settings::values.gamecard_current_game = ui->gamecard_current_game->isChecked();
  68. Settings::values.dump_exefs = ui->dump_exefs->isChecked();
  69. Settings::values.dump_nso = ui->dump_nso->isChecked();
  70. UISettings::values.cache_game_list = ui->cache_game_list->isChecked();
  71. }
  72. void ConfigureFilesystem::SetDirectory(DirectoryTarget target, QLineEdit* edit) {
  73. QString caption;
  74. switch (target) {
  75. case DirectoryTarget::NAND:
  76. caption = tr("Select Emulated NAND Directory...");
  77. break;
  78. case DirectoryTarget::SD:
  79. caption = tr("Select Emulated SD Directory...");
  80. break;
  81. case DirectoryTarget::Gamecard:
  82. caption = tr("Select Gamecard Path...");
  83. break;
  84. case DirectoryTarget::Dump:
  85. caption = tr("Select Dump Directory...");
  86. break;
  87. case DirectoryTarget::Load:
  88. caption = tr("Select Mod Load Directory...");
  89. break;
  90. }
  91. QString str;
  92. if (target == DirectoryTarget::Gamecard) {
  93. str = QFileDialog::getOpenFileName(this, caption, QFileInfo(edit->text()).dir().path(),
  94. QStringLiteral("NX Gamecard;*.xci"));
  95. } else {
  96. str = QFileDialog::getExistingDirectory(this, caption, edit->text());
  97. }
  98. if (str.isNull() || str.isEmpty()) {
  99. return;
  100. }
  101. if (str.back() != QChar::fromLatin1('/')) {
  102. str.append(QChar::fromLatin1('/'));
  103. }
  104. edit->setText(str);
  105. }
  106. void ConfigureFilesystem::ResetMetadata() {
  107. if (!Common::FS::Exists(Common::FS::GetYuzuPath(Common::FS::YuzuPath::CacheDir) /
  108. "game_list/")) {
  109. QMessageBox::information(this, tr("Reset Metadata Cache"),
  110. tr("The metadata cache is already empty."));
  111. } else if (Common::FS::RemoveDirRecursively(
  112. Common::FS::GetYuzuPath(Common::FS::YuzuPath::CacheDir) / "game_list")) {
  113. QMessageBox::information(this, tr("Reset Metadata Cache"),
  114. tr("The operation completed successfully."));
  115. UISettings::values.is_game_list_reload_pending.exchange(true);
  116. } else {
  117. QMessageBox::warning(
  118. this, tr("Reset Metadata Cache"),
  119. tr("The metadata cache couldn't be deleted. It might be in use or non-existent."));
  120. }
  121. }
  122. void ConfigureFilesystem::UpdateEnabledControls() {
  123. ui->gamecard_current_game->setEnabled(ui->gamecard_inserted->isChecked());
  124. ui->gamecard_path_edit->setEnabled(ui->gamecard_inserted->isChecked() &&
  125. !ui->gamecard_current_game->isChecked());
  126. ui->gamecard_path_button->setEnabled(ui->gamecard_inserted->isChecked() &&
  127. !ui->gamecard_current_game->isChecked());
  128. }
  129. void ConfigureFilesystem::RetranslateUI() {
  130. ui->retranslateUi(this);
  131. }