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

View File

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

View File

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