aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp')
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp54
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;