Files
starruler-linux/source/game/profile/settings.cpp
T
2018-07-17 14:15:37 +02:00

128 lines
2.9 KiB
C++

#include "str_util.h"
#include "compat/misc.h"
#include "profile/settings.h"
namespace profile {
SettingCategory::SettingCategory() {
}
SettingCategory::SettingCategory(const std::string& Name) : name(Name) {
}
SettingCategory::~SettingCategory() {
}
Settings::~Settings() {
foreach(it, categories)
delete *it;
}
void Settings::clear() {
foreach(it, categories)
delete *it;
categories.clear();
settings.clear();
}
NamedGeneric* Settings::getSetting(const std::string& name) {
auto it = settings.find(name);
if(it == settings.end())
return 0;
return it->second;
}
void Settings::loadDescriptors(const std::string& filename) {
DataReader datafile(filename);
SettingCategory* cat = 0;
NamedGeneric* set = 0;
while(datafile++) {
if(datafile.key == "Category") {
cat = new SettingCategory();
categories.push_back(cat);
cat->name = datafile.value;
}
else if(cat) {
auto makeSetting = [&](GenericType typevalue) {
set = new NamedGeneric();
set->name = datafile.value;
set->type = typevalue;
cat->settings.push_back(set);
settings[set->name] = set;
};
if(datafile.key == "Bool") {
makeSetting(GT_Bool);
}
else if(datafile.key == "Integer") {
makeSetting(GT_Integer);
}
else if(datafile.key == "Double") {
makeSetting(GT_Double);
}
else if(datafile.key == "Enum") {
makeSetting(GT_Enum);
set->values = new std::vector<std::string>();
}
else if(datafile.key == "String") {
makeSetting(GT_String);
set->str = new std::string();
}
else if(set) {
if(datafile.key == "Default") {
set->fromString(datafile.value);
}
else if(datafile.key == "Option") {
if(set->type == GT_Enum)
set->values->push_back(datafile.value);
}
else if(datafile.key == "Min") {
if(set->type == GT_Integer)
set->num_min = toNumber<int>(datafile.value);
else if(set->type == GT_Double)
set->flt_min = toNumber<double>(datafile.value);
}
else if(datafile.key == "Max") {
if(set->type == GT_Integer)
set->num_max = toNumber<int>(datafile.value);
else if(set->type == GT_Double)
set->flt_max = toNumber<double>(datafile.value);
}
}
}
}
}
void Settings::addCategory(SettingCategory* cat) {
categories.push_back(cat);
foreach(it, cat->settings)
settings[(*it)->name] = (*it);
}
void Settings::loadSettings(const std::string& filename) {
DataReader datafile(filename);
while(datafile++) {
NamedGeneric* set = getSetting(datafile.key);
if(set)
set->fromString(datafile.value);
}
}
void Settings::saveSettings(const std::string& filename) {
std::ofstream file(filename);
for(auto iCat = categories.begin(), catEnd = categories.end(); iCat != catEnd; ++iCat) {
auto* cat = *iCat;
file << cat->name << "\n";
for(auto i = cat->settings.begin(), end = cat->settings.end(); i != end; ++i) {
auto* set = *i;
file << "\t" << set->name << ": " << set->toString() << "\n";
}
}
file.close();
}
};