diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index c7e20fea06e..5d5bc8bb282 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -176,6 +176,8 @@ protected: // functions void notifyErrorsAndWarnings(const QList &errors); private: //variables + ModelNode nodeAtTextCursorPositionRekursive(const ModelNode &root, int cursorPosition) const; + TextModifier *m_textModifier = nullptr; int transactionLevel = 0; bool m_modificationGroupActive = false; diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 3bf0bfd4357..08a7d3629fe 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -556,24 +556,28 @@ static bool isInNodeDefinition(int nodeTextOffset, int nodeTextLength, int curso return (nodeTextOffset <= cursorPosition) && (nodeTextOffset + nodeTextLength > cursorPosition); } -ModelNode RewriterView::nodeAtTextCursorPosition(int cursorPosition) const +ModelNode RewriterView::nodeAtTextCursorPositionRekursive(const ModelNode &root, int cursorPosition) const { - const QList allNodes = allModelNodes(); - - ModelNode nearestNode; - int nearestNodeTextOffset = -1; - - foreach (const ModelNode ¤tNode, allNodes) { - const int nodeTextOffset = nodeOffset(currentNode); - const int nodeTextLength = nodeLength(currentNode); - if (isInNodeDefinition(nodeTextOffset, nodeTextLength, cursorPosition) - && (nodeTextOffset > nearestNodeTextOffset)) { - nearestNode = currentNode; - nearestNodeTextOffset = nodeTextOffset; - } + ModelNode node = root; + foreach (const ModelNode ¤tNode, node.directSubModelNodes()) { + const int offset = nodeOffset(currentNode); + if (offset < cursorPosition) + node = nodeAtTextCursorPositionRekursive(currentNode, cursorPosition); + else + break; } - return nearestNode; + const int nodeTextLength = nodeLength(node); + const int nodeTextOffset = nodeOffset(node); + if (isInNodeDefinition(nodeTextOffset, nodeTextLength, cursorPosition)) + return node; + + return root; +} + +ModelNode RewriterView::nodeAtTextCursorPosition(int cursorPosition) const +{ + return nodeAtTextCursorPositionRekursive(rootModelNode(), cursorPosition); } bool RewriterView::renameId(const QString& oldId, const QString& newId)