OpenMW
|
00001 #ifndef SETTINGSBASE_HPP 00002 #define SETTINGSBASE_HPP 00003 00004 #include <QTextStream> 00005 #include <QStringList> 00006 #include <QString> 00007 #include <QRegExp> 00008 #include <QMap> 00009 00010 namespace Launcher 00011 { 00012 template <class Map> 00013 class SettingsBase 00014 { 00015 00016 public: 00017 SettingsBase() { mMultiValue = false; } 00018 ~SettingsBase() {} 00019 00020 inline QString value(const QString &key, const QString &defaultValue = QString()) 00021 { 00022 return mSettings.value(key).isEmpty() ? defaultValue : mSettings.value(key); 00023 } 00024 00025 inline void setValue(const QString &key, const QString &value) 00026 { 00027 QStringList values = mSettings.values(key); 00028 if (!values.contains(value)) 00029 mSettings.insert(key, value); 00030 } 00031 00032 inline void setMultiValue(const QString &key, const QString &value) 00033 { 00034 QStringList values = mSettings.values(key); 00035 if (!values.contains(value)) 00036 mSettings.insertMulti(key, value); 00037 } 00038 00039 inline void setMultiValueEnabled(bool enable) 00040 { 00041 mMultiValue = enable; 00042 } 00043 00044 inline void remove(const QString &key) 00045 { 00046 mSettings.remove(key); 00047 } 00048 00049 Map getSettings() {return mSettings;} 00050 00051 bool readFile(QTextStream &stream) 00052 { 00053 mCache.clear(); 00054 00055 QString sectionPrefix; 00056 00057 QRegExp sectionRe("^\\[([^]]+)\\]"); 00058 QRegExp keyRe("^([^=]+)\\s*=\\s*(.+)$"); 00059 00060 while (!stream.atEnd()) { 00061 QString line = stream.readLine(); 00062 00063 if (line.isEmpty() || line.startsWith("#")) 00064 continue; 00065 00066 if (sectionRe.exactMatch(line)) { 00067 sectionPrefix = sectionRe.cap(1); 00068 sectionPrefix.append("/"); 00069 continue; 00070 } 00071 00072 if (keyRe.indexIn(line) != -1) { 00073 00074 QString key = keyRe.cap(1).trimmed(); 00075 QString value = keyRe.cap(2).trimmed(); 00076 00077 if (!sectionPrefix.isEmpty()) 00078 key.prepend(sectionPrefix); 00079 00080 mSettings.remove(key); 00081 00082 QStringList values = mCache.values(key); 00083 00084 if (!values.contains(value)) { 00085 if (mMultiValue) { 00086 mCache.insertMulti(key, value); 00087 } else { 00088 mCache.insert(key, value); 00089 } 00090 } 00091 } 00092 } 00093 00094 if (mSettings.isEmpty()) { 00095 mSettings = mCache; // This is the first time we read a file 00096 return true; 00097 } 00098 00099 // Merge the changed keys with those which didn't 00100 mSettings.unite(mCache); 00101 return true; 00102 } 00103 00104 private: 00105 Map mSettings; 00106 Map mCache; 00107 00108 bool mMultiValue; 00109 }; 00110 } 00111 #endif // SETTINGSBASE_HPP