aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2022-10-25 18:06:43 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2022-10-27 08:53:12 +0000
commit90e5ca47480f1eec6cd479a975923f52a14cadac (patch)
tree35a6d7c046bddca69a2687b77f1395288a97f549
parent565bb8052ff869cb103fcbe0fe34ed7a3ee1070f (diff)
QmlDesigner: Fix duplicating materials with dynamic properties
Fixes: QDS-8091 Change-Id: I0f9a710214850326d1cda179c1a2aa6332b98510 Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io> Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
-rw-r--r--src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp50
1 files changed, 42 insertions, 8 deletions
diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp
index 9352e200d1..c8c42b2fa9 100644
--- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp
+++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp
@@ -1022,6 +1022,8 @@ void MaterialEditorView::duplicateMaterial(const ModelNode &material)
TypeName matType = material.type();
QmlObjectNode sourceMat(material);
+ ModelNode duplicateMatNode;
+ QList<AbstractProperty> dynamicProps;
executeInTransaction(__FUNCTION__, [&] {
ModelNode matLib = materialLibraryNode();
@@ -1032,25 +1034,57 @@ void MaterialEditorView::duplicateMaterial(const ModelNode &material)
NodeMetaInfo metaInfo = model()->metaInfo(matType);
QmlObjectNode duplicateMat = createModelNode(matType, metaInfo.majorVersion(), metaInfo.minorVersion());
+ duplicateMatNode = duplicateMat.modelNode();
+
// set name and id
QString newName = sourceMat.modelNode().variantProperty("objectName").value().toString() + " copy";
- duplicateMat.modelNode().variantProperty("objectName").setValue(newName);
- duplicateMat.modelNode().setIdWithoutRefactoring(model()->generateIdFromName(newName, "material"));
+ duplicateMatNode.variantProperty("objectName").setValue(newName);
+ duplicateMatNode.setIdWithoutRefactoring(model()->generateIdFromName(newName, "material"));
- // sync properties
+ // sync properties. Only the base state is duplicated.
const QList<AbstractProperty> props = material.properties();
for (const AbstractProperty &prop : props) {
- if (prop.name() == "objectName")
+ if (prop.name() == "objectName" || prop.name() == "data")
continue;
- if (prop.isVariantProperty())
- duplicateMat.setVariantProperty(prop.name(), prop.toVariantProperty().value());
- else if (prop.isBindingProperty())
- duplicateMat.setBindingProperty(prop.name(), prop.toBindingProperty().expression());
+ if (prop.isVariantProperty()) {
+ if (prop.isDynamic()) {
+ dynamicProps.append(prop);
+ } else {
+ duplicateMatNode.variantProperty(prop.name())
+ .setValue(prop.toVariantProperty().value());
+ }
+ } else if (prop.isBindingProperty()) {
+ if (prop.isDynamic()) {
+ dynamicProps.append(prop);
+ } else {
+ duplicateMatNode.bindingProperty(prop.name())
+ .setExpression(prop.toBindingProperty().expression());
+ }
+ }
}
matLib.defaultNodeListProperty().reparentHere(duplicateMat);
});
+
+ // For some reason, creating dynamic properties in the same transaction doesn't work, so
+ // let's do it in separate transaction.
+ // TODO: Fix the issue and merge transactions (QDS-8094)
+ if (!dynamicProps.isEmpty()) {
+ executeInTransaction(__FUNCTION__, [&] {
+ for (const AbstractProperty &prop : std::as_const(dynamicProps)) {
+ if (prop.isVariantProperty()) {
+ duplicateMatNode.variantProperty(prop.name())
+ .setDynamicTypeNameAndValue(prop.dynamicTypeName(),
+ prop.toVariantProperty().value());
+ } else if (prop.isBindingProperty()) {
+ duplicateMatNode.bindingProperty(prop.name())
+ .setDynamicTypeNameAndExpression(prop.dynamicTypeName(),
+ prop.toBindingProperty().expression());
+ }
+ }
+ });
+ }
}
void MaterialEditorView::customNotification(const AbstractView *view, const QString &identifier,