#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(); } 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(datafile.value); else if(set->type == GT_Double) set->flt_min = toNumber(datafile.value); } else if(datafile.key == "Max") { if(set->type == GT_Integer) set->num_max = toNumber(datafile.value); else if(set->type == GT_Double) set->flt_max = toNumber(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(); } };