aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2021-10-07 15:05:10 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2021-10-11 08:44:05 +0000
commit3395cdfd2668a4a3b9551bc16807c17e9caf1388 (patch)
tree344ab2d23f7ac19e5303fa6d1c2637dd45348eb2
parent7a76f7edbfd0dde1184e8d57e1593f08b9735660 (diff)
QmlDesigner: Make form view react to node source changes properly
Implicit components lose/gain node source when reparented, so we need to also potentially remove form editor items based on the node source state of the node itself in addition to the state of the parent. Node source can also change without reparenting, and it's not guaranteed the node source is up to date when nodeReparented is called, so to make sure we always end up in correct state in form editor, we do the same checks in nodeSourceChanged as we do in nodeReparented. Fixes: QDS-5230 Change-Id: Ib358ccb0db4c26e4857bad00e35930287c4149fb Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
-rw-r--r--src/plugins/qmldesigner/components/formeditor/formeditorview.cpp56
-rw-r--r--src/plugins/qmldesigner/components/formeditor/formeditorview.h2
2 files changed, 39 insertions, 19 deletions
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
index 10e1373dde..53c26261a0 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
@@ -339,26 +339,12 @@ static inline bool hasNodeSourceParent(const ModelNode &node)
void FormEditorView::nodeReparented(const ModelNode &node, const NodeAbstractProperty &/*newPropertyParent*/, const NodeAbstractProperty &/*oldPropertyParent*/, AbstractView::PropertyChangeFlags /*propertyChange*/)
{
- // If node is not connected to scene root, don't do anything yet to avoid duplicated effort,
- // as any removal or addition will remove or add descendants as well.
- if (!node.isInHierarchy())
- return;
+ addOrRemoveFormEditorItem(node);
+}
- QmlItemNode itemNode(node);
- if (hasNodeSourceParent(node)) {
- if (FormEditorItem *item = m_scene->itemForQmlItemNode(itemNode)) {
- QList<FormEditorItem *> removed = scene()->itemsForQmlItemNodes(itemNode.allSubModelNodes());
- removed.append(item);
- m_currentTool->itemsAboutToRemoved(removed);
- removeNodeFromScene(itemNode);
- }
- } else if (itemNode.isValid() && node.nodeSourceType() == ModelNode::NodeWithoutSource) {
- if (!m_scene->itemForQmlItemNode(itemNode)) {
- setupFormEditorItemTree(itemNode);
- // Simulate selection change to refresh tools
- selectedNodesChanged(selectedModelNodes(), {});
- }
- }
+void FormEditorView::nodeSourceChanged(const ModelNode &node, const QString &newNodeSource)
+{
+ addOrRemoveFormEditorItem(node);
}
WidgetInfo FormEditorView::widgetInfo()
@@ -863,6 +849,38 @@ void FormEditorView::resetNodeInstanceView()
resetPuppet();
}
+void FormEditorView::addOrRemoveFormEditorItem(const ModelNode &node)
+{
+ // If node is not connected to scene root, don't do anything yet to avoid duplicated effort,
+ // as any removal or addition will remove or add descendants as well.
+ if (!node.isInHierarchy())
+ return;
+
+ QmlItemNode itemNode(node);
+
+ auto removeItemFromScene = [this, &itemNode]() {
+ if (FormEditorItem *item = m_scene->itemForQmlItemNode(itemNode)) {
+ QList<FormEditorItem *> removed = scene()->itemsForQmlItemNodes(itemNode.allSubModelNodes());
+ removed.append(item);
+ m_currentTool->itemsAboutToRemoved(removed);
+ removeNodeFromScene(itemNode);
+ }
+ };
+ if (hasNodeSourceParent(node)) {
+ removeItemFromScene();
+ } else if (itemNode.isValid()) {
+ if (node.nodeSourceType() == ModelNode::NodeWithoutSource) {
+ if (!m_scene->itemForQmlItemNode(itemNode)) {
+ setupFormEditorItemTree(itemNode);
+ // Simulate selection change to refresh tools
+ selectedNodesChanged(selectedModelNodes(), {});
+ }
+ } else {
+ removeItemFromScene();
+ }
+ }
+}
+
void FormEditorView::reset()
{
QTimer::singleShot(200, this, &FormEditorView::delayedReset);
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.h b/src/plugins/qmldesigner/components/formeditor/formeditorview.h
index 04b7d1e83e..ca3fb72bb0 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorview.h
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.h
@@ -70,6 +70,7 @@ public:
void nodeCreated(const ModelNode &createdNode) override;
void nodeAboutToBeRemoved(const ModelNode &removedNode) override;
void nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags propertyChange) override;
+ void nodeSourceChanged(const ModelNode &node, const QString &newNodeSource) override;
void nodeIdChanged(const ModelNode& node, const QString& newId, const QString& oldId) override;
void propertiesAboutToBeRemoved(const QList<AbstractProperty>& propertyList) override;
void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) override;
@@ -147,6 +148,7 @@ private:
void createFormEditorWidget();
void temporaryBlockView(int duration = 1000);
void resetNodeInstanceView();
+ void addOrRemoveFormEditorItem(const ModelNode &node);
QPointer<FormEditorWidget> m_formEditorWidget;
QPointer<FormEditorScene> m_scene;