diff --git a/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp b/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp index bedfac68d9adf27634a4bbf14f88e13fdc1e3865..fd3d824a1533c904f6affbc408397700cbcb1642 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp @@ -65,7 +65,8 @@ FormEditorItem::FormEditorItem(const QmlItemNode &qmlItemNode, FormEditorScene* m_qmlItemNode(qmlItemNode), m_borderWidth(1.0), m_highlightBoundingRect(false), - m_isContentVisible(true) + m_isContentVisible(true), + m_isFormEditorVisible(true) { setCacheMode(QGraphicsItem::DeviceCoordinateCache); setup(); @@ -195,6 +196,17 @@ bool FormEditorItem::isContentVisible() const return m_isContentVisible; } + +bool FormEditorItem::isFormEditorVisible() const +{ + return m_isFormEditorVisible; +} +void FormEditorItem::setFormEditorVisible(bool isVisible) +{ + m_isFormEditorVisible = isVisible; + setVisible(isVisible); +} + FormEditorItem::~FormEditorItem() { scene()->removeItemFromHash(this); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditoritem.h b/src/plugins/qmldesigner/components/formeditor/formeditoritem.h index 0232dd18a98862e849e65549e5c198630e068538..b3874cabf136e99e248833dd433eed5398bc7ac2 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditoritem.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditoritem.h @@ -106,6 +106,9 @@ public: void setContentVisible(bool visible); bool isContentVisible() const; + bool isFormEditorVisible() const; + void setFormEditorVisible(bool isVisible); + protected: AbstractFormEditorTool* tool() const; void paintBoundingRect(QPainter *painter) const; @@ -129,6 +132,7 @@ private: // variables double m_borderWidth; bool m_highlightBoundingRect; bool m_isContentVisible; + bool m_isFormEditorVisible; }; diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index a2ed9a85548df68686f54b923db75bf61fa38d11..e0ed591c4be0aea1e49b5b4959df55bb05d24862 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -131,6 +131,41 @@ void FormEditorView::setupFormEditorItemTree(const QmlItemNode &qmlItemNode) setupFormEditorItemTree(nextNode.toQmlItemNode()); } +void FormEditorView::removeNodeFromScene(const QmlItemNode &qmlItemNode) +{ + if (qmlItemNode.isValid()) { + + FormEditorItem *item = m_scene->itemForQmlItemNode(qmlItemNode); + + QList<QmlItemNode> nodeList; + nodeList.append(qmlItemNode.allSubModelNodes()); + nodeList.append(qmlItemNode); + + QList<FormEditorItem*> removedItemList; + removedItemList.append(scene()->itemsForQmlItemNodes(nodeList)); + m_currentTool->itemsAboutToRemoved(removedItemList); + + qDeleteAll(removedItemList); + } +} + +void FormEditorView::hideNodeFromScene(const QmlItemNode &qmlItemNode) +{ + if (qmlItemNode.isValid()) { + + FormEditorItem *item = m_scene->itemForQmlItemNode(qmlItemNode); + + QList<QmlItemNode> nodeList; + nodeList.append(qmlItemNode.allSubModelNodes()); + nodeList.append(qmlItemNode); + + QList<FormEditorItem*> removedItemList; + removedItemList.append(scene()->itemsForQmlItemNodes(nodeList)); + m_currentTool->itemsAboutToRemoved(removedItemList); + item->setFormEditorVisible(false); + } +} + void FormEditorView::nodeCreated(const ModelNode &createdNode) { QmlModelView::nodeCreated(createdNode); @@ -164,20 +199,7 @@ void FormEditorView::nodeAboutToBeRemoved(const ModelNode &removedNode) { QmlItemNode qmlItemNode(removedNode); - if (qmlItemNode.isValid()) { - - FormEditorItem *item = m_scene->itemForQmlItemNode(qmlItemNode); - - QList<QmlItemNode> nodeList; - nodeList.append(qmlItemNode.allSubModelNodes()); - nodeList.append(qmlItemNode); - - QList<FormEditorItem*> removedItemList; - removedItemList.append(scene()->itemsForQmlItemNodes(nodeList)); - m_currentTool->itemsAboutToRemoved(removedItemList); - - delete item; - } + removeNodeFromScene(qmlItemNode); QmlModelView::nodeAboutToBeRemoved(removedNode); } @@ -227,8 +249,23 @@ void FormEditorView::propertiesAboutToBeRemoved(const QList<AbstractProperty>& p QmlModelView::propertiesAboutToBeRemoved(propertyList); } + +static inline bool hasNodeSourceParent(const ModelNode &node) +{ + if (node.parentProperty().isValid() && node.parentProperty().parentModelNode().isValid()) { + ModelNode parent = node.parentProperty().parentModelNode(); + if (parent.nodeSourceType() != ModelNode::NodeWithoutSource) + return true; + return hasNodeSourceParent(parent); + } + return false; +} + void FormEditorView::nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags propertyChange) { + if (hasNodeSourceParent(node)) + hideNodeFromScene(node); + QmlModelView::nodeReparented(node, newPropertyParent, oldPropertyParent, propertyChange); } @@ -435,7 +472,8 @@ void FormEditorView::auxiliaryDataChanged(const ModelNode &node, const QString & if (name == "invisible" && m_scene->hasItemForQmlItemNode(QmlItemNode(node))) { FormEditorItem *item(m_scene->itemForQmlItemNode(QmlItemNode(node))); bool isInvisible = data.toBool(); - item->setVisible(!isInvisible); + if (item->isFormEditorVisible()) + item->setVisible(!isInvisible); ModelNode newNode(node); if (isInvisible) newNode.deselectNode(); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.h b/src/plugins/qmldesigner/components/formeditor/formeditorview.h index b723c4bcef324fd76ff13e8572a490306bde37d2..7b6bebdc64939233472f1873de0462209631754b 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.h @@ -137,7 +137,8 @@ protected slots: private: //functions void setupFormEditorItemTree(const QmlItemNode &qmlItemNode); - + void removeNodeFromScene(const QmlItemNode &qmlItemNode); + void hideNodeFromScene(const QmlItemNode &qmlItemNode); private: //variables QWeakPointer<FormEditorWidget> m_formEditorWidget;