diff --git a/src/citra/config.cpp b/src/citra/config.cpp index bcb97372bb..477318ac02 100644 --- a/src/citra/config.cpp +++ b/src/citra/config.cpp @@ -203,14 +203,15 @@ void Config::ReadValues() { Settings::values.use_virtual_sd = sdl2_config->GetBoolean("Data Storage", "use_virtual_sd", true); - const std::string default_nand_dir = FileUtil::GetDefaultUserPath(FileUtil::UserPath::NANDDir); - FileUtil::UpdateUserPath( - FileUtil::UserPath::NANDDir, - sdl2_config->GetString("Data Storage", "nand_directory", default_nand_dir)); - const std::string default_sdmc_dir = FileUtil::GetDefaultUserPath(FileUtil::UserPath::SDMCDir); - FileUtil::UpdateUserPath( - FileUtil::UserPath::SDMCDir, - sdl2_config->GetString("Data Storage", "sdmc_directory", default_sdmc_dir)); + Settings::values.use_custom_storage = + sdl2_config->GetBoolean("Data Storage", "use_custom_storage", false); + + if (Settings::values.use_custom_storage) { + FileUtil::UpdateUserPath(FileUtil::UserPath::NANDDir, + sdl2_config->GetString("Data Storage", "nand_directory", "")); + FileUtil::UpdateUserPath(FileUtil::UserPath::SDMCDir, + sdl2_config->GetString("Data Storage", "sdmc_directory", "")); + } // System Settings::values.is_new_3ds = sdl2_config->GetBoolean("System", "is_new_3ds", true); diff --git a/src/citra/default_ini.h b/src/citra/default_ini.h index 55d8da8f54..568ff43be1 100644 --- a/src/citra/default_ini.h +++ b/src/citra/default_ini.h @@ -250,6 +250,10 @@ volume = # 1 (default): Yes, 0: No use_virtual_sd = +# Whether to use custom storage locations +# 1: Yes, 0 (default): No +use_custom_storage = + # The path of the virtual SD card directory. # empty (default) will use the user_path sdmc_directory = diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp index f486098491..b4dcd47593 100644 --- a/src/citra_qt/configuration/config.cpp +++ b/src/citra_qt/configuration/config.cpp @@ -304,21 +304,17 @@ void Config::ReadDataStorageValues() { Settings::values.use_virtual_sd = ReadSetting(QStringLiteral("use_virtual_sd"), true).toBool(); + Settings::values.use_custom_storage = + ReadSetting(QStringLiteral("use_custom_storage"), false).toBool(); const std::string nand_dir = - ReadSetting( - QStringLiteral("nand_directory"), - QString::fromStdString(FileUtil::GetDefaultUserPath(FileUtil::UserPath::NANDDir))) - .toString() - .toStdString(); + ReadSetting(QStringLiteral("nand_directory"), QStringLiteral("")).toString().toStdString(); const std::string sdmc_dir = - ReadSetting( - QStringLiteral("sdmc_directory"), - QString::fromStdString(FileUtil::GetDefaultUserPath(FileUtil::UserPath::SDMCDir))) - .toString() - .toStdString(); + ReadSetting(QStringLiteral("sdmc_directory"), QStringLiteral("")).toString().toStdString(); - FileUtil::UpdateUserPath(FileUtil::UserPath::NANDDir, nand_dir); - FileUtil::UpdateUserPath(FileUtil::UserPath::SDMCDir, sdmc_dir); + if (Settings::values.use_custom_storage) { + FileUtil::UpdateUserPath(FileUtil::UserPath::NANDDir, nand_dir); + FileUtil::UpdateUserPath(FileUtil::UserPath::SDMCDir, sdmc_dir); + } qt_config->endGroup(); } @@ -869,12 +865,13 @@ void Config::SaveDataStorageValues() { qt_config->beginGroup(QStringLiteral("Data Storage")); WriteSetting(QStringLiteral("use_virtual_sd"), Settings::values.use_virtual_sd, true); + WriteSetting(QStringLiteral("use_custom_storage"), Settings::values.use_custom_storage, false); WriteSetting(QStringLiteral("nand_directory"), QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir)), - QString::fromStdString(FileUtil::GetDefaultUserPath(FileUtil::UserPath::NANDDir))); + QStringLiteral("")); WriteSetting(QStringLiteral("sdmc_directory"), QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir)), - QString::fromStdString(FileUtil::GetDefaultUserPath(FileUtil::UserPath::SDMCDir))); + QStringLiteral("")); qt_config->endGroup(); } diff --git a/src/citra_qt/configuration/configure_storage.cpp b/src/citra_qt/configuration/configure_storage.cpp index dcc414630a..0432543503 100644 --- a/src/citra_qt/configuration/configure_storage.cpp +++ b/src/citra_qt/configuration/configure_storage.cpp @@ -51,28 +51,42 @@ ConfigureStorage::ConfigureStorage(QWidget* parent) ApplyConfiguration(); SetConfiguration(); }); + connect(ui->toggle_custom_storage, &QCheckBox::clicked, this, [this]() { + ApplyConfiguration(); + SetConfiguration(); + }); } ConfigureStorage::~ConfigureStorage() = default; void ConfigureStorage::SetConfiguration() { - ui->nand_group->setVisible(Settings::values.use_virtual_sd); + ui->nand_group->setVisible(Settings::values.use_custom_storage); QString nand_path = QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir)); ui->nand_dir_path->setText(nand_path); ui->open_nand_dir->setEnabled(!nand_path.isEmpty()); - ui->sdmc_group->setVisible(Settings::values.use_virtual_sd); + ui->sdmc_group->setVisible(Settings::values.use_virtual_sd && + Settings::values.use_custom_storage); QString sdmc_path = QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir)); ui->sdmc_dir_path->setText(sdmc_path); ui->open_sdmc_dir->setEnabled(!sdmc_path.isEmpty()); ui->toggle_virtual_sd->setChecked(Settings::values.use_virtual_sd); + ui->toggle_custom_storage->setChecked(Settings::values.use_custom_storage); ui->storage_group->setEnabled(!Core::System::GetInstance().IsPoweredOn()); } void ConfigureStorage::ApplyConfiguration() { Settings::values.use_virtual_sd = ui->toggle_virtual_sd->isChecked(); + Settings::values.use_custom_storage = ui->toggle_custom_storage->isChecked(); + + if (!Settings::values.use_custom_storage) { + FileUtil::UpdateUserPath(FileUtil::UserPath::NANDDir, + GetDefaultUserPath(FileUtil::UserPath::NANDDir)); + FileUtil::UpdateUserPath(FileUtil::UserPath::SDMCDir, + GetDefaultUserPath(FileUtil::UserPath::SDMCDir)); + } } void ConfigureStorage::RetranslateUI() { diff --git a/src/citra_qt/configuration/configure_storage.ui b/src/citra_qt/configuration/configure_storage.ui index 5571d200fd..75c5a8a3f2 100644 --- a/src/citra_qt/configuration/configure_storage.ui +++ b/src/citra_qt/configuration/configure_storage.ui @@ -34,131 +34,147 @@ - + - + Custom Storage - + - - - - - NAND Directory - - - - - - - false - - - - - - - Open - - - - + + + Use Custom Storage + + - - - - - NOTE: This does not move the contents of the previous directory to the new one. - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Change - - - - - - - - - - - - - - - - - - - - SDMC Directory - - - - - - - false - - - - - - - Open - - - - + + + + + + + + + + + NAND Directory + + + + + + + false + + + + + + + Open + + + + + + + + + + + NOTE: This does not move the contents of the previous directory to the new one. + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Change + + + + + + + - - - - - NOTE: This does not move the contents of the previous directory to the new one. - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Change - - - - + + + + + + + + + + + SDMC Directory + + + + + + + false + + + + + + + Open + + + + + + + + + + + NOTE: This does not move the contents of the previous directory to the new one. + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Change + + + + + + + diff --git a/src/common/file_util.cpp b/src/common/file_util.cpp index 436d94406c..53071b5244 100644 --- a/src/common/file_util.cpp +++ b/src/common/file_util.cpp @@ -774,6 +774,9 @@ const std::string& GetDefaultUserPath(UserPath path) { } const void UpdateUserPath(UserPath path, const std::string& filename) { + if (filename.empty()) { + return; + } if (!FileUtil::IsDirectory(filename)) { LOG_ERROR(Common_Filesystem, "Path is not a directory. UserPath: {} filename: {}", path, filename); diff --git a/src/core/settings.cpp b/src/core/settings.cpp index c5c1b6155d..3a26e72174 100644 --- a/src/core/settings.cpp +++ b/src/core/settings.cpp @@ -120,8 +120,11 @@ void LogSettings() { log_setting("Camera_OuterLeftConfig", values.camera_config[OuterLeftCamera]); log_setting("Camera_OuterLeftFlip", values.camera_flip[OuterLeftCamera]); log_setting("DataStorage_UseVirtualSd", values.use_virtual_sd); - log_setting("DataStorage_SdmcDir", FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir)); - log_setting("DataStorage_NandDir", FileUtil::GetUserPath(FileUtil::UserPath::NANDDir)); + log_setting("DataStorage_UseCustomStorage", values.use_custom_storage); + if (values.use_custom_storage) { + log_setting("DataStorage_SdmcDir", FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir)); + log_setting("DataStorage_NandDir", FileUtil::GetUserPath(FileUtil::UserPath::NANDDir)); + } log_setting("System_IsNew3ds", values.is_new_3ds); log_setting("System_RegionValue", values.region_value); log_setting("Debugging_UseGdbstub", values.use_gdbstub); diff --git a/src/core/settings.h b/src/core/settings.h index 98614deae6..b7d35e070b 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -155,6 +155,7 @@ struct Values { // Data Storage bool use_virtual_sd; + bool use_custom_storage; // System int region_value;