QmlDesigner: Set proper version when duplicating states

When duplicating a state we did not set the correct version.
This stopped the rewriter from syncing the property with the QML code.
I added a regression test.

Task-number: QDS-6185
Change-Id: I11552a9f880eb83f4df1341fb0b94c9a3a6e5035
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
Thomas Hartmann
2022-02-10 16:12:08 +01:00
parent 3ba00ac39f
commit 6472e8c5bb
3 changed files with 125 additions and 2 deletions

View File

@@ -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()

View File

@@ -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(Model::create("QtQuick.Item"));
QVERIFY(model.data());
QScopedPointer<TestView> 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> 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");

View File

@@ -199,6 +199,7 @@ private slots:
void reparentingNodeLikeDragAndDrop();
void testRewriterForGradientMagic();
void testStatesVersionFailing();
//
// old tests