forked from qt-creator/qt-creator
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:
@@ -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()
|
||||
|
@@ -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");
|
||||
|
@@ -199,6 +199,7 @@ private slots:
|
||||
|
||||
void reparentingNodeLikeDragAndDrop();
|
||||
void testRewriterForGradientMagic();
|
||||
void testStatesVersionFailing();
|
||||
|
||||
//
|
||||
// old tests
|
||||
|
Reference in New Issue
Block a user