From 3dc946374b65f0f8b3be2e67f5ce913806d05a7f Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 23 Jun 2020 17:34:04 +0300 Subject: [PATCH] QmlDesigner: Insert dragged material into parent model's materials list When a material is dragged from item library into a Model nodel in navigator, the material is automatically inserted into the model's materials list. Change-Id: I9a9bd10c433a4fead037ddac8238c14cdc91e3c4 Fixes: QDS-1651 Reviewed-by: Mahmoud Badri Reviewed-by: Thomas Hartmann --- .../navigator/navigatortreemodel.cpp | 51 +++++++++++-------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 18f8b0b5f80..cf51c1a0220 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -535,25 +535,11 @@ void NavigatorTreeModel::handleItemLibraryItemDrop(const QMimeData *mimeData, in m_view->executeInTransaction("NavigatorTreeModel::handleItemLibraryItemDrop", [&] { newQmlObjectNode = QmlItemNode::createQmlObjectNode(m_view, itemLibraryEntry, QPointF(), targetProperty, false); ModelNode newModelNode = newQmlObjectNode.modelNode(); - if (newModelNode.isValid() && newModelNode.isSubclassOf("QtQuick3D.Effect")) { - // Insert effects dropped to either View3D or SceneEnvironment into the - // SceneEnvironment's effects list - ModelNode targetEnv; - if (targetProperty.parentModelNode().isSubclassOf("QtQuick3D.SceneEnvironment")) { - targetEnv = targetProperty.parentModelNode(); - } else if (targetProperty.parentModelNode().isSubclassOf("QtQuick3D.View3D")) { - // see if View3D has environment set to it - BindingProperty envNodeProp = targetProperty.parentModelNode().bindingProperty("environment"); - if (envNodeProp.isValid()) { - ModelNode envNode = envNodeProp.resolveToModelNode(); - if (envNode.isValid()) - targetEnv = envNode; - } - } - if (targetEnv.isValid()) { - BindingProperty effectsProp = targetEnv.bindingProperty("effects"); - if (effectsProp.isValid()) { - QString expression = effectsProp.expression(); + auto insertIntoList = [&](const QByteArray &listPropertyName, const ModelNode &targetNode) { + if (targetNode.isValid()) { + BindingProperty listProp = targetNode.bindingProperty(listPropertyName); + if (listProp.isValid()) { + QString expression = listProp.expression(); int bracketIndex = expression.indexOf(']'); if (expression.isEmpty()) expression = newModelNode.validId(); @@ -561,9 +547,34 @@ void NavigatorTreeModel::handleItemLibraryItemDrop(const QMimeData *mimeData, in expression = QStringLiteral("[%1,%2]").arg(expression).arg(newModelNode.validId()); else expression.insert(bracketIndex, QStringLiteral(",%1").arg(newModelNode.validId())); - effectsProp.setExpression(expression); + listProp.setExpression(expression); } } + }; + if (newModelNode.isValid()) { + if (newModelNode.isSubclassOf("QtQuick3D.Effect")) { + // Insert effects dropped to either View3D or SceneEnvironment into the + // SceneEnvironment's effects list + ModelNode targetEnv; + if (targetProperty.parentModelNode().isSubclassOf("QtQuick3D.SceneEnvironment")) { + targetEnv = targetProperty.parentModelNode(); + } else if (targetProperty.parentModelNode().isSubclassOf("QtQuick3D.View3D")) { + // see if View3D has environment set to it + BindingProperty envNodeProp = targetProperty.parentModelNode().bindingProperty("environment"); + if (envNodeProp.isValid()) { + ModelNode envNode = envNodeProp.resolveToModelNode(); + if (envNode.isValid()) + targetEnv = envNode; + } + } + insertIntoList("effects", targetEnv); + } else if (newModelNode.isSubclassOf("QtQuick3D.Material")) { + // Insert material dropped to a model node into the materials list of the model + ModelNode targetModel; + if (targetProperty.parentModelNode().isSubclassOf("QtQuick3D.Model")) + targetModel = targetProperty.parentModelNode(); + insertIntoList("materials", targetModel); + } } });