From 548cd083b4aadc457547d8d840cf61e011d85045 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 27 Jun 2024 16:49:14 +0200 Subject: [PATCH] QmlDesigner: Fix selection from code editor Calculate the correct node length if nodes are enclosed. We cannot just look for the next closing brace, we have to ignore opened and closed braces. Task-number: QDS-12543 Change-Id: Ieee232777637f4bc022e65af5d8cb437e025a146 Reviewed-by: Marco Bubke --- .../designercore/model/rewriterview.cpp | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 8f7e64f470f..21d032acdb8 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -844,6 +844,26 @@ static bool isInNodeDefinition(int nodeTextOffset, int nodeTextLength, int curso return (nodeTextOffset <= cursorPosition) && (nodeTextOffset + nodeTextLength > cursorPosition); } +int findEvenClosingBrace(const QStringView &string) +{ + int count = 0; + int index = 0; + + for (auto currentChar : string) { + if (currentChar == '{') + count++; + + if (currentChar == '}') { + if (count == 1) + return index; + else + count--; + } + index++; + } + return index; +} + ModelNode RewriterView::nodeAtTextCursorPositionHelper(const ModelNode &root, int cursorPosition) const { QTC_ASSERT(m_textModifier, return {}); @@ -865,8 +885,9 @@ ModelNode RewriterView::nodeAtTextCursorPositionHelper(const ModelNode &root, in ModelNode node = pair.first; const int nodeTextOffset = nodeOffset(node); - const int nodeTextLength = m_textModifier->text().indexOf("}", nodeTextOffset) - - nodeTextOffset - 1; + + const int nodeTextLength = findEvenClosingBrace(m_textModifier->text().sliced(nodeTextOffset)) + - 1; if (isInNodeDefinition(nodeTextOffset, nodeTextLength, cursorPosition)) lastNode = node;