diff options
Diffstat (limited to 'src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp')
-rw-r--r-- | src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp | 54 |
1 files changed, 52 insertions, 2 deletions
diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index c91ff78626..cf51c1a022 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -531,7 +531,52 @@ void NavigatorTreeModel::handleItemLibraryItemDrop(const QMimeData *mimeData, in if (!NodeHints::fromItemLibraryEntry(itemLibraryEntry).canBeDroppedInNavigator()) return; - const QmlObjectNode newQmlObjectNode = QmlItemNode::createQmlObjectNode(m_view, itemLibraryEntry, QPointF(), targetProperty); + QmlObjectNode newQmlObjectNode; + m_view->executeInTransaction("NavigatorTreeModel::handleItemLibraryItemDrop", [&] { + newQmlObjectNode = QmlItemNode::createQmlObjectNode(m_view, itemLibraryEntry, QPointF(), targetProperty, false); + ModelNode newModelNode = newQmlObjectNode.modelNode(); + 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(); + else if (bracketIndex == -1) + expression = QStringLiteral("[%1,%2]").arg(expression).arg(newModelNode.validId()); + else + expression.insert(bracketIndex, QStringLiteral(",%1").arg(newModelNode.validId())); + 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); + } + } + }); if (newQmlObjectNode.isValid() && targetProperty.isNodeListProperty()) { QList<ModelNode> newModelNodeList; @@ -602,7 +647,7 @@ void NavigatorTreeModel::moveNodesInteractive(NodeAbstractProperty &parentProper { QTC_ASSERT(m_view, return); - m_view->executeInTransaction("NavigatorTreeModel::moveNodesInteractive",[this, &parentProperty, modelNodes, targetIndex](){ + m_view->executeInTransaction("NavigatorTreeModel::moveNodesInteractive",[&parentProperty, modelNodes, targetIndex](){ const TypeName propertyQmlType = parentProperty.parentModelNode().metaInfo().propertyTypeName(parentProperty.name()); foreach (const ModelNode &modelNode, modelNodes) { if (modelNode.isValid() @@ -695,6 +740,11 @@ void NavigatorTreeModel::notifyModelNodesMoved(const QList<ModelNode> &modelNode emit layoutChanged(indexes); } +void NavigatorTreeModel::notifyIconsChanged() +{ + emit dataChanged(index(0, 0), index(rowCount(), 0), {Qt::DecorationRole}); +} + void NavigatorTreeModel::setFilter(bool showOnlyVisibleItems) { m_showOnlyVisibleItems = showOnlyVisibleItems; |