Utils: Write Key/Store to settings

We claim that we still store QVariantMap to keep the format unchanged.

Change-Id: Ie7b0a83febfeb2cb3cfc9ee42b8423453cf3b1c4
Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
This commit is contained in:
hjk
2023-08-25 15:38:03 +02:00
parent e5afe02556
commit 52d1cd47cb
4 changed files with 31 additions and 18 deletions

View File

@@ -360,22 +360,21 @@ FilePath PersistentSettingsReader::filePath()
static void writeVariantValue(QXmlStreamWriter &w, const Context &ctx,
const QVariant &variant, const Key &key = {})
{
switch (static_cast<int>(variant.type())) {
case static_cast<int>(QVariant::StringList):
case static_cast<int>(QVariant::List): {
static const int storeId = qMetaTypeId<Store>();
const int variantType = variant.typeId();
if (variantType == QMetaType::QStringList || variantType == QMetaType::QVariantList) {
w.writeStartElement(ctx.valueListElement);
w.writeAttribute(ctx.typeAttribute, QLatin1String(QVariant::typeToName(QVariant::List)));
w.writeAttribute(ctx.typeAttribute, "QVariantList");
if (!key.isEmpty())
w.writeAttribute(ctx.keyAttribute, key);
const QList<QVariant> list = variant.toList();
for (const QVariant &var : list)
writeVariantValue(w, ctx, var);
w.writeEndElement();
break;
}
case static_cast<int>(QVariant::Map): {
} else if (variantType == storeId || variantType == QMetaType::QVariantMap) {
w.writeStartElement(ctx.valueMapElement);
w.writeAttribute(ctx.typeAttribute, QLatin1String(QVariant::typeToName(QVariant::Map)));
w.writeAttribute(ctx.typeAttribute, "QVariantMap");
if (!key.isEmpty())
w.writeAttribute(ctx.keyAttribute, key);
const Store varMap = storeFromVariant(variant);
@@ -383,12 +382,11 @@ static void writeVariantValue(QXmlStreamWriter &w, const Context &ctx,
for (Store::const_iterator i = varMap.constBegin(); i != cend; ++i)
writeVariantValue(w, ctx, i.value(), i.key());
w.writeEndElement();
}
break;
case static_cast<int>(QMetaType::QObjectStar): // ignore QObjects!
case static_cast<int>(QMetaType::VoidStar): // ignore void pointers!
break;
default:
} else if (variantType == QMetaType::QObjectStar) {
// ignore QObjects
} else if (variantType == QMetaType::VoidStar) {
// ignore void pointers
} else {
w.writeStartElement(ctx.valueElement);
w.writeAttribute(ctx.typeAttribute, QLatin1String(variant.typeName()));
if (!key.isEmpty())
@@ -402,7 +400,6 @@ static void writeVariantValue(QXmlStreamWriter &w, const Context &ctx,
break;
}
w.writeEndElement();
break;
}
}

View File

@@ -387,7 +387,7 @@ Store VersionUpgrader::renameKeys(const QList<Change> &changes, Store map) const
Store::iterator i = map.begin();
while (i != map.end()) {
QVariant v = i.value();
if (v.type() == QVariant::Map)
if (Utils::isStore(v))
i.value() = variantFromStore(renameKeys(changes, storeFromVariant(v)));
++i;
@@ -717,7 +717,7 @@ static QVariant mergeQVariantMapsRecursion(const Store &mainTree, const Store &s
QPair<Key, QVariant> kv = mergeResult.value();
if (kv.second.type() == QVariant::Map) {
if (Utils::isStore(kv.second)) {
const Key newKeyPrefix = keyPrefix + kv.first + '/';
kv.second = mergeQVariantMapsRecursion(mainTree, secondaryTree, newKeyPrefix,
storeFromVariant(kv.second),

View File

@@ -4,6 +4,7 @@
#include "store.h"
#include "algorithm.h"
#include "qtcassert.h"
namespace Utils {
@@ -24,7 +25,14 @@ QVariant variantFromStore(const Store &store)
Store storeFromVariant(const QVariant &value)
{
return value.value<Store>();
if (value.typeId() == qMetaTypeId<Store>())
return value.value<Store>();
if (value.typeId() == QMetaType::QVariantMap)
return storeFromMap(value.toMap());
QTC_CHECK(false);
return Store();
}
#ifdef QTC_USE_STORE
@@ -99,4 +107,10 @@ QVariantMap mapFromStore(const Store &store)
#endif
}
bool isStore(const QVariant &value)
{
const int typeId = value.typeId();
return typeId == QMetaType::QVariantMap || typeId == qMetaTypeId<Store>();
}
} // Utils

View File

@@ -27,6 +27,8 @@ QTCREATOR_UTILS_EXPORT Store storeFromVariant(const QVariant &value);
QTCREATOR_UTILS_EXPORT Store storeFromMap(const QVariantMap &map);
QTCREATOR_UTILS_EXPORT QVariantMap mapFromStore(const Store &store);
QTCREATOR_UTILS_EXPORT bool isStore(const QVariant &value);
} // Utils
#ifdef QTC_USE_STORE