diff --git a/rpcs3/rpcs3qt.vcxproj b/rpcs3/rpcs3qt.vcxproj
index 8974aa2466..5891a02bfa 100644
--- a/rpcs3/rpcs3qt.vcxproj
+++ b/rpcs3/rpcs3qt.vcxproj
@@ -487,6 +487,16 @@
true
true
+
+ true
+ true
+ true
+
+
+ true
+ true
+ true
+
true
true
@@ -632,6 +642,16 @@
true
true
+
+ true
+ true
+ true
+
+
+ true
+ true
+ true
+
true
true
@@ -787,6 +807,16 @@
true
true
+
+ true
+ true
+ true
+
+
+ true
+ true
+ true
+
true
true
@@ -932,6 +962,16 @@
true
true
+
+ true
+ true
+ true
+
+
+ true
+ true
+ true
+
true
true
@@ -939,6 +979,8 @@
+
+
@@ -1506,6 +1548,42 @@
$(QTDIR)\bin\moc.exe;%(FullPath)
$(QTDIR)\bin\moc.exe;%(FullPath)
+
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing vfs_dialog.h...
+ .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB -DLLVM_AVAILABLE -D_UNICODE "-I.\..\Vulkan\Vulkan-LoaderAndValidationLayers\include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtQuick" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)\." "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(NOINHERIT)\."
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing vfs_dialog.h...
+ .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -D_SCL_SECURE_NO_WARNINGS -D_UNICODE "-I.\..\Vulkan\Vulkan-LoaderAndValidationLayers\include" "-I.\.." "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtQuick" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)\." "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(NOINHERIT)\."
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing vfs_dialog.h...
+ .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB -D_UNICODE "-I.\..\Vulkan\Vulkan-LoaderAndValidationLayers\include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtQuick" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)\." "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(NOINHERIT)\."
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing vfs_dialog.h...
+ .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DLLVM_AVAILABLE -D_SCL_SECURE_NO_WARNINGS -D_UNICODE "-I.\..\Vulkan\Vulkan-LoaderAndValidationLayers\include" "-I.\.." "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtQuick" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)\." "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(NOINHERIT)\."
+
+
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing vfs_dialog_tab.h...
+ .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB -DLLVM_AVAILABLE -D_UNICODE "-I.\..\Vulkan\Vulkan-LoaderAndValidationLayers\include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtQuick" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)\." "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(NOINHERIT)\."
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing vfs_dialog_tab.h...
+ .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -D_SCL_SECURE_NO_WARNINGS -D_UNICODE "-I.\..\Vulkan\Vulkan-LoaderAndValidationLayers\include" "-I.\.." "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtQuick" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)\." "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(NOINHERIT)\."
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing vfs_dialog_tab.h...
+ .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB -D_UNICODE "-I.\..\Vulkan\Vulkan-LoaderAndValidationLayers\include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtQuick" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)\." "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(NOINHERIT)\."
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing vfs_dialog_tab.h...
+ .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DLLVM_AVAILABLE -D_SCL_SECURE_NO_WARNINGS -D_UNICODE "-I.\..\Vulkan\Vulkan-LoaderAndValidationLayers\include" "-I.\.." "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtQuick" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)\." "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(NOINHERIT)\."
+
diff --git a/rpcs3/rpcs3qt.vcxproj.filters b/rpcs3/rpcs3qt.vcxproj.filters
index ba790832e1..a03da6751c 100644
--- a/rpcs3/rpcs3qt.vcxproj.filters
+++ b/rpcs3/rpcs3qt.vcxproj.filters
@@ -531,6 +531,36 @@
Gui
+
+ Gui
+
+
+ Generated Files\Release - LLVM
+
+
+ Generated Files\Debug
+
+
+ Generated Files\Release
+
+
+ Generated Files\Debug - LLVM
+
+
+ Gui
+
+
+ Generated Files\Release - LLVM
+
+
+ Generated Files\Debug
+
+
+ Generated Files\Release
+
+
+ Generated Files\Debug - LLVM
+
@@ -668,5 +698,11 @@
Gui
+
+ Gui
+
+
+ Gui
+
\ No newline at end of file
diff --git a/rpcs3/rpcs3qt/emu_settings.cpp b/rpcs3/rpcs3qt/emu_settings.cpp
index 1445dc1237..d98c45ce60 100644
--- a/rpcs3/rpcs3qt/emu_settings.cpp
+++ b/rpcs3/rpcs3qt/emu_settings.cpp
@@ -278,5 +278,5 @@ std::string emu_settings::GetSetting(SettingsType type) const
void emu_settings::SetSetting(SettingsType type, const std::string& val)
{
- cfg_adapter::get_node(currentSettings, SettingsLoc[type])= val;
+ cfg_adapter::get_node(currentSettings, SettingsLoc[type]) = val;
}
diff --git a/rpcs3/rpcs3qt/emu_settings.h b/rpcs3/rpcs3qt/emu_settings.h
index 8f8003e082..790b288e82 100644
--- a/rpcs3/rpcs3qt/emu_settings.h
+++ b/rpcs3/rpcs3qt/emu_settings.h
@@ -90,6 +90,12 @@ public:
// Language
Language,
EnableHostRoot,
+
+ // Virtual File System
+ dev_hdd0Location,
+ dev_hdd1Location,
+ dev_flashLocation,
+ dev_usb000Location,
};
/** Creates a settings object which reads in the config.yml file at rpcs3/bin/%path%/config.yml
@@ -174,6 +180,12 @@ private:
{Language, { "System", "Language"}},
{EnableHostRoot, { "VFS", "Enable /host_root/"}},
+ // Virtual File System
+ { dev_hdd0Location, { "VFS", "/dev_hdd0/" }},
+ { dev_hdd1Location, { "VFS", "/dev_hdd1/" }},
+ { dev_flashLocation, { "VFS", "/dev_flash/"}},
+ { dev_usb000Location, { "VFS", "/dev_usb000/"}},
+
};
YAML::Node currentSettings; // The current settings as a YAML node.
diff --git a/rpcs3/rpcs3qt/gui_settings.h b/rpcs3/rpcs3qt/gui_settings.h
index 68acf31a8c..865d1d651f 100644
--- a/rpcs3/rpcs3qt/gui_settings.h
+++ b/rpcs3/rpcs3qt/gui_settings.h
@@ -50,6 +50,7 @@ namespace GUI
const QString game_list = "GameList";
const QString logger = "Logger";
const QString meta = "Meta";
+ const QString fs = "FileSystem";
const GUI_SAVE rg_freeze = GUI_SAVE(main_window, "recentGamesFrozen", false);
const GUI_SAVE rg_entries = GUI_SAVE(main_window, "recentGamesNames", QVariant::fromValue(q_pair_list()));
@@ -88,6 +89,11 @@ namespace GUI
const GUI_SAVE gl_marginFactor = GUI_SAVE( game_list, "marginFactor", (qreal) 0.09 );
const GUI_SAVE gl_toolBarVisible = GUI_SAVE( game_list, "toolBarVisible", true );
+ const GUI_SAVE fs_dev_hdd0_list = GUI_SAVE(fs, "dev_hdd0_list", QStringList());
+ const GUI_SAVE fs_dev_hdd1_list = GUI_SAVE(fs, "dev_hdd1_list", QStringList());
+ const GUI_SAVE fs_dev_flash_list = GUI_SAVE(fs, "dev_flash_list", QStringList());
+ const GUI_SAVE fs_dev_usb000_list = GUI_SAVE(fs, "dev_usb000_list", QStringList());
+
const GUI_SAVE l_tty = GUI_SAVE( logger, "TTY", true );
const GUI_SAVE l_level = GUI_SAVE( logger, "level", (uint)(logs::level::success) );
diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp
index 0a364c29ec..eb689e0873 100644
--- a/rpcs3/rpcs3qt/main_window.cpp
+++ b/rpcs3/rpcs3qt/main_window.cpp
@@ -9,6 +9,7 @@
#include
#include
+#include "vfs_dialog.h"
#include "save_data_utility.h"
#include "kernel_explorer.h"
#include "game_list_frame.h"
@@ -992,6 +993,8 @@ void main_window::CreateActions()
confAutopauseManagerAct = new QAction(tr("&Auto Pause Settings"), this);
confAutopauseManagerAct->setEnabled(false);
+ confVFSDialogAct = new QAction(tr("Virtual File System"), this);
+
confSavedataManagerAct = new QAction(tr("Save &Data Utility"), this);
confSavedataManagerAct->setEnabled(false);
@@ -1149,6 +1152,11 @@ void main_window::CreateConnects()
auto_pause_settings_dialog dlg(this);
dlg.exec();
});
+ connect(confVFSDialogAct, &QAction::triggered, [=]() {
+ vfs_dialog dlg(this);
+ dlg.exec();
+ gameListFrame->Refresh(true); // dev-hdd0 may have changed. Refresh just in case.
+ });
connect(confSavedataManagerAct, &QAction::triggered, [=](){
save_data_list_dialog* sdid = new save_data_list_dialog(this, true);
sdid->show();
@@ -1290,6 +1298,7 @@ void main_window::CreateMenus()
confMenu->addAction(confPadAct);
confMenu->addSeparator();
confMenu->addAction(confAutopauseManagerAct);
+ confMenu->addAction(confVFSDialogAct);
confMenu->addSeparator();
confMenu->addAction(confSavedataManagerAct);
diff --git a/rpcs3/rpcs3qt/main_window.h b/rpcs3/rpcs3qt/main_window.h
index ab9c7a5aa5..7a53195799 100644
--- a/rpcs3/rpcs3qt/main_window.h
+++ b/rpcs3/rpcs3qt/main_window.h
@@ -114,6 +114,7 @@ private:
QAction *confSettingsAct;
QAction *confPadAct;
QAction *confAutopauseManagerAct;
+ QAction *confVFSDialogAct;
QAction *confSavedataManagerAct;
QAction *toolsCgDisasmAct;
QAction *toolskernel_explorerAct;
diff --git a/rpcs3/rpcs3qt/vfs_dialog.cpp b/rpcs3/rpcs3qt/vfs_dialog.cpp
new file mode 100644
index 0000000000..a0fc250d7b
--- /dev/null
+++ b/rpcs3/rpcs3qt/vfs_dialog.cpp
@@ -0,0 +1,77 @@
+#include "vfs_dialog.h"
+
+#include "Emu/System.h"
+
+#include "vfs_dialog_tab.h"
+
+#include
+#include
+
+inline std::string sstr(const QString& _in) { return _in.toUtf8().toStdString(); }
+
+vfs_dialog::vfs_dialog(QWidget* parent) : QDialog(parent),
+ m_gui_settings(), m_emu_settings("")
+{
+ tabs = new QTabWidget();
+
+ // Create tabs
+ vfs_dialog_tab* dev_hdd0_tab = new vfs_dialog_tab({ "dev_hdd0", emu_settings::dev_hdd0Location, GUI::fs_dev_hdd0_list, &g_cfg.vfs.dev_hdd0 },
+ &m_gui_settings, &m_emu_settings, this);
+
+ vfs_dialog_tab* dev_hdd1_tab = new vfs_dialog_tab({ "dev_hdd1", emu_settings::dev_hdd1Location, GUI::fs_dev_hdd1_list, &g_cfg.vfs.dev_hdd1 },
+ &m_gui_settings, &m_emu_settings, this);
+
+ vfs_dialog_tab* dev_flash_tab = new vfs_dialog_tab({ "dev_flash", emu_settings::dev_flashLocation, GUI::fs_dev_flash_list, &g_cfg.vfs.dev_flash },
+ &m_gui_settings, &m_emu_settings, this);
+
+ vfs_dialog_tab* dev_usb000_tab = new vfs_dialog_tab({ "dev_usb000", emu_settings::dev_usb000Location, GUI::fs_dev_usb000_list, &g_cfg.vfs.dev_usb000 },
+ &m_gui_settings, &m_emu_settings, this);
+
+ tabs->addTab(dev_hdd0_tab, "dev_hdd0");
+ tabs->addTab(dev_hdd1_tab, "dev_hdd1");
+ tabs->addTab(dev_flash_tab, "dev_flash");
+ tabs->addTab(dev_usb000_tab, "dev_usb000");
+
+ // Create buttons
+ QPushButton* addDir = new QPushButton(tr("Add New Directory"));
+ connect(addDir, &QAbstractButton::pressed, [this]() {
+ static_cast(tabs->currentWidget())->AddNewDirectory();
+ });
+ QPushButton* reset = new QPushButton(tr("Reset"));
+ connect(reset, &QAbstractButton::pressed, [this]() {
+ static_cast(tabs->currentWidget())->Reset();
+ });
+ QPushButton* resetAll = new QPushButton(tr("Reset All"));
+ connect(resetAll, &QAbstractButton::pressed, [this]() {
+ for (int i = 0; i < tabs->count(); ++i)
+ {
+ static_cast(tabs->widget(i))->Reset();
+ }
+ });
+ QPushButton* okay = new QPushButton(tr("Okay"));
+ connect(okay, &QAbstractButton::pressed, [this]() {
+ accept();
+ });
+
+ QHBoxLayout* buttons = new QHBoxLayout;
+ buttons->addWidget(addDir);
+ buttons->addWidget(reset);
+ buttons->addWidget(resetAll);
+ buttons->addStretch();
+ buttons->addWidget(okay);
+
+ QVBoxLayout* vbox = new QVBoxLayout;
+ vbox->addWidget(tabs);
+ vbox->addLayout(buttons);
+
+ setLayout(vbox);
+ setWindowTitle("Virtual File System");
+}
+
+vfs_dialog::~vfs_dialog()
+{
+ for (int i = 0; i < tabs->count(); ++i)
+ {
+ static_cast(tabs->widget(i))->SaveSettings();
+ }
+}
diff --git a/rpcs3/rpcs3qt/vfs_dialog.h b/rpcs3/rpcs3qt/vfs_dialog.h
new file mode 100644
index 0000000000..7bc4bb7218
--- /dev/null
+++ b/rpcs3/rpcs3qt/vfs_dialog.h
@@ -0,0 +1,25 @@
+#ifndef VFS_DIALOG_H
+#define VFS_DIALOG_H
+
+#include "gui_settings.h"
+#include "emu_settings.h"
+
+#include
+#include
+
+class vfs_dialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit vfs_dialog(QWidget* parent = nullptr);
+ ~vfs_dialog();
+private:
+ gui_settings m_gui_settings;
+ emu_settings m_emu_settings;
+
+ QTabWidget* tabs;
+};
+
+
+#endif
diff --git a/rpcs3/rpcs3qt/vfs_dialog_tab.cpp b/rpcs3/rpcs3qt/vfs_dialog_tab.cpp
new file mode 100644
index 0000000000..681624fee5
--- /dev/null
+++ b/rpcs3/rpcs3qt/vfs_dialog_tab.cpp
@@ -0,0 +1,85 @@
+#include "vfs_dialog_tab.h"
+
+#include
+#include
+#include
+#include
+
+inline std::string sstr(const QString& _in) { return _in.toUtf8().toStdString(); }
+
+vfs_dialog_tab::vfs_dialog_tab(const vfs_settings_info& settingsInfo, gui_settings* guiSettings, emu_settings* emuSettings, QWidget* parent) : QWidget(parent),
+m_info(settingsInfo), m_gui_settings(guiSettings), m_emu_settings(emuSettings)
+{
+ dirList = new QListWidget;
+
+ QStringList alldirs = m_gui_settings->GetValue(m_info.listLocation).toStringList();
+
+ // We must show the currently selected config.
+ if (alldirs.contains(EmuGameDir()) == false)
+ {
+ new QListWidgetItem(EmuGameDir(), dirList);
+ }
+ for (QString dir : alldirs)
+ {
+ new QListWidgetItem(dir, dirList);
+ }
+ dirList->setMinimumWidth(dirList->sizeHintForColumn(0));
+
+ QHBoxLayout* selectedConfigLayout = new QHBoxLayout;
+ QLabel* selectedMessage = new QLabel(m_info.name + " directory:");
+ selectedConfigLabel = new QLabel();
+ selectedConfigLabel->setText(EmuGameDir());
+ selectedConfigLayout->addWidget(selectedMessage);
+ selectedConfigLayout->addWidget(selectedConfigLabel);
+ selectedConfigLayout->addStretch();
+
+ QVBoxLayout* vbox = new QVBoxLayout;
+ vbox->addWidget(dirList);
+ vbox->addLayout(selectedConfigLayout);
+
+ setLayout(vbox);
+
+ connect(dirList, &QListWidget::itemDoubleClicked, [this](QListWidgetItem* item)
+ {
+ selectedConfigLabel->setText(item->text());
+ });
+}
+
+void vfs_dialog_tab::SaveSettings()
+{
+ QStringList allDirs;
+ for (int i = 0; i < dirList->count(); ++i)
+ {
+ allDirs += dirList->item(i)->text();
+ }
+
+ m_gui_settings->SetValue(m_info.listLocation, allDirs);
+ m_info.cfg_node->from_string(sstr(selectedConfigLabel->text()));
+ m_emu_settings->SetSetting(m_info.settingLoc, sstr(selectedConfigLabel->text()));
+ m_emu_settings->SaveSettings();
+}
+
+void vfs_dialog_tab::Reset()
+{
+ dirList->clear();
+ m_info.cfg_node->from_default();
+ selectedConfigLabel->setText(EmuGameDir());
+ dirList->addItem(new QListWidgetItem(EmuGameDir()));
+ m_gui_settings->SetValue(m_info.listLocation, QStringList(EmuGameDir()));
+}
+
+void vfs_dialog_tab::AddNewDirectory()
+{
+ QString dir = QFileDialog::getExistingDirectory(nullptr, "Choose a directory", QCoreApplication::applicationDirPath());
+ if (dir != "")
+ {
+ if (dir.endsWith("/") == false) dir += '/';
+ new QListWidgetItem(dir, dirList);
+ selectedConfigLabel->setText(dir);
+ }
+}
+
+QString vfs_dialog_tab::EmuGameDir()
+{
+ return qstr(m_info.cfg_node->to_string());
+}
diff --git a/rpcs3/rpcs3qt/vfs_dialog_tab.h b/rpcs3/rpcs3qt/vfs_dialog_tab.h
new file mode 100644
index 0000000000..3ddcd9ef66
--- /dev/null
+++ b/rpcs3/rpcs3qt/vfs_dialog_tab.h
@@ -0,0 +1,44 @@
+#ifndef VFS_DIALOG_TAB
+#define VFS_DIALOG_TAB
+
+#include "stdafx.h"
+#include "Emu/System.h"
+
+#include "gui_settings.h"
+#include "emu_settings.h"
+
+#include
+#include
+#include
+
+struct vfs_settings_info
+{
+ QString name; // name of tab
+ emu_settings::SettingsType settingLoc; // Where the setting is saved in emu_settings
+ GUI_SAVE listLocation; // Where the list of dir options are saved
+ cfg::string* cfg_node; // Needed since emu_settings overrides settings file and doesn't touch g_cfg currently.
+};
+
+class vfs_dialog_tab : public QWidget
+{
+ Q_OBJECT
+
+public:
+ explicit vfs_dialog_tab(const vfs_settings_info& info, gui_settings* guiSettings, emu_settings* emuSettings, QWidget* parent = nullptr);
+
+ void SaveSettings();
+ void AddNewDirectory();
+ void Reset();
+private:
+ QString EmuGameDir();
+
+ vfs_settings_info m_info;
+ gui_settings* m_gui_settings;
+ emu_settings* m_emu_settings;
+
+ // UI variables needed in higher scope
+ QListWidget* dirList;
+ QLabel* selectedConfigLabel;
+};
+
+#endif