This repository has been archived on 2024-10-22. You can view files and clone it, but cannot push or open issues or pull requests.
YimMenu/src/core/settings.cpp

130 lines
2.4 KiB
C++
Raw Normal View History

#include "settings.hpp"
#include "thread_pool.hpp"
namespace big
{
void menu_settings::init(const file& save_file)
{
m_save_file = save_file;
load();
}
void menu_settings::attempt_save()
{
const nlohmann::json j = *this;
if (deep_compare(m_options, j, true))
save();
}
bool menu_settings::load()
{
m_default_options = *this;
std::ifstream file(m_save_file.get_path());
if (!m_save_file.exists())
{
write_default_config();
file.open(m_save_file.get_path());
}
try
{
file >> m_options;
file.close();
}
catch (const std::exception&)
{
file.close();
LOG(WARNING) << "Detected corrupt settings, writing default config...";
write_default_config();
return load();
}
const bool should_save = deep_compare(m_options, m_default_options);
try
{
from_json(m_options, *this);
}
2024-09-20 22:38:29 +02:00
catch (const std::exception& e)
{
2024-09-20 22:38:29 +02:00
file.close();
LOG(WARNING) << "Detected incompatible settings, writing default config: " << e.what();
2024-09-20 22:38:29 +02:00
write_default_config();
return load();
}
if (should_save)
{
LOG(INFO) << "Updating settings.";
save();
}
return true;
}
bool menu_settings::write_default_config()
{
std::ofstream file(m_save_file.get_path(), std::ios::out | std::ios::trunc);
file << m_default_options.dump(4);
file.close();
return true;
}
bool menu_settings::deep_compare(nlohmann::json& current_settings, const nlohmann::json& default_settings, bool compare_value)
{
bool should_save = false;
for (auto& e : default_settings.items())
{
const std::string& key = e.key();
if (current_settings.count(key) == 0 || (compare_value && current_settings[key] != e.value()))
{
current_settings[key] = e.value();
should_save = true;
}
else if (current_settings[key].is_object() && e.value().is_object())
{
if (deep_compare(current_settings[key], e.value(), compare_value))
should_save = true;
}
else if (!current_settings[key].is_object() && e.value().is_object())
{
current_settings[key] = e.value();
2024-09-20 22:38:29 +02:00
should_save = true;
}
else if (current_settings[key].size() < e.value().size())
{
current_settings[key] = e.value();
should_save = true;
}
}
return should_save;
}
bool menu_settings::save()
{
std::ofstream file(m_save_file.get_path(), std::ios::out | std::ios::trunc);
nlohmann::json j = *this;
file << j.dump(4);
file.close();
return true;
}
}