Files
YimMenuV2/src/core/settings/Settings.cpp
T
maybegreat48 aa3746462b Initial port
2025-03-13 16:59:02 -04:00

114 lines
2.4 KiB
C++

#include "Settings.hpp"
#include "IStateSerializer.hpp"
#include "Settings.hpp"
namespace YimMenu
{
Settings::Settings() :
m_SettingsFile(),
m_StateSerializers(),
m_InitialLoadDone(false)
{
}
void Settings::InitializeImpl(File settingsFile)
{
m_SettingsFile = settingsFile;
if (!settingsFile.Exists())
{
Reset();
return;
}
std::ifstream file(m_SettingsFile);
try
{
file >> m_Json;
file.close();
}
catch (std::exception&)
{
LOG(WARNING) << "Detected corrupt settings, resetting settings...";
Reset();
return;
}
for (auto& serializer : m_StateSerializers)
LoadComponentImpl(serializer);
LOG(VERBOSE) << "All settings loaded";
m_InitialLoadDone = true;
}
void Settings::TickImpl()
{
std::lock_guard lock(m_Mutex);
while (!m_LateLoaders.empty())
{
if (auto component = std::move(m_LateLoaders.front()))
{
LoadComponent(component);
}
m_LateLoaders.pop();
}
if (m_InitialLoadDone && ShouldSave())
{
for (auto& serializer : m_StateSerializers)
if (serializer->IsStateDirty())
SaveComponentImpl(serializer);
std::ofstream file(m_SettingsFile, std::ios::out | std::ios::trunc);
file << m_Json.dump(4);
file.close();
}
}
void Settings::AddComponentImpl(IStateSerializer* serializer)
{
std::lock_guard lock(m_Mutex);
m_StateSerializers.push_back(serializer);
if (m_InitialLoadDone)
m_LateLoaders.push(serializer);
}
void Settings::LoadComponentImpl(IStateSerializer* serializer)
{
LOG(VERBOSE) << "Loading component: " << serializer->GetSerializerComponentName();
if (!m_Json.contains(serializer->GetSerializerComponentName())
|| !m_Json[serializer->GetSerializerComponentName()].is_object())
m_Json[serializer->GetSerializerComponentName()] = nlohmann::json::object();
serializer->LoadState(m_Json[serializer->GetSerializerComponentName()]);
}
void Settings::SaveComponentImpl(IStateSerializer* serializer)
{
//LOG(VERBOSE) << "Saving component: " << serializer->GetSerializerComponentName();
serializer->SaveState(m_Json[serializer->GetSerializerComponentName()]);
}
void Settings::Reset()
{
std::ofstream file(m_SettingsFile, std::ios::out | std::ios::trunc);
file << "{}" << std::endl;
file.close();
m_Json = "{}";
m_InitialLoadDone = true;
}
bool Settings::ShouldSave()
{
for (auto& serializer : m_StateSerializers)
if (serializer->IsStateDirty())
return true;
return false;
}
}