Config: Only save settings if they have been changed
This commit is contained in:
parent
8360e358ee
commit
b51c6023ba
|
@ -2,6 +2,7 @@
|
||||||
// Licensed under GPLv2+
|
// Licensed under GPLv2+
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
|
@ -119,16 +120,23 @@ bool Section::Delete(const std::string& key)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
m_values.erase(it);
|
m_values.erase(it);
|
||||||
|
m_dirty = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Section::Set(const std::string& key, const std::string& value)
|
void Section::Set(const std::string& key, const std::string& value)
|
||||||
{
|
{
|
||||||
auto it = m_values.find(key);
|
auto it = m_values.find(key);
|
||||||
if (it != m_values.end())
|
if (it != m_values.end() && it->second != value)
|
||||||
|
{
|
||||||
it->second = value;
|
it->second = value;
|
||||||
else
|
m_dirty = true;
|
||||||
|
}
|
||||||
|
else if (it == m_values.end())
|
||||||
|
{
|
||||||
m_values[key] = value;
|
m_values[key] = value;
|
||||||
|
m_dirty = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Section::Set(const std::string& key, u32 newValue)
|
void Section::Set(const std::string& key, u32 newValue)
|
||||||
|
@ -165,6 +173,12 @@ void Section::Set(const std::string& key, const std::string& newValue,
|
||||||
Delete(key);
|
Delete(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Section::SetLines(const std::vector<std::string>& lines)
|
||||||
|
{
|
||||||
|
m_lines = lines;
|
||||||
|
m_dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
bool Section::Get(const std::string& key, std::string* value,
|
bool Section::Get(const std::string& key, std::string* value,
|
||||||
const std::string& default_value) const
|
const std::string& default_value) const
|
||||||
{
|
{
|
||||||
|
@ -326,13 +340,33 @@ void Layer::Load()
|
||||||
{
|
{
|
||||||
if (m_loader)
|
if (m_loader)
|
||||||
m_loader->Load(this);
|
m_loader->Load(this);
|
||||||
|
ClearDirty();
|
||||||
CallbackSystems();
|
CallbackSystems();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Layer::Save()
|
void Layer::Save()
|
||||||
{
|
{
|
||||||
if (m_loader)
|
if (!m_loader || !IsDirty())
|
||||||
m_loader->Save(this);
|
return;
|
||||||
|
|
||||||
|
m_loader->Save(this);
|
||||||
|
ClearDirty();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Layer::IsDirty() const
|
||||||
|
{
|
||||||
|
return std::any_of(m_sections.begin(), m_sections.end(), [](const auto& system) {
|
||||||
|
return std::any_of(system.second.begin(), system.second.end(),
|
||||||
|
[](const auto& section) { return section->IsDirty(); });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void Layer::ClearDirty()
|
||||||
|
{
|
||||||
|
std::for_each(m_sections.begin(), m_sections.end(), [](const auto& system) {
|
||||||
|
std::for_each(system.second.begin(), system.second.end(),
|
||||||
|
[](const auto& section) { section->ClearDirty(); });
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Section* GetOrCreateSection(System system, const std::string& section_name)
|
Section* GetOrCreateSection(System system, const std::string& section_name)
|
||||||
|
|
|
@ -92,13 +92,17 @@ public:
|
||||||
bool Get(const std::string& key, double* value, double defaultValue = 0.0) const;
|
bool Get(const std::string& key, double* value, double defaultValue = 0.0) const;
|
||||||
|
|
||||||
// Section chunk
|
// Section chunk
|
||||||
void SetLines(const std::vector<std::string>& lines) { m_lines = lines; }
|
void SetLines(const std::vector<std::string>& lines);
|
||||||
// XXX: Add to recursive layer
|
// XXX: Add to recursive layer
|
||||||
virtual bool GetLines(std::vector<std::string>* lines, const bool remove_comments = true) const;
|
virtual bool GetLines(std::vector<std::string>* lines, const bool remove_comments = true) const;
|
||||||
virtual bool HasLines() const { return m_lines.size() > 0; }
|
virtual bool HasLines() const { return m_lines.size() > 0; }
|
||||||
const std::string& GetName() const { return m_name; }
|
const std::string& GetName() const { return m_name; }
|
||||||
const SectionValueMap& GetValues() const { return m_values; }
|
const SectionValueMap& GetValues() const { return m_values; }
|
||||||
|
bool IsDirty() const { return m_dirty; }
|
||||||
|
void ClearDirty() { m_dirty = false; }
|
||||||
protected:
|
protected:
|
||||||
|
bool m_dirty = false;
|
||||||
|
|
||||||
LayerType m_layer;
|
LayerType m_layer;
|
||||||
System m_system;
|
System m_system;
|
||||||
const std::string m_name;
|
const std::string m_name;
|
||||||
|
@ -154,6 +158,9 @@ public:
|
||||||
// Stay away from this routine as much as possible
|
// Stay away from this routine as much as possible
|
||||||
ConfigLayerLoader* GetLoader() { return m_loader.get(); }
|
ConfigLayerLoader* GetLoader() { return m_loader.get(); }
|
||||||
protected:
|
protected:
|
||||||
|
bool IsDirty() const;
|
||||||
|
void ClearDirty();
|
||||||
|
|
||||||
LayerMap m_sections;
|
LayerMap m_sections;
|
||||||
const LayerType m_layer;
|
const LayerType m_layer;
|
||||||
std::unique_ptr<ConfigLayerLoader> m_loader;
|
std::unique_ptr<ConfigLayerLoader> m_loader;
|
||||||
|
|
Loading…
Reference in New Issue