diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt
index 24c2ca601..4f64f7be6 100644
--- a/src/citra_qt/CMakeLists.txt
+++ b/src/citra_qt/CMakeLists.txt
@@ -66,6 +66,9 @@ add_executable(citra-qt
configuration/configure_motion_touch.cpp
configuration/configure_motion_touch.h
configuration/configure_motion_touch.ui
+ configuration/configure_storage.cpp
+ configuration/configure_storage.h
+ configuration/configure_storage.ui
configuration/configure_system.cpp
configuration/configure_system.h
configuration/configure_system.ui
diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp
index 2b5ab6cd3..28612bbd0 100644
--- a/src/citra_qt/configuration/config.cpp
+++ b/src/citra_qt/configuration/config.cpp
@@ -863,8 +863,10 @@ void Config::SaveDataStorageValues() {
WriteSetting(QStringLiteral("use_virtual_sd"), Settings::values.use_virtual_sd, true);
WriteSetting(QStringLiteral("nand_directory"),
+ QString::fromStdString(Settings::values.nand_dir),
QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir)));
WriteSetting(QStringLiteral("sdmc_directory"),
+ QString::fromStdString(Settings::values.sdmc_dir),
QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir)));
qt_config->endGroup();
diff --git a/src/citra_qt/configuration/configure.ui b/src/citra_qt/configuration/configure.ui
index efe53606e..1774ccbc1 100644
--- a/src/citra_qt/configuration/configure.ui
+++ b/src/citra_qt/configuration/configure.ui
@@ -68,6 +68,11 @@
Debug
+
+
+ Storage
+
+
Web
@@ -121,6 +126,12 @@
QWidget
configuration/configure_debug.h
1
+
+
+ ConfigureStorage
+ QWidget
+ configuration/configure_storage.h
+ 1
ConfigureInput
diff --git a/src/citra_qt/configuration/configure_dialog.cpp b/src/citra_qt/configuration/configure_dialog.cpp
index 7e84f83ad..66eb3ec83 100644
--- a/src/citra_qt/configuration/configure_dialog.cpp
+++ b/src/citra_qt/configuration/configure_dialog.cpp
@@ -51,6 +51,7 @@ void ConfigureDialog::SetConfiguration() {
ui->debugTab->SetConfiguration();
ui->webTab->SetConfiguration();
ui->uiTab->SetConfiguration();
+ ui->storageTab->SetConfiguration();
}
void ConfigureDialog::ApplyConfiguration() {
@@ -66,6 +67,7 @@ void ConfigureDialog::ApplyConfiguration() {
ui->debugTab->ApplyConfiguration();
ui->webTab->ApplyConfiguration();
ui->uiTab->ApplyConfiguration();
+ ui->storageTab->ApplyConfiguration();
Settings::Apply();
Settings::LogSettings();
}
@@ -77,7 +79,7 @@ void ConfigureDialog::PopulateSelectionList() {
const std::array>, 5> items{
{{tr("General"), {ui->generalTab, ui->webTab, ui->debugTab, ui->uiTab}},
- {tr("System"), {ui->systemTab, ui->cameraTab}},
+ {tr("System"), {ui->systemTab, ui->cameraTab, ui->storageTab}},
{tr("Graphics"), {ui->enhancementsTab, ui->graphicsTab}},
{tr("Audio"), {ui->audioTab}},
{tr("Controls"), {ui->inputTab, ui->hotkeysTab}}}};
@@ -118,6 +120,7 @@ void ConfigureDialog::RetranslateUI() {
ui->debugTab->RetranslateUI();
ui->webTab->RetranslateUI();
ui->uiTab->RetranslateUI();
+ ui->storageTab->RetranslateUI();
}
void ConfigureDialog::UpdateVisibleTabs() {
@@ -134,6 +137,7 @@ void ConfigureDialog::UpdateVisibleTabs() {
{ui->audioTab, tr("Audio")},
{ui->cameraTab, tr("Camera")},
{ui->debugTab, tr("Debug")},
+ {ui->storageTab, tr("Storage")},
{ui->webTab, tr("Web")},
{ui->uiTab, tr("UI")}};
diff --git a/src/citra_qt/configuration/configure_storage.cpp b/src/citra_qt/configuration/configure_storage.cpp
new file mode 100644
index 000000000..f198f59f5
--- /dev/null
+++ b/src/citra_qt/configuration/configure_storage.cpp
@@ -0,0 +1,78 @@
+// Copyright 2016 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include
+#include
+#include
+#include "citra_qt/configuration/configure_storage.h"
+#include "core/core.h"
+#include "core/settings.h"
+#include "ui_configure_storage.h"
+
+ConfigureStorage::ConfigureStorage(QWidget* parent)
+ : QWidget(parent), ui(std::make_unique()) {
+ ui->setupUi(this);
+ SetConfiguration();
+
+ connect(ui->open_nand_dir, &QPushButton::clicked, []() {
+ QString path = QString::fromStdString(Settings::values.nand_dir);
+ QDesktopServices::openUrl(QUrl::fromLocalFile(path));
+ });
+
+ connect(ui->change_nand_dir, &QPushButton::clicked, this, [this]() {
+ const QString dir_path = QFileDialog::getExistingDirectory(
+ this, tr("Select NAND Directory"), QString::fromStdString(Settings::values.nand_dir),
+ QFileDialog::ShowDirsOnly);
+ if (!dir_path.isEmpty()) {
+ Settings::values.nand_dir = dir_path.toStdString();
+ SetConfiguration();
+ }
+ });
+
+ connect(ui->open_sdmc_dir, &QPushButton::clicked, []() {
+ QString path = QString::fromStdString(Settings::values.sdmc_dir);
+ QDesktopServices::openUrl(QUrl::fromLocalFile(path));
+ });
+
+ connect(ui->change_sdmc_dir, &QPushButton::clicked, this, [this]() {
+ const QString dir_path = QFileDialog::getExistingDirectory(
+ this, tr("Select SDMC Directory"), QString::fromStdString(Settings::values.sdmc_dir),
+ QFileDialog::ShowDirsOnly);
+ if (!dir_path.isEmpty()) {
+ Settings::values.sdmc_dir = dir_path.toStdString();
+ SetConfiguration();
+ }
+ });
+
+ connect(ui->toggle_virtual_sd, &QCheckBox::clicked, this, [this]() {
+ ApplyConfiguration();
+ SetConfiguration();
+ });
+}
+
+ConfigureStorage::~ConfigureStorage() = default;
+
+void ConfigureStorage::SetConfiguration() {
+ ui->nand_group->setVisible(Settings::values.use_virtual_sd);
+ QString nand_path = QString::fromStdString(Settings::values.nand_dir);
+ ui->nand_dir_path->setText(nand_path);
+ ui->open_nand_dir->setEnabled(!Settings::values.nand_dir.empty());
+
+ ui->sdmc_group->setVisible(Settings::values.use_virtual_sd);
+ QString sdmc_path = QString::fromStdString(Settings::values.sdmc_dir);
+ ui->sdmc_dir_path->setText(sdmc_path);
+ ui->open_sdmc_dir->setEnabled(!Settings::values.sdmc_dir.empty());
+
+ ui->toggle_virtual_sd->setChecked(Settings::values.use_virtual_sd);
+
+ ui->storage_group->setEnabled(!Core::System::GetInstance().IsPoweredOn());
+}
+
+void ConfigureStorage::ApplyConfiguration() {
+ Settings::values.use_virtual_sd = ui->toggle_virtual_sd->isChecked();
+}
+
+void ConfigureStorage::RetranslateUI() {
+ ui->retranslateUi(this);
+}
\ No newline at end of file
diff --git a/src/citra_qt/configuration/configure_storage.h b/src/citra_qt/configuration/configure_storage.h
new file mode 100644
index 000000000..031ff926b
--- /dev/null
+++ b/src/citra_qt/configuration/configure_storage.h
@@ -0,0 +1,26 @@
+// Copyright 2016 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include
+#include
+
+namespace Ui {
+class ConfigureStorage;
+}
+
+class ConfigureStorage : public QWidget {
+ Q_OBJECT
+
+public:
+ explicit ConfigureStorage(QWidget* parent = nullptr);
+ ~ConfigureStorage() override;
+
+ void ApplyConfiguration();
+ void RetranslateUI();
+ void SetConfiguration();
+
+ std::unique_ptr ui;
+};
diff --git a/src/citra_qt/configuration/configure_storage.ui b/src/citra_qt/configuration/configure_storage.ui
new file mode 100644
index 000000000..c6f72dd5d
--- /dev/null
+++ b/src/citra_qt/configuration/configure_storage.ui
@@ -0,0 +1,188 @@
+
+
+ ConfigureStorage
+
+
+
+ 0
+ 0
+ 681
+ 375
+
+
+
+ Form
+
+
+ -
+
+
-
+
+
+ Storage
+
+
+
-
+
+
-
+
+
+ Use Virtual SD
+
+
+
+
+
+ -
+
+
+
+
+
+
-
+
+
-
+
+
+ NAND Directory
+
+
+
+ -
+
+
+ false
+
+
+
+ -
+
+
+ Open
+
+
+
+
+
+ -
+
+
-
+
+
+ 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
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
+
+
+