aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2021-10-22 13:39:06 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2021-10-26 11:42:51 +0000
commit6ef7010a95d9914325497c38abd1a58bc4541c28 (patch)
tree010ed1f4115b8ee827a10d060168fd2104ede92d
parent01164e737dbb1b45becda997280f318bbd5e6160 (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.cpp94
-rw-r--r--src/plugins/qmldesigner/components/integration/componentview.h11
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;