diff --git a/src/plugins/qmldesigner/core/model/rewriteaction.cpp b/src/plugins/qmldesigner/core/model/rewriteaction.cpp index d681a6d15fdfa431bbb02b5ec2fec88ea8595e38..6475137688b69ff5848da506f2a10c9ad9561858 100644 --- a/src/plugins/qmldesigner/core/model/rewriteaction.cpp +++ b/src/plugins/qmldesigner/core/model/rewriteaction.cpp @@ -30,6 +30,7 @@ #include <QtCore/QDebug> #include "nodeabstractproperty.h" +#include "nodelistproperty.h" #include "rewriteaction.h" using namespace QmlDesigner; @@ -93,6 +94,16 @@ bool AddPropertyRewriteAction::execute(QmlRefactoring &refactoring, ModelNodePos << m_valueText << ") **" << info(); } + } else if (m_property.isNodeListProperty() && m_property.toNodeListProperty().toModelNodeList().size() > 1) { + result = refactoring.addToArrayMemberList(nodeLocation, m_property.name(), m_valueText); + + if (!result) { + qDebug() << "*** AddPropertyRewriteAction::execute failed in addToArrayMemberList(" + << nodeLocation << ',' + << m_property.name() << ',' + << m_valueText << ") **" + << info(); + } } else { result = refactoring.addProperty(nodeLocation, m_property.name(), m_valueText, m_propertyType); @@ -100,7 +111,8 @@ bool AddPropertyRewriteAction::execute(QmlRefactoring &refactoring, ModelNodePos qDebug() << "*** AddPropertyRewriteAction::execute failed in addProperty(" << nodeLocation << ',' << m_property.name() << ',' - << m_valueText << ", ScriptBinding) **" + << m_valueText << "," + << qPrintable(toString(m_propertyType)) << ") **" << info(); } } diff --git a/src/plugins/qmldesigner/core/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/core/model/texttomodelmerger.cpp index efeb8794ba6b412803dd2317ca1d629e72719a7e..c1d6e277b0f12095c8d62d87c7ab2af0050d07a3 100644 --- a/src/plugins/qmldesigner/core/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/core/model/texttomodelmerger.cpp @@ -367,7 +367,12 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, const QString astPropertyName = flatten(array->qualifiedId); if (isValidPropertyForNode(modelNode, astPropertyName)) { AbstractProperty modelProperty = modelNode.property(astPropertyName); - syncArrayProperty(modelProperty, array, context, differenceHandler); + QList<UiObjectMember *> arrayMembers; + for (UiArrayMemberList *iter = array->members; iter; iter = iter->next) + if (UiObjectMember *member = iter->member) + arrayMembers.append(member); + + syncArrayProperty(modelProperty, arrayMembers, context, differenceHandler); modelPropertyNames.remove(astPropertyName); } else { qWarning() << "Skipping invalid array property" << astPropertyName @@ -383,8 +388,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, if (isValidPropertyForNode(modelNode, astPropertyName)) { AbstractProperty modelProperty = modelNode.property(astPropertyName); if (modelProperty.metaInfo().isListProperty()) { - NodeListProperty listProperty = modelProperty.toNodeListProperty(); - syncNodeListProperty(listProperty, QList<QmlJS::AST::UiObjectMember*>() << member, context, differenceHandler); + syncArrayProperty(modelProperty, QList<QmlJS::AST::UiObjectMember*>() << member, context, differenceHandler); } else { syncNodeProperty(modelProperty, binding, context, differenceHandler); } @@ -538,15 +542,10 @@ void TextToModelMerger::syncExpressionProperty(AbstractProperty &modelProperty, } void TextToModelMerger::syncArrayProperty(AbstractProperty &modelProperty, - UiArrayBinding *array, + const QList<UiObjectMember *> &arrayMembers, ReadingContext *context, DifferenceHandler &differenceHandler) { - QList<UiObjectMember *> arrayMembers; - for (UiArrayMemberList *iter = array->members; iter; iter = iter->next) - if (UiObjectMember *member = iter->member) - arrayMembers.append(member); - if (modelProperty.isNodeListProperty()) { NodeListProperty nodeListProperty = modelProperty.toNodeListProperty(); syncNodeListProperty(nodeListProperty, arrayMembers, context, differenceHandler); diff --git a/src/plugins/qmldesigner/core/model/texttomodelmerger.h b/src/plugins/qmldesigner/core/model/texttomodelmerger.h index 8933e0866fa6ac2c09fc2464ce12d69c442c501a..19a6e4738db4a59feb775f18a41badccfcee80c8 100644 --- a/src/plugins/qmldesigner/core/model/texttomodelmerger.h +++ b/src/plugins/qmldesigner/core/model/texttomodelmerger.h @@ -78,7 +78,7 @@ public: const QString &javascript, DifferenceHandler &differenceHandler); void syncArrayProperty(AbstractProperty &modelProperty, - QmlJS::AST::UiArrayBinding *array, + const QList<QmlJS::AST::UiObjectMember *> &arrayMembers, ReadingContext *context, DifferenceHandler &differenceHandler); void syncVariantProperty(AbstractProperty &modelProperty, diff --git a/tests/auto/qml/qmldesigner/coretests/testcore.cpp b/tests/auto/qml/qmldesigner/coretests/testcore.cpp index 2568e4ead9e932ee6070d774afeb56894ba2eb42..25604f4b8cdfd3187f6a5a2f8fabc6c55d557fe9 100644 --- a/tests/auto/qml/qmldesigner/coretests/testcore.cpp +++ b/tests/auto/qml/qmldesigner/coretests/testcore.cpp @@ -2441,6 +2441,7 @@ void TestCore::testRewriterForArrayMagic() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); QCOMPARE(rootNode.type(), QString("Qt/Rectangle")); + QVERIFY(rootNode.property(QLatin1String("states")).isNodeListProperty()); QmlItemNode rootItem(rootNode); QVERIFY(rootItem.isValid());