diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.cpp index 5c05d685a79..cd8296ca2de 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.cpp @@ -428,6 +428,7 @@ void CollectionDetails::resetPropertyType(CollectionProperty &property) break; } } + property.type = type; } diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp index 969333bc3fd..2374726f92c 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp @@ -542,12 +542,52 @@ void CollectionDetailsModel::loadCsvCollection(const QString &source, } } + for (const QString &header : std::as_const(headers)) { + for (QJsonObject &element: elements) { + QVariant variantValue; + if (element.contains(header)) { + variantValue = variantFromString(element.value(header).toString()); + element[header] = variantValue.toJsonValue(); + + if (variantValue.isValid()) + break; + } + } + } + SourceFormat sourceFormat = csvFileIsOk ? SourceFormat::Csv : SourceFormat::Unknown; beginResetModel(); m_currentCollection.resetDetails(headers, elements, sourceFormat); endResetModel(); } +QVariant CollectionDetailsModel::variantFromString(const QString &value) +{ + constexpr QStringView typesPattern{u"(?^(?:true|false)$)|" + u"(?^(?:-?(?:0|[1-9]\\d*)?(?:\\.\\d*)?(?<=\\d|\\.)" + u"(?:e-?(?:0|[1-9]\\d*))?|0x[0-9a-f]+)$)|" + u"(?^(?:#(?:(?:[0-9a-fA-F]{2}){3,4}|" + u"(?:[0-9a-fA-F]){3,4}))$)|" + u"(?[A-Za-z][A-Za-z0-9_ -]*)"}; + static QRegularExpression validator(typesPattern.toString()); + const QString trimmedValue = value.trimmed(); + QRegularExpressionMatch match = validator.match(trimmedValue); + QVariant variantValue = value; + + if (value.isEmpty()) + return QVariant(); + if (!match.captured(u"boolean").isEmpty()) + return variantValue.toBool(); + if (!match.captured(u"number").isEmpty()) + return variantValue.toDouble(); + if (!match.captured(u"color").isEmpty()) + return variantValue.value(); + if (!match.captured(u"string").isEmpty()) + return variantValue.toString(); + + return QVariant::fromValue(value); +} + void CollectionDetailsModel::setCollectionName(const QString &newCollectionName) { if (m_collectionName != newCollectionName) { diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.h b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.h index 7b0e668aec9..38c59d8fe92 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.h +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.h @@ -83,6 +83,7 @@ private: void loadCsvCollection(const QString &source, const QString &collectionName); bool saveCollectionAsJson(const QString &path, const QJsonArray &content, const QString &collectionName); bool saveCollectionAsCsv(const QString &path, const QString &content); + QVariant variantFromString(const QString &value); QHash m_openedCollections; CollectionDetails m_currentCollection;