From f84f4ccd380957de831a964de0036e00df15f4e6 Mon Sep 17 00:00:00 2001 From: Robbie Date: Thu, 15 Jun 2017 03:22:06 -0700 Subject: [PATCH] Include a VFS manipulation dialog (#2863) * VFS Dialog * Couple convenience changes. Refresh after dialog in case dev_hdd0 changes. And, have add directory set which directory you're currently using as well. --- rpcs3/rpcs3qt.vcxproj | 78 +++++++++++++++++++++++++++++ rpcs3/rpcs3qt.vcxproj.filters | 36 ++++++++++++++ rpcs3/rpcs3qt/emu_settings.cpp | 2 +- rpcs3/rpcs3qt/emu_settings.h | 12 +++++ rpcs3/rpcs3qt/gui_settings.h | 6 +++ rpcs3/rpcs3qt/main_window.cpp | 9 ++++ rpcs3/rpcs3qt/main_window.h | 1 + rpcs3/rpcs3qt/vfs_dialog.cpp | 77 +++++++++++++++++++++++++++++ rpcs3/rpcs3qt/vfs_dialog.h | 25 ++++++++++ rpcs3/rpcs3qt/vfs_dialog_tab.cpp | 85 ++++++++++++++++++++++++++++++++ rpcs3/rpcs3qt/vfs_dialog_tab.h | 44 +++++++++++++++++ 11 files changed, 374 insertions(+), 1 deletion(-) create mode 100644 rpcs3/rpcs3qt/vfs_dialog.cpp create mode 100644 rpcs3/rpcs3qt/vfs_dialog.h create mode 100644 rpcs3/rpcs3qt/vfs_dialog_tab.cpp create mode 100644 rpcs3/rpcs3qt/vfs_dialog_tab.h 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