From feb69af5c8c2517ea21398810ec9c603aef3032e Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Sat, 1 Jul 2017 16:16:10 +0200 Subject: Configuration defaults file --- src/settings.cpp | 152 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 92 insertions(+), 60 deletions(-) (limited to 'src/settings.cpp') diff --git a/src/settings.cpp b/src/settings.cpp index c1485b1..a0fad7f 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -21,56 +21,55 @@ #include "settings.h" #include #include +#include #include +#include #include -Settings::Settings(const QString &configFile) +Settings::Settings(const QString &configFile, const QString &defaultsFile) { - std::ifstream ifs(configFile.toStdString().c_str()); - if(ifs.is_open()) { - toml::ParseResult pr = toml::parse(ifs); + values = parse(configFile); + defaults = parse(defaultsFile); - if(!pr.valid()) { - qWarning("Invalid configuration: %s", pr.errorReason.c_str()); - return; - } - - v = pr.value; - ifs.close(); - - } else { - qWarning("Cannot open configuration: %s", qUtf8Printable(configFile)); - return; - } + m_configurationPath = configFile; + m_defaultsPath = defaultsFile; - path = configFile; homeLocation = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); settingsLocation = QFileInfo(configFile).dir().absolutePath(); cacheLocation = QStandardPaths::writableLocation(QStandardPaths::CacheLocation); - qDebug("Read configuration: [%s]", qUtf8Printable(configFile)); - qDebug("$home | '%s'", qUtf8Printable(homeLocation)); - qDebug("$settings | '%s'", qUtf8Printable(settingsLocation)); - qDebug("$cache | '%s'", qUtf8Printable(cacheLocation)); +#ifdef QT_DEBUG + qDebug(">> Configuration"); + qDebug("- values: [%s]", qUtf8Printable(configFile)); + qDebug("- defaults: [%s]", qUtf8Printable(defaultsFile)); + qDebug("- $home | '%s'", qUtf8Printable(homeLocation)); + qDebug("- $settings | '%s'", qUtf8Printable(settingsLocation)); + qDebug("- $cache | '%s'", qUtf8Printable(cacheLocation)); +#endif } Settings::~Settings() { } -QString Settings::filePath() const +QString Settings::configurationPath() const { - return path; + return m_configurationPath; +} + +QString Settings::defaultsPath() const +{ + return m_defaultsPath; } bool Settings::isEmpty() const { - return v.empty(); + return values.empty(); } bool Settings::contains(const QString &key) { - const toml::Value *x = v.find(key.toStdString()); + const toml::Value *x = values.find(key.toStdString()); if(x) { return true; } else { @@ -78,45 +77,19 @@ bool Settings::contains(const QString &key) } } -QVariant Settings::value(const QString &key, const QVariant &defaultValue) const +QVariant Settings::value(const QString &key) const { - const toml::Value *x = v.find(key.toStdString()); - - // check if value exists - if(!x) { - return defaultValue; - } + const toml::Value *cValue = values.find(key.toStdString()); + const toml::Value *dValue = defaults.find(key.toStdString()); QVariant r; - switch (x->type()) { - case toml::Value::NULL_TYPE: - r = defaultValue; - break; - - case toml::Value::BOOL_TYPE: - r = QVariant(x->as()); - break; - - case toml::Value::INT_TYPE: - r = QVariant(x->as()); - break; - case toml::Value::DOUBLE_TYPE: - r = QVariant(x->as()); - break; - - case toml::Value::STRING_TYPE: - r = QVariant(QString::fromStdString(x->as())); - break; - - case toml::Value::ARRAY_TYPE: - r = fromList(x); - break; - - default: - qWarning("Unhandled type in configuration"); - r = defaultValue; - break; + if(values.has(key.toStdString())) { + r = valueToVariant(cValue); + } else { + if(defaults.has(key.toStdString())) { + r = valueToVariant(dValue); + } } // check if key is a path, in which case replace '~' with the home location @@ -133,6 +106,30 @@ QVariant Settings::value(const QString &key, const QVariant &defaultValue) const return r; } +toml::Value Settings::parse(const QString &filename) +{ + toml::Value r; + + if(!filename.isEmpty()) { + QFile file(filename); + if(file.open(QIODevice::ReadOnly)) { + std::stringstream d(file.readAll().toStdString()); + file.close(); + + toml::ParseResult result = toml::parse(d); + if(!result.valid()) { + qWarning("Invalid configuration: %s", result.errorReason.c_str()); + } + r = result.value; + + } else { + qWarning("Cannot open configuration: %s", qUtf8Printable(filename)); + } + } + + return r; +} + QVariant Settings::fromList(const toml::Value *list) const { QStringList l; @@ -144,3 +141,38 @@ QVariant Settings::fromList(const toml::Value *list) const return QVariant(l); } + +QVariant Settings::valueToVariant(const toml::Value *value) const +{ + QVariant r; + switch (value->type()) { + case toml::Value::NULL_TYPE: + break; + + case toml::Value::BOOL_TYPE: + r = QVariant(value->as()); + break; + + case toml::Value::INT_TYPE: + r = QVariant(value->as()); + break; + + case toml::Value::DOUBLE_TYPE: + r = QVariant(value->as()); + break; + + case toml::Value::STRING_TYPE: + r = QVariant(QString::fromStdString(value->as())); + break; + + case toml::Value::ARRAY_TYPE: + r = fromList(value); + break; + + default: + qWarning("Unhandled type in configuration"); + break; + } + + return r; +} -- cgit v1.2.1