diff --git a/src/plugins/qmldesigner/designercore/model/qmlstate.cpp b/src/plugins/qmldesigner/designercore/model/qmlstate.cpp index bddbe63b33c..70bb2719383 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlstate.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlstate.cpp @@ -157,7 +157,13 @@ void QmlModelState::addChangeSetIfNotExists(const ModelNode &node) if (!hasPropertyChanges(node)) { ModelNode newChangeSet; - newChangeSet = modelNode().view()->createModelNode("QtQuick.PropertyChanges", view()->majorQtQuickVersion(), 0); + const QByteArray typeName = "QtQuick.PropertyChanges"; + NodeMetaInfo metaInfo = modelNode().model()->metaInfo(typeName); + + int major = metaInfo.majorVersion(); + int minor = metaInfo.minorVersion(); + + newChangeSet = modelNode().view()->createModelNode(typeName, major, minor); modelNode().nodeListProperty("changes").reparentHere(newChangeSet); @@ -287,9 +293,16 @@ QmlModelStateGroup QmlModelState::stateGroup() const ModelNode QmlModelState::createQmlState(AbstractView *view, const PropertyListType &propertyList) { + QTC_ASSERT(view, return {}); QTC_CHECK(view->majorQtQuickVersion() < 3); - return view->createModelNode("QtQuick.State", 2, 0, propertyList); + const QByteArray typeName = "QtQuick.State"; + NodeMetaInfo metaInfo = view->model()->metaInfo(typeName); + + int major = metaInfo.majorVersion(); + int minor = metaInfo.minorVersion(); + + return view->createModelNode(typeName, major, minor, propertyList); } void QmlModelState::setAsDefault() diff --git a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp index c8c81453197..26b8ddcf8e3 100644 --- a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp +++ b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp @@ -1234,6 +1234,115 @@ void tst_TestCore::testRewriterForGradientMagic() transaction.commit(); } +void tst_TestCore::testStatesVersionFailing() +{ + char qmlString[] = "import QtQuick\n" + "Rectangle {\n" + "id: root;\n" + "Rectangle {\n" + "id: rect1;\n" + "}\n" + "Rectangle {\n" + "id: rect2;\n" + "}\n" + "states: [\n" + "State {\n" + "name: \"state1\"\n" + "PropertyChanges {\n" + "target: rect1\n" + "}\n" + "}\n" + "]\n" + "}\n"; + + Exception::setShouldAssert(true); + + QPlainTextEdit textEdit; + textEdit.setPlainText(QLatin1String(qmlString)); + NotIndentingTextEditModifier textModifier(&textEdit); + + QScopedPointer model(Model::create("QtQuick.Item")); + QVERIFY(model.data()); + + QScopedPointer view(new TestView(model.data())); + QVERIFY(view.data()); + model->attachView(view.data()); + + ModelNode rootModelNode(view->rootModelNode()); + QVERIFY(rootModelNode.isValid()); + QCOMPARE(rootModelNode.type(), QmlDesigner::TypeName("QtQuick.Item")); + QScopedPointer testRewriterView(new TestRewriterView()); + testRewriterView->setTextModifier(&textModifier); + + model->attachView(testRewriterView.data()); + QVERIFY(rootModelNode.isValid()); + QCOMPARE(rootModelNode.type(), QmlDesigner::TypeName("QtQuick.Rectangle")); + + QCOMPARE(QmlItemNode(rootModelNode).states().allStates().count(), 1); + QCOMPARE(QmlItemNode(rootModelNode).states().names().count(), 1); + QCOMPARE(QmlItemNode(rootModelNode).states().names().first(), QString("state1")); + + QmlModelState state = QmlItemNode(rootModelNode).states().state("state1"); + ModelNode stateNode = QmlItemNode(rootModelNode).states().state("state1").modelNode(); + QVERIFY(stateNode.isValid()); + + NodeMetaInfo stateInfo = stateNode.metaInfo(); + + QVERIFY(stateInfo.isValid()); + QmlModelState newState = state.duplicate("state2"); + + QCOMPARE(QmlItemNode(rootModelNode).states().allStates().count(), 2); + QCOMPARE(QmlItemNode(rootModelNode).states().names().count(), 2); + QCOMPARE(QmlItemNode(rootModelNode).states().names().last(), QString("state2")); + + QCOMPARE(QmlItemNode(rootModelNode).states().state("state2"), newState); + + QCOMPARE(stateInfo.majorVersion(), newState.modelNode().majorVersion()); + QCOMPARE(stateInfo.minorVersion(), newState.modelNode().minorVersion()); + + ModelNode rect1Node = view->modelNodeForId("rect1"); + QVERIFY(rect1Node.isValid()); + QmlObjectNode rect1(rect1Node); + QmlPropertyChanges changes = newState.propertyChanges(rect1Node); + QVERIFY(changes.isValid()); + + NodeMetaInfo changeInfo = changes.modelNode().metaInfo(); + QVERIFY(changeInfo.isValid()); + + QVERIFY(!changes.modelNode().hasProperty("x")); + + view->setCurrentState(newState); + + QVERIFY(view->currentState() == newState); + + QString oldText = textEdit.toPlainText(); + + rect1.setVariantProperty("x", 100); + QVERIFY(changes.modelNode().hasProperty("x")); + QVERIFY(oldText != textEdit.toPlainText()); + + ModelNode rect2Node = view->modelNodeForId("rect2"); + QVERIFY(rect2Node.isValid()); + QmlObjectNode rect2(rect2Node); + QVERIFY(!newState.hasPropertyChanges(rect2Node)); + QmlPropertyChanges changes2 = newState.propertyChanges(rect2Node); + + QVERIFY(changes2.isValid()); + + QVERIFY(view->currentState() == newState); + + oldText = textEdit.toPlainText(); + + rect2.setVariantProperty("x", 100); + changes2 = newState.propertyChanges(rect2Node); + QVERIFY(changes2.isValid()); + QVERIFY(changes2.modelNode().hasProperty("x")); + QVERIFY(oldText != textEdit.toPlainText()); + + QCOMPARE(changeInfo.majorVersion(), changes2.modelNode().majorVersion()); + QCOMPARE(changeInfo.minorVersion(), changes2.modelNode().minorVersion()); +} + void tst_TestCore::loadSubItems() { QFile file(QString(TESTSRCDIR) + "/../data/fx/topitem.qml"); diff --git a/tests/auto/qml/qmldesigner/coretests/tst_testcore.h b/tests/auto/qml/qmldesigner/coretests/tst_testcore.h index d052bf950e5..9a8aeb6450b 100644 --- a/tests/auto/qml/qmldesigner/coretests/tst_testcore.h +++ b/tests/auto/qml/qmldesigner/coretests/tst_testcore.h @@ -199,6 +199,7 @@ private slots: void reparentingNodeLikeDragAndDrop(); void testRewriterForGradientMagic(); + void testStatesVersionFailing(); // // old tests