From d07de2266043ae55b508b7c2ee75cd0dfe7711df Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 22 Jan 2025 16:34:57 +0100 Subject: [PATCH] Subject: QmlDesigner: prefer visible items when selecting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ensure nearestFormEditorItem() returns a visible FormEditorItem before considering selection weight. Items without visual content (e.g. MouseArea) remain treated as visible. other refactorings: - Remove redundant qmlItemNode.isValid() guard – helpers validate internally or its not necessary - Early-continue when FormEditorItem is nullptr for clarity. - Compare a single isVisible flag instead of nested if chains. Task-number: QDS-14210 Change-Id: I772586c24b6cd61ef00add6633815b5d9b43b666 Reviewed-by: Marco Bubke --- .../formeditor/abstractformeditortool.cpp | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp index 2f44c20a2ae..c4c900072cb 100644 --- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp @@ -204,30 +204,40 @@ FormEditorItem *AbstractFormEditorTool::topMovableFormEditorItem(const QList &itemList) +FormEditorItem *AbstractFormEditorTool::nearestFormEditorItem(const QPointF &point, + const QList &itemList) { NanotraceHR::Tracer tracer{"abstract form editor tool nearest form editor item", category()}; FormEditorItem *nearestItem = nullptr; + for (QGraphicsItem *item : itemList) { - FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item); - - if (formEditorItem && formEditorItem->flowHitTest(point)) - return formEditorItem; - - if (!formEditorItem || !formEditorItem->qmlItemNode().isValid()) + auto formEditorItem = FormEditorItem::fromQGraphicsItem(item); + if (!formEditorItem) continue; + if (formEditorItem->flowHitTest(point)) + return formEditorItem; + if (formEditorItem->parentItem() && !formEditorItem->parentItem()->isContentVisible()) continue; - if (formEditorItem && ModelUtils::isThisOrAncestorLocked(formEditorItem->qmlItemNode().modelNode())) + auto qmlItemNode = formEditorItem->qmlItemNode(); + if (ModelUtils::isThisOrAncestorLocked(qmlItemNode.modelNode())) continue; - if (!nearestItem) + if (!nearestItem) { nearestItem = formEditorItem; - else if (formEditorItem->selectionWeigth(point, 1) < nearestItem->selectionWeigth(point, 0)) + continue; + } + + bool isVisible = qmlItemNode.instanceIsVisible(); + if (isVisible != nearestItem->qmlItemNode().instanceIsVisible()) { + if (isVisible) + nearestItem = formEditorItem; + } else if (formEditorItem->selectionWeigth(point, 1) < nearestItem->selectionWeigth(point, 0)) { nearestItem = formEditorItem; + } } if (nearestItem && nearestItem->qmlItemNode().isInStackedContainer())