From 1ad9276e8ac2cec83ef455754a9b0a4774ffd4a7 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 3 Mar 2026 19:27:31 +0200 Subject: [PATCH] added merged strategy for user.json --- src/core/user_settings.cpp | 46 +++++++++++++++++++++++++++++++++----- src/core/user_settings.h | 2 ++ 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/core/user_settings.cpp b/src/core/user_settings.cpp index 749a786ce..86410cc47 100644 --- a/src/core/user_settings.cpp +++ b/src/core/user_settings.cpp @@ -30,11 +30,16 @@ std::shared_ptr UserSettingsImpl::GetInstance() { return s_instance; } +void UserSettingsImpl::SetInstance(std::shared_ptr instance) { + std::lock_guard lock(s_mutex); + s_instance = std::move(instance); +} + bool UserSettingsImpl::Save() const { const auto path = Common::FS::GetUserPath(Common::FS::PathType::UserDir) / "users.json"; try { json j; - j = m_userManager.GetUsers(); + j["Users"] = m_userManager.GetUsers(); std::ofstream out(path); if (!out) { @@ -55,9 +60,11 @@ bool UserSettingsImpl::Load() { if (!std::filesystem::exists(path)) { LOG_DEBUG(EmuSettings, "User settings file not found: {}", path.string()); // Create default user if no file exists - if (m_userManager.GetUsers().user.empty()) + if (m_userManager.GetUsers().user.empty()) { m_userManager.GetUsers().user = m_userManager.CreateDefaultUser(); - Save(); + m_userManager.GetUsers().default_user_id = 1; + } + Save(); // Save default users return false; } @@ -70,13 +77,40 @@ bool UserSettingsImpl::Load() { json j; in >> j; - m_userManager.GetUsers() = j.get(); + // Create a default Users object + Users default_users; + default_users.default_user_id = 1; + if (default_users.user.empty()) { + User default_user; + default_user.user_id = 1; + default_user.user_color = 0; + default_user.user_name = "shadPS4"; + default_user.controller_port = 1; + default_users.user.push_back(default_user); + } + + // Convert default_users to json for merging + json default_json; + default_json["Users"] = default_users; + + // Merge the loaded json with defaults (preserves existing data, adds missing fields) + if (j.contains("Users")) { + json current = default_json["Users"]; + current.update(j["Users"]); + m_userManager.GetUsers() = current.get(); + } else { + m_userManager.GetUsers() = default_users; + } + LOG_DEBUG(EmuSettings, "User settings loaded successfully"); return true; - - return false; } catch (const std::exception& e) { LOG_ERROR(EmuSettings, "Error loading user settings: {}", e.what()); + // Fall back to defaults + if (m_userManager.GetUsers().user.empty()) { + m_userManager.GetUsers().user = m_userManager.CreateDefaultUser(); + m_userManager.GetUsers().default_user_id = 1; + } return false; } } \ No newline at end of file diff --git a/src/core/user_settings.h b/src/core/user_settings.h index 2ba91502e..45cfa91dd 100644 --- a/src/core/user_settings.h +++ b/src/core/user_settings.h @@ -31,10 +31,12 @@ public: UserManager& GetUserManager() { return m_userManager; } + bool Save() const; bool Load(); static std::shared_ptr GetInstance(); + static void SetInstance(std::shared_ptr instance); private: UserManager m_userManager;