From 449cbb7281b878294ee28918ef23f4c619a6214f Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 12 Jan 2020 22:17:01 +0100 Subject: [PATCH] Qt: use persistent_settings for playtimes --- rpcs3/Emu/RSX/RSXThread.h | 2 +- rpcs3/rpcs3.vcxproj | 78 ++++++++++++++++ rpcs3/rpcs3.vcxproj.filters | 80 +++++++++++++---- rpcs3/rpcs3qt/CMakeLists.txt | 2 + rpcs3/rpcs3qt/game_list_frame.cpp | 39 ++++++-- rpcs3/rpcs3qt/game_list_frame.h | 4 +- rpcs3/rpcs3qt/gui_application.cpp | 11 +-- rpcs3/rpcs3qt/gui_application.h | 2 + rpcs3/rpcs3qt/gui_settings.cpp | 123 ++++---------------------- rpcs3/rpcs3qt/gui_settings.h | 59 +----------- rpcs3/rpcs3qt/main_window.cpp | 11 ++- rpcs3/rpcs3qt/main_window.h | 4 +- rpcs3/rpcs3qt/persistent_settings.cpp | 29 ++++++ rpcs3/rpcs3qt/persistent_settings.h | 35 ++++++++ rpcs3/rpcs3qt/settings.cpp | 85 ++++++++++++++++++ rpcs3/rpcs3qt/settings.h | 65 ++++++++++++++ 16 files changed, 436 insertions(+), 193 deletions(-) create mode 100644 rpcs3/rpcs3qt/persistent_settings.cpp create mode 100644 rpcs3/rpcs3qt/persistent_settings.h create mode 100644 rpcs3/rpcs3qt/settings.cpp create mode 100644 rpcs3/rpcs3qt/settings.h 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; +};