mirror of
https://github.com/YimMenu/YimMenuV2.git
synced 2026-10-10 11:53:14 +08:00
114 lines
2.4 KiB
C++
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;
|
|
}
|
|
} |