diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h
index 21036eef0a..ed53e751a6 100644
--- a/rpcs3/Emu/RSX/RSXThread.h
+++ b/rpcs3/Emu/RSX/RSXThread.h
@@ -745,7 +745,7 @@ namespace rsx
void run_FIFO();
public:
- virtual void clear_surface(u32 arg) {};
+ virtual void clear_surface(u32 /*arg*/) {};
virtual void begin();
virtual void end();
virtual void execute_nop_draw();
diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj
index f95209a3e8..4ea804239f 100644
--- a/rpcs3/rpcs3.vcxproj
+++ b/rpcs3/rpcs3.vcxproj
@@ -472,6 +472,11 @@
true
true
+
+ true
+ true
+ true
+
true
true
@@ -502,6 +507,11 @@
true
true
+
+ true
+ true
+ true
+
true
true
@@ -672,6 +682,11 @@
true
true
+
+ true
+ true
+ true
+
true
true
@@ -702,6 +717,11 @@
true
true
+
+ true
+ true
+ true
+
true
true
@@ -892,6 +912,11 @@
true
true
+
+ true
+ true
+ true
+
true
true
@@ -922,6 +947,11 @@
true
true
+
+ true
+ true
+ true
+
true
true
@@ -1092,6 +1122,11 @@
true
true
+
+ true
+ true
+ true
+
true
true
@@ -1122,6 +1157,11 @@
true
true
+
+ true
+ true
+ true
+
true
true
@@ -1172,6 +1212,8 @@
+
+
@@ -1751,6 +1793,42 @@
.\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_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-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$(QTDIR)\include\QtConcurrent" "-IC:\Program Files (x86)\Visual Leak Detector\include"
+
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing %(Identity)...
+ .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB "-DBRANCH=$(BRANCH)" -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-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$(QTDIR)\include\QtConcurrent"
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing %(Identity)...
+ .\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_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-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$(QTDIR)\include\QtConcurrent"
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing %(Identity)...
+ .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-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$(QTDIR)\include\QtConcurrent"
+ $(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing %(Identity)...
+ .\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_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-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$(QTDIR)\include\QtConcurrent"
+
+
+ $(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing %(Identity)...
+ .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB "-DBRANCH=$(BRANCH)" -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-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$(QTDIR)\include\QtConcurrent"
+ $(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing %(Identity)...
+ .\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_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-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$(QTDIR)\include\QtConcurrent"
+ $(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing %(Identity)...
+ .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
+ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-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$(QTDIR)\include\QtConcurrent"
+ $(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)
+ Moc%27ing %(Identity)...
+ .\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_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-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$(QTDIR)\include\QtConcurrent"
+
diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters
index bc7cddb099..f093e2f510 100644
--- a/rpcs3/rpcs3.vcxproj.filters
+++ b/rpcs3/rpcs3.vcxproj.filters
@@ -656,9 +656,6 @@
Gui\utils
-
- Io\Keyboard
-
Generated Files\Release - LLVM
@@ -716,9 +713,6 @@
Generated Files\Debug - LLVM
-
- Io\DS3
-
Gui
@@ -803,6 +797,54 @@
Gui\misc dialogs
+
+ Generated Files\Debug
+
+
+ Generated Files\Debug
+
+
+ Gui\settings
+
+
+ Generated Files\Release - LLVM
+
+
+ Generated Files\Debug
+
+
+ Generated Files\Release
+
+
+ Generated Files\Debug - LLVM
+
+
+ Generated Files\Release - LLVM
+
+
+ Generated Files\Debug
+
+
+ Generated Files\Release
+
+
+ Generated Files\Debug - LLVM
+
+
+ Generated Files\Release - LLVM
+
+
+ Generated Files\Debug
+
+
+ Generated Files\Release
+
+
+ Generated Files\Debug - LLVM
+
+
+ Gui\settings
+
@@ -811,9 +853,6 @@
Io\DS4
-
- Io\MMJoystick
-
Io\XInput
@@ -883,12 +922,6 @@
Gui\utils
-
- Io\Keyboard
-
-
- Io\DS3
-
Gui
@@ -898,6 +931,15 @@
Gui
+
+ Generated Files
+
+
+ Generated Files
+
+
+ Generated Files
+
@@ -1059,6 +1101,12 @@
Gui\misc dialogs
+
+ Gui\settings
+
+
+ Gui\settings
+
@@ -1066,4 +1114,4 @@
-
+
\ No newline at end of file
diff --git a/rpcs3/rpcs3qt/CMakeLists.txt b/rpcs3/rpcs3qt/CMakeLists.txt
index 2cd5dfc95e..e989195933 100644
--- a/rpcs3/rpcs3qt/CMakeLists.txt
+++ b/rpcs3/rpcs3qt/CMakeLists.txt
@@ -29,6 +29,7 @@
msg_dialog_frame.cpp
osk_dialog_frame.cpp
pad_settings_dialog.cpp
+ persistent_settings.cpp
pkg_install_dialog.cpp
progress_dialog.cpp
qt_utils.cpp
@@ -38,6 +39,7 @@
save_data_info_dialog.cpp
save_data_list_dialog.cpp
save_manager_dialog.cpp
+ settings.cpp
settings_dialog.cpp
skylander_dialog.cpp
syntax_highlighter.cpp
diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp
index 3db9a83784..fc3bbe82fb 100644
--- a/rpcs3/rpcs3qt/game_list_frame.cpp
+++ b/rpcs3/rpcs3qt/game_list_frame.cpp
@@ -31,8 +31,11 @@
inline std::string sstr(const QString& _in) { return _in.toStdString(); }
-game_list_frame::game_list_frame(std::shared_ptr guiSettings, std::shared_ptr emuSettings, QWidget *parent)
- : custom_dock_widget(tr("Game List"), parent), m_gui_settings(guiSettings), m_emu_settings(emuSettings)
+game_list_frame::game_list_frame(std::shared_ptr guiSettings, std::shared_ptr emuSettings, std::shared_ptr persistent_settings, QWidget *parent)
+ : custom_dock_widget(tr("Game List"), parent)
+ , m_gui_settings(guiSettings)
+ , m_emu_settings(emuSettings)
+ , m_persistent_settings(persistent_settings)
{
m_isListLayout = m_gui_settings->GetValue(gui::gl_listMode).toBool();
m_Margin_Factor = m_gui_settings->GetValue(gui::gl_marginFactor).toReal();
@@ -364,12 +367,12 @@ void game_list_frame::SortGameList()
QString game_list_frame::GetLastPlayedBySerial(const QString& serial)
{
- return m_gui_settings->GetLastPlayed(serial);
+ return m_persistent_settings->GetLastPlayed(serial);
}
QString game_list_frame::GetPlayTimeBySerial(const QString& serial)
{
- const qint64 elapsed_ms = m_gui_settings->GetPlaytime(serial);
+ const qint64 elapsed_ms = m_persistent_settings->GetPlaytime(serial);
if (elapsed_ms <= 0)
{
@@ -579,8 +582,32 @@ void game_list_frame::Refresh(const bool fromDrive, const bool scrollAfter)
const QString serial = qstr(game.serial);
const QString note = m_gui_settings->GetValue(gui::notes, serial, "").toString();
const QString title = m_gui_settings->GetValue(gui::titles, serial, "").toString().simplified();
- m_gui_settings->SetLastPlayed(serial, m_gui_settings->GetValue(gui::last_played, serial, "").toString());
- m_gui_settings->SetPlaytime(serial, m_gui_settings->GetValue(gui::playtime, serial, 0).toInt());
+
+ // Read persistent_settings values
+ QString last_played = m_persistent_settings->GetValue(gui::persistent::last_played, serial, "").toString();
+ int playtime = m_persistent_settings->GetValue(gui::persistent::playtime, serial, 0).toInt();
+
+ // Read deprecated gui_setting values first for backwards compatibility (older than January 12th 2020).
+ // Restrict this to empty persistent settings to keep continuity.
+ if (last_played.isEmpty())
+ {
+ last_played = m_gui_settings->GetValue(gui::persistent::last_played, serial, "").toString();
+ }
+ if (playtime <= 0)
+ {
+ playtime = m_gui_settings->GetValue(gui::persistent::playtime, serial, 0).toInt();
+ }
+
+ // Set persistent_settings values if values exist
+ if (!last_played.isEmpty())
+ {
+ m_persistent_settings->SetLastPlayed(serial, last_played);
+ }
+ if (playtime > 0)
+ {
+ m_persistent_settings->SetPlaytime(serial, playtime);
+ }
+
serials.insert(serial);
if (!note.isEmpty())
diff --git a/rpcs3/rpcs3qt/game_list_frame.h b/rpcs3/rpcs3qt/game_list_frame.h
index 60cb365638..515db98548 100644
--- a/rpcs3/rpcs3qt/game_list_frame.h
+++ b/rpcs3/rpcs3qt/game_list_frame.h
@@ -7,6 +7,7 @@
#include "game_list.h"
#include "game_list_grid.h"
#include "emu_settings.h"
+#include "persistent_settings.h"
#include "game_compatibility.h"
#include
@@ -182,7 +183,7 @@ class game_list_frame : public custom_dock_widget
Q_OBJECT
public:
- explicit game_list_frame(std::shared_ptr guiSettings, std::shared_ptr emuSettings, QWidget *parent = nullptr);
+ explicit game_list_frame(std::shared_ptr guiSettings, std::shared_ptr emuSettings, std::shared_ptr persistent_settings, QWidget *parent = nullptr);
~game_list_frame();
/** Fix columns with width smaller than the minimal section size */
@@ -289,6 +290,7 @@ private:
// Data
std::shared_ptr m_gui_settings;
std::shared_ptr m_emu_settings;
+ std::shared_ptr m_persistent_settings;
QList m_game_data;
QSet m_hidden_list;
bool m_show_hidden{false};
diff --git a/rpcs3/rpcs3qt/gui_application.cpp b/rpcs3/rpcs3qt/gui_application.cpp
index 84bb31afd5..71f18ac9f4 100644
--- a/rpcs3/rpcs3qt/gui_application.cpp
+++ b/rpcs3/rpcs3qt/gui_application.cpp
@@ -35,6 +35,7 @@ void gui_application::Init()
m_emu_settings.reset(new emu_settings());
m_gui_settings.reset(new gui_settings());
+ m_persistent_settings.reset(new persistent_settings());
// Force init the emulator
InitializeEmulator(m_gui_settings->GetCurrentUser().toStdString(), true, m_show_gui);
@@ -42,7 +43,7 @@ void gui_application::Init()
// Create the main window
if (m_show_gui)
{
- m_main_window = new main_window(m_gui_settings, m_emu_settings, nullptr);
+ m_main_window = new main_window(m_gui_settings, m_emu_settings, m_persistent_settings, nullptr);
}
// Create callbacks from the emulator, which reference the handlers.
@@ -216,7 +217,7 @@ void gui_application::StartPlaytime()
return;
}
- m_gui_settings->SetLastPlayed(serial, QDate::currentDate().toString("MMMM d yyyy"));
+ m_persistent_settings->SetLastPlayed(serial, QDate::currentDate().toString("MMMM d yyyy"));
m_timer_playtime.start();
}
@@ -232,9 +233,9 @@ void gui_application::StopPlaytime()
return;
}
- const qint64 playtime = m_gui_settings->GetPlaytime(serial) + m_timer_playtime.elapsed();
- m_gui_settings->SetPlaytime(serial, playtime);
- m_gui_settings->SetLastPlayed(serial, QDate::currentDate().toString("MMMM d yyyy"));
+ const qint64 playtime = m_persistent_settings->GetPlaytime(serial) + m_timer_playtime.elapsed();
+ m_persistent_settings->SetPlaytime(serial, playtime);
+ m_persistent_settings->SetLastPlayed(serial, QDate::currentDate().toString("MMMM d yyyy"));
m_timer_playtime.invalidate();
}
diff --git a/rpcs3/rpcs3qt/gui_application.h b/rpcs3/rpcs3qt/gui_application.h
index ef865491db..e4759ce8db 100644
--- a/rpcs3/rpcs3qt/gui_application.h
+++ b/rpcs3/rpcs3qt/gui_application.h
@@ -10,6 +10,7 @@
#include "main_application.h"
#include "emu_settings.h"
#include "gui_settings.h"
+#include "persistent_settings.h"
#include "gs_frame.h"
#include "gl_gs_frame.h"
@@ -56,6 +57,7 @@ private:
std::shared_ptr m_emu_settings;
std::shared_ptr m_gui_settings;
+ std::shared_ptr m_persistent_settings;
bool m_show_gui = true;
bool m_use_cli_style = false;
diff --git a/rpcs3/rpcs3qt/gui_settings.cpp b/rpcs3/rpcs3qt/gui_settings.cpp
index c5f7eb0b41..49040eb79b 100644
--- a/rpcs3/rpcs3qt/gui_settings.cpp
+++ b/rpcs3/rpcs3qt/gui_settings.cpp
@@ -8,11 +8,11 @@
inline std::string sstr(const QString& _in) { return _in.toStdString(); }
-gui_settings::gui_settings(QObject* parent) : QObject(parent)
+gui_settings::gui_settings(QObject* parent) : settings(parent)
, m_current_name(gui::Settings)
- , m_settings(ComputeSettingsDir() + gui::Settings + ".ini", QSettings::Format::IniFormat, parent)
- , m_settingsDir(ComputeSettingsDir())
{
+ m_settings = new QSettings(ComputeSettingsDir() + gui::Settings + ".ini", QSettings::Format::IniFormat, parent);
+
const QString settings_name = GetValue(gui::m_currentConfig).toString();
if (settings_name != m_current_name)
@@ -21,11 +21,6 @@ gui_settings::gui_settings(QObject* parent) : QObject(parent)
}
}
-gui_settings::~gui_settings()
-{
- m_settings.sync();
-}
-
QString gui_settings::GetCurrentUser()
{
// load user
@@ -43,16 +38,6 @@ QString gui_settings::GetCurrentUser()
return QString();
}
-QString gui_settings::GetSettingsDir()
-{
- return m_settingsDir.absolutePath();
-}
-
-QString gui_settings::ComputeSettingsDir()
-{
- return QString::fromStdString(fs::get_config_dir()) + "/GuiConfigs/";
-}
-
bool gui_settings::ChangeToConfig(const QString& friendly_name)
{
if (m_current_name == friendly_name)
@@ -68,27 +53,27 @@ bool gui_settings::ChangeToConfig(const QString& friendly_name)
}
else
{
- QSettings tmp(m_settingsDir.absoluteFilePath(gui::Settings + ".ini"), QSettings::Format::IniFormat, parent());
+ QSettings tmp(m_settings_dir.absoluteFilePath(gui::Settings + ".ini"), QSettings::Format::IniFormat, parent());
tmp.beginGroup(gui::m_currentConfig.key);
tmp.setValue(gui::m_currentConfig.name, friendly_name);
tmp.endGroup();
}
}
- m_settings.sync();
+ m_settings->sync();
Reset(true);
- QSettings other(m_settingsDir.absoluteFilePath(friendly_name + ".ini"), QSettings::IniFormat);
+ QSettings other(m_settings_dir.absoluteFilePath(friendly_name + ".ini"), QSettings::IniFormat);
for (const QString& key : other.allKeys())
{
- m_settings.setValue(key, other.value(key));
+ m_settings->setValue(key, other.value(key));
}
SetValue(gui::m_currentConfig, friendly_name);
- m_settings.sync();
+ m_settings->sync();
m_current_name = friendly_name;
@@ -99,86 +84,16 @@ void gui_settings::Reset(bool removeMeta)
{
if (removeMeta)
{
- m_settings.clear();
+ m_settings->clear();
}
else
{
- m_settings.remove(gui::logger);
- m_settings.remove(gui::main_window);
- m_settings.remove(gui::game_list);
+ m_settings->remove(gui::logger);
+ m_settings->remove(gui::main_window);
+ m_settings->remove(gui::game_list);
}
}
-void gui_settings::RemoveValue(const QString& key, const QString& name)
-{
- m_settings.beginGroup(key);
- m_settings.remove(name);
- m_settings.endGroup();
-}
-
-QVariant gui_settings::GetValue(const gui_save& entry)
-{
- return m_settings.value(entry.key + "/" + entry.name, entry.def);
-}
-
-QVariant gui_settings::GetValue(const QString& key, const QString& name, const QString& def)
-{
- return m_settings.value(key + "/" + name, def);
-}
-
-QVariant gui_settings::List2Var(const q_pair_list& list)
-{
- QByteArray ba;
- QDataStream stream(&ba, QIODevice::WriteOnly);
- stream << list;
- return QVariant(ba);
-}
-
-q_pair_list gui_settings::Var2List(const QVariant& var)
-{
- q_pair_list list;
- QByteArray ba = var.toByteArray();
- QDataStream stream(&ba, QIODevice::ReadOnly);
- stream >> list;
- return list;
-}
-
-void gui_settings::SetValue(const gui_save& entry, const QVariant& value)
-{
- m_settings.beginGroup(entry.key);
- m_settings.setValue(entry.name, value);
- m_settings.endGroup();
-}
-
-void gui_settings::SetValue(const QString& key, const QString& name, const QVariant& value)
-{
- m_settings.beginGroup(key);
- m_settings.setValue(name, value);
- m_settings.endGroup();
-}
-
-void gui_settings::SetPlaytime(const QString& serial, const qint64& elapsed)
-{
- m_playtime[serial] = elapsed;
- SetValue(gui::playtime, serial, elapsed);
-}
-
-qint64 gui_settings::GetPlaytime(const QString& serial)
-{
- return m_playtime[serial];
-}
-
-void gui_settings::SetLastPlayed(const QString& serial, const QString& date)
-{
- m_last_played[serial] = date;
- SetValue(gui::last_played, serial, date);
-}
-
-QString gui_settings::GetLastPlayed(const QString& serial)
-{
- return m_last_played[serial];
-}
-
QStringList gui_settings::GetGameListCategoryFilters()
{
QStringList filterList;
@@ -325,11 +240,11 @@ void gui_settings::SaveCurrentConfig(const QString& friendly_name)
if (m_current_name == gui::Settings)
{
SetValue(gui::m_currentConfig, friendly_name);
- m_settings.sync();
+ m_settings->sync();
}
else
{
- QSettings tmp(m_settingsDir.absoluteFilePath(gui::Settings + ".ini"), QSettings::Format::IniFormat, parent());
+ QSettings tmp(m_settings_dir.absoluteFilePath(gui::Settings + ".ini"), QSettings::Format::IniFormat, parent());
tmp.beginGroup(gui::m_currentConfig.key);
tmp.setValue(gui::m_currentConfig.name, friendly_name);
tmp.endGroup();
@@ -359,7 +274,7 @@ QStringList gui_settings::GetConfigEntries()
{
QStringList nameFilter;
nameFilter << "*.ini";
- QFileInfoList entries = m_settingsDir.entryInfoList(nameFilter, QDir::Files);
+ QFileInfoList entries = m_settings_dir.entryInfoList(nameFilter, QDir::Files);
QStringList res;
for (const QFileInfo &entry : entries)
{
@@ -373,11 +288,11 @@ void gui_settings::BackupSettingsToTarget(const QString& friendly_name)
{
QSettings target(ComputeSettingsDir() + friendly_name + ".ini", QSettings::Format::IniFormat);
- for (const QString& key : m_settings.allKeys())
+ for (const QString& key : m_settings->allKeys())
{
if (!key.startsWith(gui::meta))
{
- target.setValue(key, m_settings.value(key));
+ target.setValue(key, m_settings->value(key));
}
}
@@ -387,7 +302,7 @@ void gui_settings::BackupSettingsToTarget(const QString& friendly_name)
QStringList gui_settings::GetStylesheetEntries()
{
QStringList nameFilter = QStringList("*.qss");
- QStringList res = gui::utils::get_dir_entries(m_settingsDir, nameFilter);
+ QStringList res = gui::utils::get_dir_entries(m_settings_dir, nameFilter);
#if !defined(_WIN32)
// Makes stylesheets load if using AppImage (App Bundle) or installed to /usr/bin
#ifdef __APPLE__
@@ -415,7 +330,7 @@ QString gui_settings::GetCurrentStylesheetPath()
return "-";
}
- return m_settingsDir.absoluteFilePath(stylesheet + ".qss");
+ return m_settings_dir.absoluteFilePath(stylesheet + ".qss");
}
QSize gui_settings::SizeFromSlider(int pos)
diff --git a/rpcs3/rpcs3qt/gui_settings.h b/rpcs3/rpcs3qt/gui_settings.h
index f30d1550ea..994c49b536 100644
--- a/rpcs3/rpcs3qt/gui_settings.h
+++ b/rpcs3/rpcs3qt/gui_settings.h
@@ -1,40 +1,13 @@
#pragma once
+#include "settings.h"
#include "Utilities/Log.h"
-#include
#include
#include
#include
#include
-struct gui_save
-{
- QString key;
- QString name;
- QVariant def;
-
- gui_save()
- {
- key = "";
- name = "";
- def = QVariant();
- }
-
- gui_save(const QString& k, const QString& n, const QVariant& d)
- {
- key = k;
- name = n;
- def = d;
- }
-};
-
-typedef std::map q_from_char;
-typedef QPair q_string_pair;
-typedef QPair q_size_pair;
-typedef QList q_pair_list;
-typedef QList q_size_list;
-
namespace gui
{
static QString stylesheet;
@@ -137,8 +110,6 @@ namespace gui
const QString users = "Users";
const QString notes = "Notes";
const QString titles = "Titles";
- const QString playtime = "Playtime";
- const QString last_played = "LastPlayed";
const QColor gl_icon_color = QColor(240, 240, 240, 255);
@@ -165,7 +136,7 @@ namespace gui
const gui_save mw_titleBarsVisible = gui_save(main_window, "titleBarsVisible", true);
const gui_save mw_geometry = gui_save(main_window, "geometry", QByteArray());
const gui_save mw_windowState = gui_save(main_window, "windowState", QByteArray());
- const gui_save mw_mwState = gui_save(main_window, "wwState", QByteArray());
+ const gui_save mw_mwState = gui_save(main_window, "mwState", QByteArray());
const gui_save cat_hdd_game = gui_save(game_list, "categoryVisibleHDDGame", true);
const gui_save cat_disc_game = gui_save(game_list, "categoryVisibleDiscGame", true);
@@ -249,25 +220,19 @@ namespace gui
/** Class for GUI settings..
*/
-class gui_settings : public QObject
+class gui_settings : public settings
{
Q_OBJECT
public:
explicit gui_settings(QObject* parent = nullptr);
- ~gui_settings();
QString GetCurrentUser();
- QString GetSettingsDir();
/** Changes the settings file to the destination preset*/
bool ChangeToConfig(const QString& friendly_name);
bool GetCategoryVisibility(int cat);
- QVariant GetValue(const gui_save& entry);
- QVariant GetValue(const QString& key, const QString& name, const QString& def);
- QVariant List2Var(const q_pair_list& list);
- q_pair_list Var2List(const QVariant &var);
void ShowConfirmationBox(const QString& title, const QString& text, const gui_save& entry, int* result, QWidget* parent);
void ShowInfoBox(const QString& title, const QString& text, const gui_save& entry, QWidget* parent);
@@ -283,19 +248,6 @@ public:
public Q_SLOTS:
void Reset(bool removeMeta = false);
- /** Remove entry */
- void RemoveValue(const QString& key, const QString& name);
-
- /** Write value to entry */
- void SetValue(const gui_save& entry, const QVariant& value);
- void SetValue(const QString& key, const QString& name, const QVariant& value);
-
- void SetPlaytime(const QString& serial, const qint64& elapsed);
- qint64 GetPlaytime(const QString& serial);
-
- void SetLastPlayed(const QString& serial, const QString& date);
- QString GetLastPlayed(const QString& serial);
-
/** Sets the visibility of the chosen category. */
void SetCategoryVisibility(int cat, const bool& val);
@@ -309,13 +261,8 @@ public Q_SLOTS:
static gui_save GetGuiSaveForColumn(int col);
private:
- QString ComputeSettingsDir();
void BackupSettingsToTarget(const QString& friendly_name);
void ShowBox(bool confirm, const QString& title, const QString& text, const gui_save& entry, int* result, QWidget* parent, bool always_on_top);
- QSettings m_settings;
- QDir m_settingsDir;
QString m_current_name;
- QMap m_playtime;
- QMap m_last_played;
};
diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp
index bd6a2fc832..67ec7f89fb 100644
--- a/rpcs3/rpcs3qt/main_window.cpp
+++ b/rpcs3/rpcs3qt/main_window.cpp
@@ -57,8 +57,13 @@
inline std::string sstr(const QString& _in) { return _in.toStdString(); }
-main_window::main_window(std::shared_ptr guiSettings, std::shared_ptr emuSettings, QWidget *parent)
- : QMainWindow(parent), guiSettings(guiSettings), emuSettings(emuSettings), m_sys_menu_opened(false), ui(new Ui::main_window)
+main_window::main_window(std::shared_ptr guiSettings, std::shared_ptr emuSettings, std::shared_ptr persistent_settings, QWidget *parent)
+ : QMainWindow(parent)
+ , guiSettings(guiSettings)
+ , emuSettings(emuSettings)
+ , m_persistent_settings(persistent_settings)
+ , m_sys_menu_opened(false)
+ , ui(new Ui::main_window)
{
}
@@ -1557,7 +1562,7 @@ void main_window::CreateDockWindows()
m_mw = new QMainWindow();
m_mw->setContextMenuPolicy(Qt::PreventContextMenu);
- m_gameListFrame = new game_list_frame(guiSettings, emuSettings, m_mw);
+ m_gameListFrame = new game_list_frame(guiSettings, emuSettings, m_persistent_settings, m_mw);
m_gameListFrame->setObjectName("gamelist");
m_debuggerFrame = new debugger_frame(guiSettings, m_mw);
m_debuggerFrame->setObjectName("debugger");
diff --git a/rpcs3/rpcs3qt/main_window.h b/rpcs3/rpcs3qt/main_window.h
index e81cf96c35..faf63361df 100644
--- a/rpcs3/rpcs3qt/main_window.h
+++ b/rpcs3/rpcs3qt/main_window.h
@@ -15,6 +15,7 @@
#include "debugger_frame.h"
#include "game_list_frame.h"
#include "gui_settings.h"
+#include "persistent_settings.h"
#include "update_manager.h"
#include
@@ -67,7 +68,7 @@ class main_window : public QMainWindow
};
public:
- explicit main_window(std::shared_ptr guiSettings, std::shared_ptr emuSettings, QWidget *parent = 0);
+ explicit main_window(std::shared_ptr guiSettings, std::shared_ptr emuSettings, std::shared_ptr persistent_settings, QWidget *parent = 0);
void Init();
~main_window();
QIcon GetAppIcon();
@@ -141,6 +142,7 @@ private:
game_list_frame* m_gameListFrame = nullptr;
std::shared_ptr guiSettings;
std::shared_ptr emuSettings;
+ std::shared_ptr m_persistent_settings;
update_manager m_updater;
};
diff --git a/rpcs3/rpcs3qt/persistent_settings.cpp b/rpcs3/rpcs3qt/persistent_settings.cpp
new file mode 100644
index 0000000000..d46940612c
--- /dev/null
+++ b/rpcs3/rpcs3qt/persistent_settings.cpp
@@ -0,0 +1,29 @@
+#include "persistent_settings.h"
+
+persistent_settings::persistent_settings(QObject* parent) : settings(parent)
+{
+ // Don't use the .ini file ending for now, as it will be confused for a regular gui_settings file.
+ m_settings = new QSettings(ComputeSettingsDir() + gui::persistent::persistent_file_name + ".dat", QSettings::Format::IniFormat, parent);
+}
+
+void persistent_settings::SetPlaytime(const QString& serial, const qint64& elapsed)
+{
+ m_playtime[serial] = elapsed;
+ SetValue(gui::persistent::playtime, serial, elapsed);
+}
+
+qint64 persistent_settings::GetPlaytime(const QString& serial)
+{
+ return m_playtime[serial];
+}
+
+void persistent_settings::SetLastPlayed(const QString& serial, const QString& date)
+{
+ m_last_played[serial] = date;
+ SetValue(gui::persistent::last_played, serial, date);
+}
+
+QString persistent_settings::GetLastPlayed(const QString& serial)
+{
+ return m_last_played[serial];
+}
diff --git a/rpcs3/rpcs3qt/persistent_settings.h b/rpcs3/rpcs3qt/persistent_settings.h
new file mode 100644
index 0000000000..b6f8dd7ded
--- /dev/null
+++ b/rpcs3/rpcs3qt/persistent_settings.h
@@ -0,0 +1,35 @@
+#pragma once
+
+#include "settings.h"
+
+namespace gui
+{
+ namespace persistent
+ {
+ // File name
+ const QString persistent_file_name = "persistent_settings";
+
+ // Entry names
+ const QString playtime = "Playtime";
+ const QString last_played = "LastPlayed";
+ }
+}
+
+// Provides a persistent settings class that won't be affected by settings dialog changes
+class persistent_settings : public settings
+{
+ Q_OBJECT
+
+public:
+ explicit persistent_settings(QObject* parent = nullptr);
+
+public Q_SLOTS:
+ void SetPlaytime(const QString& serial, const qint64& elapsed);
+ qint64 GetPlaytime(const QString& serial);
+
+ void SetLastPlayed(const QString& serial, const QString& date);
+ QString GetLastPlayed(const QString& serial);
+private:
+ QMap m_playtime;
+ QMap m_last_played;
+};
diff --git a/rpcs3/rpcs3qt/settings.cpp b/rpcs3/rpcs3qt/settings.cpp
new file mode 100644
index 0000000000..a61bf74f32
--- /dev/null
+++ b/rpcs3/rpcs3qt/settings.cpp
@@ -0,0 +1,85 @@
+#include "settings.h"
+
+#include "qt_utils.h"
+
+inline std::string sstr(const QString& _in) { return _in.toStdString(); }
+
+settings::settings(QObject* parent) : QObject(parent),
+ m_settings_dir(ComputeSettingsDir())
+{
+}
+
+settings::~settings()
+{
+ if (m_settings)
+ {
+ m_settings->sync();
+ }
+}
+
+QString settings::GetSettingsDir()
+{
+ return m_settings_dir.absolutePath();
+}
+
+QString settings::ComputeSettingsDir()
+{
+ return QString::fromStdString(fs::get_config_dir()) + "/GuiConfigs/";
+}
+
+void settings::RemoveValue(const QString& key, const QString& name)
+{
+ if (m_settings)
+ {
+ m_settings->beginGroup(key);
+ m_settings->remove(name);
+ m_settings->endGroup();
+ }
+}
+
+QVariant settings::GetValue(const gui_save& entry)
+{
+ return m_settings ? m_settings->value(entry.key + "/" + entry.name, entry.def) : entry.def;
+}
+
+QVariant settings::GetValue(const QString& key, const QString& name, const QString& def)
+{
+ return m_settings ? m_settings->value(key + "/" + name, def) : def;
+}
+
+QVariant settings::List2Var(const q_pair_list& list)
+{
+ QByteArray ba;
+ QDataStream stream(&ba, QIODevice::WriteOnly);
+ stream << list;
+ return QVariant(ba);
+}
+
+q_pair_list settings::Var2List(const QVariant& var)
+{
+ q_pair_list list;
+ QByteArray ba = var.toByteArray();
+ QDataStream stream(&ba, QIODevice::ReadOnly);
+ stream >> list;
+ return list;
+}
+
+void settings::SetValue(const gui_save& entry, const QVariant& value)
+{
+ if (m_settings)
+ {
+ m_settings->beginGroup(entry.key);
+ m_settings->setValue(entry.name, value);
+ m_settings->endGroup();
+ }
+}
+
+void settings::SetValue(const QString& key, const QString& name, const QVariant& value)
+{
+ if (m_settings)
+ {
+ m_settings->beginGroup(key);
+ m_settings->setValue(name, value);
+ m_settings->endGroup();
+ }
+}
diff --git a/rpcs3/rpcs3qt/settings.h b/rpcs3/rpcs3qt/settings.h
new file mode 100644
index 0000000000..7a28fb4b63
--- /dev/null
+++ b/rpcs3/rpcs3qt/settings.h
@@ -0,0 +1,65 @@
+#pragma once
+
+#include
+#include
+#include
+#include
+
+struct gui_save
+{
+ QString key;
+ QString name;
+ QVariant def;
+
+ gui_save()
+ {
+ key = "";
+ name = "";
+ def = QVariant();
+ }
+
+ gui_save(const QString& k, const QString& n, const QVariant& d)
+ {
+ key = k;
+ name = n;
+ def = d;
+ }
+};
+
+typedef std::map q_from_char;
+typedef QPair q_string_pair;
+typedef QPair q_size_pair;
+typedef QList q_pair_list;
+typedef QList q_size_list;
+
+// Parent Class for GUI settings
+class settings : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit settings(QObject* parent = nullptr);
+ ~settings();
+
+ QString GetSettingsDir();
+
+ QVariant GetValue(const gui_save& entry);
+ QVariant GetValue(const QString& key, const QString& name, const QString& def);
+ QVariant List2Var(const q_pair_list& list);
+ q_pair_list Var2List(const QVariant& var);
+
+public Q_SLOTS:
+ /** Remove entry */
+ void RemoveValue(const QString& key, const QString& name);
+
+ /** Write value to entry */
+ void SetValue(const gui_save& entry, const QVariant& value);
+ void SetValue(const QString& key, const QString& name, const QVariant& value);
+
+protected:
+ QString ComputeSettingsDir();
+
+ QSettings* m_settings = nullptr;
+ QDir m_settings_dir;
+ QString m_current_name;
+};