OpenMW
apps/launcher/settings/settingsbase.hpp
Go to the documentation of this file.
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