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)) {
|
if (!hasPropertyChanges(node)) {
|
||||||
ModelNode newChangeSet;
|
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);
|
modelNode().nodeListProperty("changes").reparentHere(newChangeSet);
|
||||||
|
|
||||||
@@ -287,9 +293,16 @@ QmlModelStateGroup QmlModelState::stateGroup() const
|
|||||||
|
|
||||||
ModelNode QmlModelState::createQmlState(AbstractView *view, const PropertyListType &propertyList)
|
ModelNode QmlModelState::createQmlState(AbstractView *view, const PropertyListType &propertyList)
|
||||||
{
|
{
|
||||||
|
QTC_ASSERT(view, return {});
|
||||||
QTC_CHECK(view->majorQtQuickVersion() < 3);
|
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()
|
void QmlModelState::setAsDefault()
|
||||||
|
@@ -1234,6 +1234,115 @@ void tst_TestCore::testRewriterForGradientMagic()
|
|||||||
transaction.commit();
|
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()
|
void tst_TestCore::loadSubItems()
|
||||||
{
|
{
|
||||||
QFile file(QString(TESTSRCDIR) + "/../data/fx/topitem.qml");
|
QFile file(QString(TESTSRCDIR) + "/../data/fx/topitem.qml");
|
||||||
|
@@ -199,6 +199,7 @@ private slots:
|
|||||||
|
|
||||||
void reparentingNodeLikeDragAndDrop();
|
void reparentingNodeLikeDragAndDrop();
|
||||||
void testRewriterForGradientMagic();
|
void testRewriterForGradientMagic();
|
||||||
|
void testStatesVersionFailing();
|
||||||
|
|
||||||
//
|
//
|
||||||
// old tests
|
// old tests
|
||||||
|
Reference in New Issue
Block a user