aboutsummaryrefslogtreecommitdiff
path: root/src/settings.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/settings.cpp')
-rw-r--r--src/settings.cpp152
1 files changed, 92 insertions, 60 deletions
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 <QStandardPaths>
#include <fstream>
+#include <cstdio>
#include <QDir>
+#include <QFile>
#include <QFileInfo>
-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<bool>());
- break;
-
- case toml::Value::INT_TYPE:
- r = QVariant(x->as<int>());
- break;
- case toml::Value::DOUBLE_TYPE:
- r = QVariant(x->as<double>());
- break;
-
- case toml::Value::STRING_TYPE:
- r = QVariant(QString::fromStdString(x->as<std::string>()));
- 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<bool>());
+ break;
+
+ case toml::Value::INT_TYPE:
+ r = QVariant(value->as<int>());
+ break;
+
+ case toml::Value::DOUBLE_TYPE:
+ r = QVariant(value->as<double>());
+ break;
+
+ case toml::Value::STRING_TYPE:
+ r = QVariant(QString::fromStdString(value->as<std::string>()));
+ break;
+
+ case toml::Value::ARRAY_TYPE:
+ r = fromList(value);
+ break;
+
+ default:
+ qWarning("Unhandled type in configuration");
+ break;
+ }
+
+ return r;
+}