diff --git a/Source/options.cpp b/Source/options.cpp index 50f89c16d..26bc2ca60 100644 --- a/Source/options.cpp +++ b/Source/options.cpp @@ -86,6 +86,7 @@ CSimpleIni &GetIni() auto path = GetIniPath(); auto stream = CreateFileStream(path.c_str(), std::fstream::in | std::fstream::binary); ini.SetSpaces(false); + ini.SetMultiKey(); if (stream) ini.LoadData(*stream); isIniLoaded = true; @@ -104,27 +105,35 @@ public: { this->sectionName_ = sectionName; this->keyName_ = keyName; - std::list values; - if (!GetIni().GetAllValues(sectionName, keyName, values)) { + oldValue_ = GetValue(); + if (!oldValue_) { // No entry found in original ini => new entry => changed IniChanged = true; } - const auto *value = GetIni().GetValue(sectionName, keyName); - if (value != nullptr) - oldValue_ = value; } ~IniChangedChecker() { - const auto *value = GetIni().GetValue(sectionName_, keyName_); - std::string newValue; - if (value != nullptr) - newValue = value; + auto newValue = GetValue(); if (oldValue_ != newValue) IniChanged = true; } private: - std::string oldValue_; + std::optional GetValue() + { + std::list 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 oldValue_; const char *sectionName_; const char *keyName_; }; @@ -144,34 +153,58 @@ float GetIniFloat(const char *sectionName, const char *keyName, float defaultVal return (float)GetIni().GetDoubleValue(sectionName, keyName, defaultValue); } +bool GetIniStringVector(const char *sectionName, const char *keyName, std::vector &stringValues) +{ + std::list 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) { 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) { 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) { 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) { 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) { 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 &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() @@ -272,7 +305,7 @@ void SetIniValue(const char *sectionName, const char *keyName, const char *value IniChangedChecker changedChecker(sectionName, keyName); auto &ini = GetIni(); 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)