aboutsummaryrefslogtreecommitdiffstats
path: root/src/app/shared
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@digia.com>2014-07-10 12:19:04 +0200
committerJoerg Bornemann <joerg.bornemann@digia.com>2014-07-10 17:13:44 +0200
commitc78799a861c0e6ac171d60cec71c6f03a9eed19a (patch)
treee1a39405654191828302d0b80543f7c0b07d36d8 /src/app/shared
parent916dd4b2ceef5a420cf9713532feabd510c617ad (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.cpp43
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;
}