Browse Source

Support MultiKey entries in ini

Support MultiKey entires in ini
pull/1524/head
obligaron 4 years ago committed by Anders Jenbo
parent
commit
e852fc18d4
  1. 65
      Source/options.cpp

65
Source/options.cpp

@ -86,6 +86,7 @@ CSimpleIni &GetIni()
auto path = GetIniPath(); auto path = GetIniPath();
auto stream = CreateFileStream(path.c_str(), std::fstream::in | std::fstream::binary); auto stream = CreateFileStream(path.c_str(), std::fstream::in | std::fstream::binary);
ini.SetSpaces(false); ini.SetSpaces(false);
ini.SetMultiKey();
if (stream) if (stream)
ini.LoadData(*stream); ini.LoadData(*stream);
isIniLoaded = true; isIniLoaded = true;
@ -104,27 +105,35 @@ public:
{ {
this->sectionName_ = sectionName; this->sectionName_ = sectionName;
this->keyName_ = keyName; this->keyName_ = keyName;
std::list<CSimpleIni::Entry> values; oldValue_ = GetValue();
if (!GetIni().GetAllValues(sectionName, keyName, values)) { if (!oldValue_) {
// No entry found in original ini => new entry => changed // No entry found in original ini => new entry => changed
IniChanged = true; IniChanged = true;
} }
const auto *value = GetIni().GetValue(sectionName, keyName);
if (value != nullptr)
oldValue_ = value;
} }
~IniChangedChecker() ~IniChangedChecker()
{ {
const auto *value = GetIni().GetValue(sectionName_, keyName_); auto newValue = GetValue();
std::string newValue;
if (value != nullptr)
newValue = value;
if (oldValue_ != newValue) if (oldValue_ != newValue)
IniChanged = true; IniChanged = true;
} }
private: private:
std::string oldValue_; std::optional<std::string> GetValue()
{
std::list<CSimpleIni::Entry> values;
if (!GetIni().GetAllValues(sectionName_, keyName_, values))
return std::nullopt;
std::string ret;
for (auto &entry : values) {
if (entry.pItem != nullptr)
ret.append(entry.pItem);
ret.append("\n");
}
return ret;
}
std::optional<std::string> oldValue_;
const char *sectionName_; const char *sectionName_;
const char *keyName_; const char *keyName_;
}; };
@ -144,34 +153,58 @@ float GetIniFloat(const char *sectionName, const char *keyName, float defaultVal
return (float)GetIni().GetDoubleValue(sectionName, keyName, defaultValue); return (float)GetIni().GetDoubleValue(sectionName, keyName, defaultValue);
} }
bool GetIniStringVector(const char *sectionName, const char *keyName, std::vector<std::string> &stringValues)
{
std::list<CSimpleIni::Entry> values;
if (!GetIni().GetAllValues(sectionName, keyName, values)) {
return false;
}
for (auto &entry : values) {
stringValues.emplace_back(entry.pItem);
}
return true;
}
void SetIniValue(const char *keyname, const char *valuename, int value) void SetIniValue(const char *keyname, const char *valuename, int value)
{ {
IniChangedChecker changedChecker(keyname, valuename); IniChangedChecker changedChecker(keyname, valuename);
GetIni().SetLongValue(keyname, valuename, value); GetIni().SetLongValue(keyname, valuename, value, nullptr, false, true);
} }
void SetIniValue(const char *keyname, const char *valuename, std::uint8_t value) void SetIniValue(const char *keyname, const char *valuename, std::uint8_t value)
{ {
IniChangedChecker changedChecker(keyname, valuename); IniChangedChecker changedChecker(keyname, valuename);
GetIni().SetLongValue(keyname, valuename, value); GetIni().SetLongValue(keyname, valuename, value, nullptr, false, true);
} }
void SetIniValue(const char *keyname, const char *valuename, std::uint32_t value) void SetIniValue(const char *keyname, const char *valuename, std::uint32_t value)
{ {
IniChangedChecker changedChecker(keyname, valuename); IniChangedChecker changedChecker(keyname, valuename);
GetIni().SetLongValue(keyname, valuename, value); GetIni().SetLongValue(keyname, valuename, value, nullptr, false, true);
} }
void SetIniValue(const char *keyname, const char *valuename, bool value) void SetIniValue(const char *keyname, const char *valuename, bool value)
{ {
IniChangedChecker changedChecker(keyname, valuename); IniChangedChecker changedChecker(keyname, valuename);
GetIni().SetLongValue(keyname, valuename, value ? 1 : 0); GetIni().SetLongValue(keyname, valuename, value ? 1 : 0, nullptr, false, true);
} }
void SetIniValue(const char *keyname, const char *valuename, float value) void SetIniValue(const char *keyname, const char *valuename, float value)
{ {
IniChangedChecker changedChecker(keyname, valuename); IniChangedChecker changedChecker(keyname, valuename);
GetIni().SetDoubleValue(keyname, valuename, value); GetIni().SetDoubleValue(keyname, valuename, value, nullptr, true);
}
void SetIniValue(const char *keyname, const char *valuename, const std::vector<std::string> &stringValues)
{
IniChangedChecker changedChecker(keyname, valuename);
bool firstSet = true;
for (auto &value : stringValues) {
GetIni().SetValue(keyname, valuename, value.c_str(), nullptr, firstSet);
firstSet = false;
}
if (firstSet)
GetIni().SetValue(keyname, valuename, "", nullptr, true);
} }
void SaveIni() void SaveIni()
@ -272,7 +305,7 @@ void SetIniValue(const char *sectionName, const char *keyName, const char *value
IniChangedChecker changedChecker(sectionName, keyName); IniChangedChecker changedChecker(sectionName, keyName);
auto &ini = GetIni(); auto &ini = GetIni();
std::string stringValue(value, len != 0 ? len : strlen(value)); std::string stringValue(value, len != 0 ? len : strlen(value));
ini.SetValue(sectionName, keyName, stringValue.c_str()); ini.SetValue(sectionName, keyName, stringValue.c_str(), nullptr, true);
} }
bool GetIniValue(const char *sectionName, const char *keyName, char *string, int stringSize, const char *defaultString) bool GetIniValue(const char *sectionName, const char *keyName, char *string, int stringSize, const char *defaultString)

Loading…
Cancel
Save