Implmented QSettings for loading / saving file definitions. Also

renamed opencs.cfg to opencs.ini to follow Ini format standards
openmw-30
graffy76 11 years ago
parent 3f737bbb44
commit 475214ab62

@ -368,7 +368,7 @@ configure_file(${OpenMW_SOURCE_DIR}/files/openmw.cfg.local
configure_file(${OpenMW_SOURCE_DIR}/files/openmw.cfg
"${OpenMW_BINARY_DIR}/openmw.cfg.install")
configure_file(${OpenMW_SOURCE_DIR}/files/opencs.cfg
configure_file(${OpenMW_SOURCE_DIR}/files/opencs.conf
"${OpenMW_BINARY_DIR}/opencs.cfg")
configure_file(${OpenMW_SOURCE_DIR}/files/opencs/defaultfilters

@ -27,7 +27,7 @@ CS::Editor::Editor (OgreInit::OgreInit& ogreInit)
setupDataFiles (config.first);
CSMSettings::UserSettings::instance().loadSettings ("opencs.cfg");
CSMSettings::UserSettings::instance().loadSettings ("opencs.ini");
mSettings.setModel (CSMSettings::UserSettings::instance());
ogreInit.init ((mCfgMgr.getUserConfigPath() / "opencsOgre.log").string());

@ -45,7 +45,7 @@ void CSMSettings::Setting::addProxy (const Setting *setting,
foreach (const QString &val, vals)
list << (QStringList() << val);
mProxies [setting->page() + '.' + setting->name()] = list;
mProxies [setting->page() + '/' + setting->name()] = list;
}
void CSMSettings::Setting::addProxy (const Setting *setting,
@ -54,7 +54,7 @@ void CSMSettings::Setting::addProxy (const Setting *setting,
if (serializable())
setProperty (Property_Serializable, false);
mProxies [setting->page() + '.' + setting->name()] = list;
mProxies [setting->page() + '/' + setting->name()] = list;
}
void CSMSettings::Setting::setColumnSpan (int value)

@ -3,6 +3,7 @@
#include <QMessageBox>
#include <QDebug>
#include <QList>
#include <QSettings>
#include "setting.hpp"
#include "settingmanager.hpp"
@ -20,15 +21,6 @@ CSMSettings::SettingManager::SettingManager(QObject *parent) :
}
void CSMSettings::SettingManager::dumpModel()
{
foreach (Setting *setting, mSettings)
{
if (setting->proxyLists().isEmpty())
continue;
}
}
CSMSettings::Setting *CSMSettings::SettingManager::createSetting
(CSMSettings::SettingType typ, const QString &page, const QString &name)
{
@ -36,7 +28,7 @@ CSMSettings::Setting *CSMSettings::SettingManager::createSetting
if (findSetting (page, name))
{
qWarning() << "Duplicate declaration encountered: "
<< (name + '.' + page);
<< (name + '/' + page);
return 0;
}
@ -49,182 +41,6 @@ CSMSettings::Setting *CSMSettings::SettingManager::createSetting
return setting;
}
CSMSettings::DefinitionPageMap
CSMSettings::SettingManager::readFilestream (QTextStream *stream)
{
//regEx's for page names and keys / values
QRegExp pageRegEx ("^\\[([^]]+)\\]");
QRegExp keyRegEx ("^([^=]+)\\s*=\\s*(.+)$");
QString currPage = "Unassigned";
DefinitionPageMap pageMap;
if (!stream)
{
displayFileErrorMessage(mReadWriteMessage, false);
return pageMap;
}
if (stream->atEnd())
return pageMap;
DefinitionMap *settingMap = new DefinitionMap();
pageMap[currPage] = settingMap;
while (!stream->atEnd())
{
QString line = stream->readLine().simplified();
if (line.isEmpty() || line.startsWith("#"))
continue;
//page name found
if (pageRegEx.exactMatch(line))
{
currPage = pageRegEx.cap(1).simplified().trimmed();
settingMap = new DefinitionMap();
pageMap[currPage] = settingMap;
continue;
}
//setting definition found
if ( (keyRegEx.indexIn(line) != -1))
{
QString settingName = keyRegEx.cap(1).simplified();
QString settingValue = keyRegEx.cap(2).simplified();
if (!settingMap->contains (settingName))
settingMap->insert (settingName, new QStringList());
settingMap->value(settingName)->append(settingValue);
}
}
//return empty map if no settings were ever added to
if (pageMap.size() == 1)
{
QString pageKey = pageMap.keys().at(0);
if (pageMap[pageKey]->size() == 0)
pageMap.clear();
}
return pageMap;
}
bool CSMSettings::SettingManager::writeFilestream(QTextStream *stream,
const QMap <QString, QStringList > &settingListMap)
{
if (!stream)
{
displayFileErrorMessage(mReadWriteMessage, false);
return false;
}
//disabled after rolling selector class into view. Need to
//iterate views to get setting definitions before writing to file
QStringList sectionKeys;
foreach (const QString &key, settingListMap.keys())
{
QStringList names = key.split('.');
QString section = names.at(0);
if (!sectionKeys.contains(section))
if (!settingListMap.value(key).isEmpty())
sectionKeys.append (section);
}
foreach (const QString &section, sectionKeys)
{
*stream << '[' << section << "]\n";
foreach (const QString &key, settingListMap.keys())
{
QStringList names = key.split('.');
if (names.at(0) != section)
continue;
QStringList list = settingListMap.value(key);
if (list.isEmpty())
continue;
QString name = names.at(1);
foreach (const QString value, list)
{
if (value.isEmpty())
continue;
*stream << name << " = " << value << '\n';
}
}
}
destroyStream (stream);
return true;
}
void CSMSettings::SettingManager::mergeSettings(DefinitionPageMap &destMap, DefinitionPageMap &srcMap)
{
if (srcMap.isEmpty())
return;
foreach (const QString &pageKey, srcMap.keys())
{
DefinitionMap *srcSetting = srcMap.value(pageKey);
//Unique Page:
//insertfrom the source map
if (!destMap.keys().contains (pageKey))
{
destMap.insert (pageKey, srcSetting);
continue;
}
DefinitionMap *destSetting = destMap.value(pageKey);
//Duplicate Page:
//iterate the settings in the source and check for duplicates in the
//destination
foreach (const QString &srcKey, srcSetting->keys())
{
//insert into destination if unique
if (!destSetting->keys().contains (srcKey))
destSetting->insert(srcKey, srcSetting->value (srcKey));
}
}
}
QTextStream *CSMSettings::SettingManager::openFilestream (const QString &filePath,
bool isReadOnly) const
{
QIODevice::OpenMode openFlags = QIODevice::Text;
if (isReadOnly)
openFlags = QIODevice::ReadOnly | openFlags;
else
openFlags = QIODevice::ReadWrite | QIODevice::Truncate | openFlags;
QFile *file = new QFile(filePath);
QTextStream *stream = 0;
if (file->open(openFlags))
stream = new QTextStream(file);
if (stream)
stream->setCodec(QTextCodec::codecForName("UTF-8"));
return stream;
}
void CSMSettings::SettingManager::destroyStream(QTextStream *stream) const
{
stream->device()->close();
delete stream;
}
void CSMSettings::SettingManager::displayFileErrorMessage(const QString &message,
bool isReadOnly) const
{
@ -242,29 +58,29 @@ void CSMSettings::SettingManager::displayFileErrorMessage(const QString &message
msgBox.exec();
}
void CSMSettings::SettingManager::addDefinitions (DefinitionPageMap &pageMap)
void CSMSettings::SettingManager::addDefinitions (const QSettings *settings)
{
foreach (QString pageName, pageMap.keys())
foreach (const QString &key, settings->allKeys())
{
DefinitionMap *settingMap = pageMap.value (pageName);
QStringList names = key.split('/');
Setting *setting = findSetting (names.at(0), names.at(1));
foreach (QString settingName, (*settingMap).keys())
if (!setting)
{
QStringList *values = settingMap->value (settingName);
Setting *setting = findSetting (pageName, settingName);
qWarning() << "Found definitions for undeclared setting "
<< names.at(0) << "." << names.at(1);
continue;
}
if (!setting)
{
qWarning() << "Found definitions for undeclared setting "
<< pageName << "." << settingName;
continue;
}
QStringList values = settings->value (key).toStringList();
if (values->size() == 0)
values->append (setting->defaultValues());
if (values.isEmpty())
values.append (setting->defaultValues());
setting->setDefinedValues (*values);
}
setting->setDefinedValues (values);
qDebug() << "added definitons " << values;
}
}
@ -297,7 +113,7 @@ CSMSettings::Setting *CSMSettings::SettingManager::findSetting
{
foreach (Setting *setting, mSettings)
{
if (setting->name() == settingName)
if (settingName.isEmpty() || (setting->name() == settingName))
{
if (setting->page() == pageName)
return setting;
@ -305,7 +121,7 @@ CSMSettings::Setting *CSMSettings::SettingManager::findSetting
}
return 0;
}
/*
QList <CSMSettings::Setting *> CSMSettings::SettingManager::findSettings
(const QString &pageName)
{
@ -318,7 +134,7 @@ QList <CSMSettings::Setting *> CSMSettings::SettingManager::findSettings
}
return settings;
}
*/
CSMSettings::SettingPageMap CSMSettings::SettingManager::settingPageMap() const
{
SettingPageMap pageMap;
@ -332,7 +148,7 @@ CSMSettings::SettingPageMap CSMSettings::SettingManager::settingPageMap() const
void CSMSettings::SettingManager::updateUserSetting(const QString &settingKey,
const QStringList &list)
{
QStringList names = settingKey.split('.');
QStringList names = settingKey.split('/');
Setting *setting = findSetting (names.at(0), names.at(1));

@ -5,6 +5,7 @@
#include <QMap>
#include <QStringList>
#include <QTextStream>
#include <QSettings>
#include "support.hpp"
#include "setting.hpp"
@ -30,7 +31,7 @@ namespace CSMSettings
///retrieve a setting object from a given page and setting name
Setting *findSetting
(const QString &pageName, const QString &settingName);
(const QString &pageName, const QString &settingName = QString());
///retrieve all settings for a specified page
QList <Setting *> findSettings (const QString &pageName);
@ -49,28 +50,12 @@ namespace CSMSettings
const QString &page, const QString &name);
///add definitions to the settings specified in the page map
void addDefinitions (DefinitionPageMap &pageMap);
///read setting definitions from file
DefinitionPageMap readFilestream(QTextStream *stream);
///write setting definitions to file
bool writeFilestream (QTextStream *stream,
const QMap <QString, QStringList > &settingMap);
///merge PageMaps of settings when loading from multiple files
void mergeSettings (DefinitionPageMap &destMap, DefinitionPageMap &srcMap);
QTextStream *openFilestream (const QString &filePath,
bool isReadOnly) const;
void destroyStream(QTextStream *stream) const;
void addDefinitions (const QSettings *settings);
void displayFileErrorMessage(const QString &message,
bool isReadOnly) const;
QList <Setting *> settings() const { return mSettings; }
void dumpModel();
signals:

@ -7,6 +7,7 @@
#include <QMap>
#include <QMessageBox>
#include <QTextCodec>
#include <QSettings>
#include <QFile>
#include <QSortFilterProxyModel>
@ -16,6 +17,7 @@
#include "setting.hpp"
#include "support.hpp"
#include <QDebug>
/**
* Workaround for problems with whitespaces in paths in older versions of Boost library
@ -40,6 +42,8 @@ CSMSettings::UserSettings::UserSettings()
assert(!mUserSettingsInstance);
mUserSettingsInstance = this;
mSettings = 0;
buildSettingModelDefaults();
}
@ -293,16 +297,16 @@ void CSMSettings::UserSettings::loadSettings (const QString &fileName)
(mCfgMgr.getLocalPath().string().c_str()) + fileName.toUtf8();
//open user and global streams
QTextStream *userStream = openFilestream (mUserFilePath, true);
QTextStream *otherStream = openFilestream (global, true);
//QTextStream *userStream = openFilestream (mUserFilePath, true);
// QTextStream *otherStream = openFilestream (global, true);
//failed stream, try for local
if (!otherStream)
otherStream = openFilestream (local, true);
// if (!otherStream)
// otherStream = openFilestream (local, true);
//error condition - notify and return
if (!otherStream || !userStream)
{
// if (!otherStream || !userStream)
/* {
QString message = QObject::tr("<br><b>An error was encountered loading \
user settings files.</b><br><br> One or several files could not \
be read. This may be caused by a missing configuration file, \
@ -316,40 +320,34 @@ void CSMSettings::UserSettings::loadSettings (const QString &fileName)
displayFileErrorMessage ( message, true);
return;
}
*/
//QSETTINGS TEST
qDebug() << mCfgMgr.getUserConfigPath().string().c_str() << ',' << mCfgMgr.getGlobalPath().string().c_str();
//success condition - merge the two streams into a single map and save
DefinitionPageMap totalMap = readFilestream (userStream);
DefinitionPageMap otherMap = readFilestream(otherStream);
QSettings::setPath (QSettings::IniFormat, QSettings::UserScope, mCfgMgr.getUserConfigPath().string().c_str());
QSettings::setPath (QSettings::IniFormat, QSettings::SystemScope, mCfgMgr.getGlobalPath().string().c_str());
//merging other settings file in and ignore duplicate settings to
//avoid overwriting user-level settings
mergeSettings (totalMap, otherMap);
if (mSettings)
delete mSettings;
if (!totalMap.isEmpty())
addDefinitions (totalMap);
mSettings = new QSettings
(QSettings::IniFormat, QSettings::UserScope, "opencs", QString(), this);
addDefinitions (mSettings);
}
void CSMSettings::UserSettings::saveSettings
(const QMap <QString, QStringList> &settingMap)
{
for (int i = 0; i < settings().size(); i++)
{
Setting* setting = settings().at(i);
QString key = setting->page() + '.' + setting->name();
if (!settingMap.keys().contains(key))
continue;
setting->setDefinedValues (settingMap.value(key));
}
foreach (const QString &key, settingMap.keys())
mSettings->setValue (key, settingMap.value (key));
writeFilestream (openFilestream (mUserFilePath, false), settingMap);
delete mSettings;
}
QString CSMSettings::UserSettings::settingValue (const QString &settingKey)
{
QStringList names = settingKey.split('.');
QStringList names = settingKey.split('/');
Setting *setting = findSetting(names.at(0), names.at(1));

@ -18,6 +18,7 @@ namespace Files { typedef std::vector<boost::filesystem::path> PathContainer;
struct ConfigurationManager;}
class QFile;
class QSettings;
namespace CSMSettings {
@ -32,6 +33,8 @@ namespace CSMSettings {
QString mReadOnlyMessage;
QString mReadWriteMessage;
QSettings *mSettings;
public:

@ -57,7 +57,7 @@ void CSVSettings::SettingWindow::createConnections
foreach (const QString &key, proxyMap.keys())
{
QStringList keyPair = key.split('.');
QStringList keyPair = key.split('/');
if (keyPair.size() != 2)
continue;

@ -14,7 +14,7 @@ CSVSettings::View::View(CSMSettings::Setting *setting,
: mDataModel(0), mParentPage (parent),
mHasFixedValues (!setting->declaredValues().isEmpty()),
mIsMultiValue (setting->isMultiValue()),
mViewKey (setting->page() + '.' + setting->name()),
mViewKey (setting->page() + '/' + setting->name()),
mSerializable (setting->serializable()),
Frame(true, setting->name(), parent)
{

@ -42,8 +42,10 @@ namespace CSVSettings
///State indicating whether the view will allow multiple values
bool mIsMultiValue;
///'pagename.settingname' form of the view's id
QString mViewKey;
///indicates whether or not the setting is written to file
bool mSerializable;
public:

Loading…
Cancel
Save