diff options
author | Christian Kandeler <christian.kandeler@digia.com> | 2014-07-10 12:19:04 +0200 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2014-07-10 17:13:44 +0200 |
commit | c78799a861c0e6ac171d60cec71c6f03a9eed19a (patch) | |
tree | e1a39405654191828302d0b80543f7c0b07d36d8 /src/app/shared | |
parent | 916dd4b2ceef5a420cf9713532feabd510c617ad (diff) |
qbs-config: Understand JavaScript for all types.
The current code understands JS maps, but not lists of maps etc, which
is certainly unexpected. So allow JS literals for all types.
Additionally, simple sequences of characters are still interpreted as
strings, so users are not forced to quote in the common case.
Change-Id: Ifd345b86cd730fb1d394dbf90e9357fed86edd97
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Diffstat (limited to 'src/app/shared')
-rw-r--r-- | src/app/shared/qbssettings.cpp | 43 |
1 files changed, 9 insertions, 34 deletions
diff --git a/src/app/shared/qbssettings.cpp b/src/app/shared/qbssettings.cpp index bbb81f28e..9bb3fe032 100644 --- a/src/app/shared/qbssettings.cpp +++ b/src/app/shared/qbssettings.cpp @@ -36,53 +36,28 @@ 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(",")); + return toJSLiteral(value); } -static QVariantMap mapFromString(const QString &str) +static QVariant variantFromString(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(); + return QVariant(); + return sv.toVariant(); } 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; + const QVariant variant = variantFromString(representation); + if (variant.isValid()) + return variant; + + // If it's not valid JavaScript, interpret the value as a string. return representation; } |