diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2021-10-22 13:39:06 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2021-10-26 11:42:51 +0000 |
commit | 6ef7010a95d9914325497c38abd1a58bc4541c28 (patch) | |
tree | 010ed1f4115b8ee827a10d060168fd2104ede92d | |
parent | 01164e737dbb1b45becda997280f318bbd5e6160 (diff) |
QmlDesigner: Handle implicit components properly in componentview
Made component view react to node source changes in order to properly
show implicit components in the edit subcomponents dropdown.
Fixes: QDS-5237
Change-Id: Ibe39e6f5c30f19e4067f8cbc95f240d82165e982
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
-rw-r--r-- | src/plugins/qmldesigner/components/integration/componentview.cpp | 94 | ||||
-rw-r--r-- | src/plugins/qmldesigner/components/integration/componentview.h | 11 |
2 files changed, 61 insertions, 44 deletions
diff --git a/src/plugins/qmldesigner/components/integration/componentview.cpp b/src/plugins/qmldesigner/components/integration/componentview.cpp index 06aa47c7a5..a30423b4c0 100644 --- a/src/plugins/qmldesigner/components/integration/componentview.cpp +++ b/src/plugins/qmldesigner/components/integration/componentview.cpp @@ -46,8 +46,7 @@ ComponentView::ComponentView(QObject *parent) void ComponentView::nodeAboutToBeRemoved(const ModelNode &removedNode) { - removeSingleNodeFromList(removedNode); - searchForComponentAndRemoveFromList(removedNode); + removeFromListRecursive(removedNode); } QStandardItemModel *ComponentView::standardItemModel() const @@ -75,7 +74,7 @@ void ComponentView::setComponentToMaster() m_componentAction->setCurrentIndex(indexOfMaster()); } -void ComponentView::removeSingleNodeFromList(const ModelNode &node) +void ComponentView::removeNodeFromList(const ModelNode &node) { for (int row = 0; row < m_standardItemModel->rowCount(); row++) { if (m_standardItemModel->item(row)->data(ModelNodeRole).toInt() == node.internalId()) @@ -83,6 +82,18 @@ void ComponentView::removeSingleNodeFromList(const ModelNode &node) } } +void ComponentView::addNodeToList(const ModelNode &node) +{ + if (hasEntryForNode(node)) + return; + + QString description = descriptionForNode(node); + auto item = new QStandardItem(description); + item->setData(QVariant::fromValue(node.internalId()), ModelNodeRole); + item->setEditable(false); + m_standardItemModel->appendRow(item); +} + int ComponentView::indexForNode(const ModelNode &node) const { for (int row = 0; row < m_standardItemModel->rowCount(); row++) { @@ -112,7 +123,7 @@ bool ComponentView::hasEntryForNode(const ModelNode &node) const return indexForNode(node) >= 0; } -void ComponentView::addMasterDocument() +void ComponentView::ensureMasterDocument() { if (!hasMasterEntry()) { QStandardItem *item = new QStandardItem(QLatin1String("master")); @@ -122,9 +133,11 @@ void ComponentView::addMasterDocument() } } -void ComponentView::removeMasterDocument() +void ComponentView::maybeRemoveMasterDocument() { - m_standardItemModel->removeRow(indexOfMaster()); + int idx = indexOfMaster(); + if (idx >= 0 && m_standardItemModel->rowCount() == 1) + m_standardItemModel->removeRow(idx); } QString ComponentView::descriptionForNode(const ModelNode &node) const @@ -155,6 +168,15 @@ void ComponentView::updateDescription(const ModelNode &node) m_standardItemModel->item(nodeIndex)->setText(descriptionForNode(node)); } +bool ComponentView::isSubComponentNode(const ModelNode &node) const +{ + return node.nodeSourceType() == ModelNode::NodeWithComponentSource + || (node.hasParentProperty() + && !node.parentProperty().isDefaultProperty() + && node.metaInfo().isValid() + && node.metaInfo().isGraphicalItem()); +} + void ComponentView::modelAttached(Model *model) { if (AbstractView::model() == model) @@ -187,46 +209,25 @@ void ComponentView::nodeCreated(const ModelNode &createdNode) void ComponentView::searchForComponentAndAddToList(const ModelNode &node) { - bool masterNotAdded = true; - - foreach (const ModelNode &node, node.allSubModelNodesAndThisNode()) { - if (node.nodeSourceType() == ModelNode::NodeWithComponentSource - || (node.hasParentProperty() - && !node.parentProperty().isDefaultProperty() - && node.metaInfo().isValid() - && node.metaInfo().isGraphicalItem())) { - if (masterNotAdded) { - masterNotAdded = true; - addMasterDocument(); - } - - if (!hasEntryForNode(node)) { - QString description = descriptionForNode(node); - - auto item = new QStandardItem(description); - item->setData(QVariant::fromValue(node.internalId()), ModelNodeRole); - item->setEditable(false); - removeSingleNodeFromList(node); //remove node if already present - m_standardItemModel->appendRow(item); + const auto nodeList = node.allSubModelNodesAndThisNode(); + bool hasMaster = false; + for (const ModelNode &childNode : nodeList) { + if (isSubComponentNode(childNode)) { + if (!hasMaster) { + hasMaster = true; + ensureMasterDocument(); } + addNodeToList(childNode); } } } -void ComponentView::searchForComponentAndRemoveFromList(const ModelNode &node) +void ComponentView::removeFromListRecursive(const ModelNode &node) { - QList<ModelNode> nodeList; - nodeList.append(node); - nodeList.append(node.allSubModelNodes()); - - - foreach (const ModelNode &childNode, nodeList) { - if (childNode.nodeSourceType() == ModelNode::NodeWithComponentSource) - removeSingleNodeFromList(childNode); - } - - if (m_standardItemModel->rowCount() == 1) - removeMasterDocument(); + const auto nodeList = node.allSubModelNodesAndThisNode(); + for (const ModelNode &childNode : std::as_const(nodeList)) + removeNodeFromList(childNode); + maybeRemoveMasterDocument(); } void ComponentView::nodeReparented(const ModelNode &node, const NodeAbstractProperty &/*newPropertyParent*/, const NodeAbstractProperty &/*oldPropertyParent*/, AbstractView::PropertyChangeFlags /*propertyChange*/) @@ -240,4 +241,17 @@ void ComponentView::nodeIdChanged(const ModelNode& node, const QString& /*newId* { updateDescription(node); } + +void ComponentView::nodeSourceChanged(const ModelNode &node, const QString &/*newNodeSource*/) +{ + if (isSubComponentNode(node)) { + if (!hasEntryForNode(node)) { + ensureMasterDocument(); + addNodeToList(node); + } + } else { + removeNodeFromList(node); + maybeRemoveMasterDocument(); + } +} } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/integration/componentview.h b/src/plugins/qmldesigner/components/integration/componentview.h index d9b92085c4..28060a5188 100644 --- a/src/plugins/qmldesigner/components/integration/componentview.h +++ b/src/plugins/qmldesigner/components/integration/componentview.h @@ -62,6 +62,7 @@ public: const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags propertyChange) override; void nodeIdChanged(const ModelNode& node, const QString& newId, const QString& oldId) override; + void nodeSourceChanged(const ModelNode &node, const QString &newNodeSource) override; QStandardItemModel *standardItemModel() const; @@ -76,16 +77,18 @@ signals: private: //functions void updateModel(); void searchForComponentAndAddToList(const ModelNode &node); - void searchForComponentAndRemoveFromList(const ModelNode &node); - void removeSingleNodeFromList(const ModelNode &node); + void removeFromListRecursive(const ModelNode &node); + void removeNodeFromList(const ModelNode &node); + void addNodeToList(const ModelNode &node); int indexForNode(const ModelNode &node) const; int indexOfMaster() const; bool hasMasterEntry() const; bool hasEntryForNode(const ModelNode &node) const; - void addMasterDocument(); - void removeMasterDocument(); + void ensureMasterDocument(); + void maybeRemoveMasterDocument(); QString descriptionForNode(const ModelNode &node) const; void updateDescription(const ModelNode &node); + bool isSubComponentNode(const ModelNode &node) const; private: QStandardItemModel *m_standardItemModel; |