From 47318e60b963fe6bfeb96f7271cee4e64da6d3d4 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 3 Mar 2026 14:12:24 +0200 Subject: [PATCH] draft user_settings --- CMakeLists.txt | 2 + src/core/user_settings.cpp | 77 ++++++++++++++++++++++++++++++++++++++ src/core/user_settings.h | 43 +++++++++++++++++++++ 3 files changed, 122 insertions(+) create mode 100644 src/core/user_settings.cpp create mode 100644 src/core/user_settings.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ea673d68d..c6c01455e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -872,6 +872,8 @@ set(CORE src/core/aerolib/stubs.cpp src/core/user_manager.h src/core/emulator_state.cpp src/core/emulator_state.h + src/core/user_settings.cpp + src/core/user_settings.h ) if (ARCHITECTURE STREQUAL "x86_64") diff --git a/src/core/user_settings.cpp b/src/core/user_settings.cpp new file mode 100644 index 000000000..c191137e3 --- /dev/null +++ b/src/core/user_settings.cpp @@ -0,0 +1,77 @@ +// SPDX-FileCopyrightText: Copyright 2025-2026 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include +#include +#include +#include "common/logging/log.h" +#include "user_settings.h" + +using json = nlohmann::json; + +// Singleton storage +std::shared_ptr UserSettingsImpl::s_instance = nullptr; +std::mutex UserSettingsImpl::s_mutex; + +// Singleton +UserSettingsImpl::UserSettingsImpl() = default; + +UserSettingsImpl::~UserSettingsImpl() { + Save(); +} + +bool UserSettingsImpl::Save() const { + const auto path = Common::FS::GetUserPath(Common::FS::PathType::UserDir) / "users.json"; + try { + json j; + j["Users"] = m_userManager.GetUsers(); + + std::ofstream out(path); + if (!out) { + LOG_ERROR(EmuSettings, "Failed to open user settings for writing: {}", path.string()); + return false; + } + out << std::setw(4) << j; + return !out.fail(); + } catch (const std::exception& e) { + LOG_ERROR(EmuSettings, "Error saving user settings: {}", e.what()); + return false; + } +} + +bool UserSettingsImpl::Load() { + const auto path = Common::FS::GetUserPath(Common::FS::PathType::UserDir) / "users.json"; + try { + 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()) + m_userManager.GetUsers().user = m_userManager.CreateDefaultUser(); + Save(); + return false; + } + + std::ifstream in(path); + if (!in) { + LOG_ERROR(EmuSettings, "Failed to open user settings: {}", path.string()); + return false; + } + + json j; + in >> j; + + if (j.contains("Users")) { + m_userManager.GetUsers() = j.at("Users").get(); + 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()); + return false; + } +} \ No newline at end of file diff --git a/src/core/user_settings.h b/src/core/user_settings.h new file mode 100644 index 000000000..25a802414 --- /dev/null +++ b/src/core/user_settings.h @@ -0,0 +1,43 @@ +// SPDX-FileCopyrightText: Copyright 2025-2026 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include "common/logging/log.h" +#include "common/types.h" +#include "core/user_manager.h" + +#define UserSettings (*UserSettingsImpl::GetInstance()) + +// ------------------------------- +// User settings +// ------------------------------- +NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(User, user_id, user_color, user_name, controller_port) +NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Users, default_user_id, user) + +class UserSettingsImpl { +public: + UserSettingsImpl(); + ~UserSettingsImpl(); + + UserManager& GetUserManager() { + return m_userManager; + } + bool Save() const; + bool Load(); + +private: + UserManager m_userManager; + + static std::shared_ptr s_instance; + static std::mutex s_mutex; + +}; \ No newline at end of file