diff options
author | Joerg Bornemann <joerg.bornemann@digia.com> | 2014-07-08 15:06:05 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@digia.com> | 2014-07-10 11:22:59 +0200 |
commit | 840c3d9db7db82332fcb2372aaf43c19575553c0 (patch) | |
tree | 35b29bc7d83c72ab531104ddb1a01376a9899006 /src/app | |
parent | 3b50726352fd1b1c5fc5424856ccb9446c87a30f (diff) |
support map values in settings
The config command can now read and write maps.
Example:
qbs config foo '{"foo":"bar","zoo":"baz"}'
Change-Id: I54c67f21fd6fd4a291d547abb6097a0dd9022d9f
Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
Diffstat (limited to 'src/app')
-rw-r--r-- | src/app/shared/qbssettings.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/app/shared/qbssettings.cpp b/src/app/shared/qbssettings.cpp index 5f6131214..bbb81f28e 100644 --- a/src/app/shared/qbssettings.cpp +++ b/src/app/shared/qbssettings.cpp @@ -29,19 +29,58 @@ #include "qbssettings.h" +#include <tools/scripttools.h> + +#include <QScriptEngine> +#include <QScriptValue> + +using qbs::toJSLiteral; + +static QString mapToString(const QVariantMap &vm) +{ + QString str = QLatin1String("{"); + for (QVariantMap::const_iterator it = vm.begin(); it != vm.end(); ++it) { + if (it != vm.begin()) + str += QLatin1Char(','); + if (it.value().type() == QVariant::Map) { + str += toJSLiteral(it.key()) + QLatin1Char(':'); + str += mapToString(it.value().toMap()); + } else { + str += toJSLiteral(it.key()) + QLatin1Char(':') + toJSLiteral(it.value()); + } + } + str += QLatin1Char('}'); + return str; +} + QString settingsValueToRepresentation(const QVariant &value) { if (value.type() == QVariant::Bool) return QLatin1String(value.toBool() ? "true" : "false"); + if (value.type() == QVariant::Map) + return mapToString(value.toMap()); return value.toStringList().join(QLatin1String(",")); } +static QVariantMap mapFromString(const QString &str) +{ + // ### use Qt5's JSON reader at some point. + QScriptEngine engine; + QScriptValue sv = engine.evaluate(QLatin1String("(function(){return ") + + str + QLatin1String(";})()")); + if (sv.isError()) + return QVariantMap(); + return sv.toVariant().toMap(); +} + QVariant representationToSettingsValue(const QString &representation) { if (representation == QLatin1String("true")) return QVariant(true); if (representation == QLatin1String("false")) return QVariant(false); + if (representation.startsWith(QLatin1Char('{'))) + return mapFromString(representation); const QStringList list = representation.split(QLatin1Char(','), QString::SkipEmptyParts); if (list.count() > 1) return list; |