diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp index b1c92b9ba88..cc5a4c5d285 100644 --- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp @@ -281,11 +281,10 @@ FormEditorItem *AbstractFormEditorTool::containerFormEditorItem(const QListisContainer()) - return formEditorItem; - + && !selectedItemList.contains(formEditorItem) + && isNotAncestorOfItemInList(formEditorItem, selectedItemList) + && formEditorItem->isContainer()) + return formEditorItem; } return 0; diff --git a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp index 02adaa660b5..632e7ae3553 100644 --- a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp @@ -170,22 +170,14 @@ static inline bool isAncestorOf(FormEditorItem *formEditorItem, FormEditorItem * return false; } -FormEditorItem* DragTool::calculateTargetContainer(const QList &itemList, FormEditorItem * currentItem) +FormEditorItem* DragTool::targetContainerOrRootItem(const QList &itemList, FormEditorItem * currentItem) { - foreach (QGraphicsItem *item, itemList) { - FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item); - if (formEditorItem - && formEditorItem != currentItem - && formEditorItem->isContainer() - && !formEditorItem->qmlItemNode().modelNode().metaInfo().isLayoutable() - && !isAncestorOf(currentItem, formEditorItem)) - return formEditorItem; - } + FormEditorItem *formEditorItem = containerFormEditorItem(itemList, QList() << currentItem); - if (scene()->rootFormEditorItem()) - return scene()->rootFormEditorItem(); + if (!formEditorItem) + formEditorItem = scene()->rootFormEditorItem(); - return 0; + return formEditorItem; } void DragTool::formEditorItemsChanged(const QList & itemList) @@ -323,7 +315,7 @@ static QString libraryResourceImageName(const QMimeData *mimeData) void DragTool::createDragNode(const QMimeData *mimeData, const QPointF &scenePosition, const QList &itemList) { if (!m_dragNode.hasModelNode()) { - FormEditorItem *targetContainerFormEditorItem = calculateTargetContainer(itemList); + FormEditorItem *targetContainerFormEditorItem = targetContainerOrRootItem(itemList); if (targetContainerFormEditorItem) { QmlItemNode targetContainerQmlItemNode; if (targetContainerFormEditorItem) @@ -348,7 +340,7 @@ void DragTool::dragMoveEvent(const QList &itemList, QGraphicsSce if (canHandleMimeData(event->mimeData())) { event->accept(); if (m_dragNode.isValid()) { - FormEditorItem *targetContainerItem = calculateTargetContainer(itemList); + FormEditorItem *targetContainerItem = targetContainerOrRootItem(itemList); if (targetContainerItem) { move(event->scenePos(), itemList); } else { @@ -380,7 +372,7 @@ void DragTool::end(Snapper::Snapping useSnapping) void DragTool::move(const QPointF &scenePos, const QList &itemList) { if (m_movingItem) { - FormEditorItem *containerItem = calculateTargetContainer(itemList, m_movingItem.data()); + FormEditorItem *containerItem = targetContainerOrRootItem(itemList, m_movingItem.data()); if (containerItem && m_movingItem->parentItem() && containerItem != m_movingItem->parentItem()) { diff --git a/src/plugins/qmldesigner/components/formeditor/dragtool.h b/src/plugins/qmldesigner/components/formeditor/dragtool.h index 7222be8d7c9..eeadda6a911 100644 --- a/src/plugins/qmldesigner/components/formeditor/dragtool.h +++ b/src/plugins/qmldesigner/components/formeditor/dragtool.h @@ -103,7 +103,7 @@ protected: void abort(); void createQmlItemNode(const ItemLibraryEntry &itemLibraryEntry, const QmlItemNode &parentNode, const QPointF &scenePos); void createQmlItemNodeFromImage(const QString &imageName, const QmlItemNode &parentNode, const QPointF &scenePos); - FormEditorItem *calculateTargetContainer(const QList &itemList, FormEditorItem *urrentItem = 0); + FormEditorItem *targetContainerOrRootItem(const QList &itemList, FormEditorItem *urrentItem = 0); void begin(QPointF scenePos); void end(); void end(Snapper::Snapping useSnapping); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp b/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp index 07bd634dbfc..614987a2f58 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp @@ -426,7 +426,7 @@ bool FormEditorItem::isContainer() const NodeMetaInfo nodeMetaInfo = qmlItemNode().modelNode().metaInfo(); if (nodeMetaInfo.isValid()) - return !nodeMetaInfo.defaultPropertyIsComponent(); + return !nodeMetaInfo.defaultPropertyIsComponent() && !nodeMetaInfo.isLayoutable(); return true; }