From 76921ea170bc4eb1db953b8e5ec55c41f60b9775 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 16 Nov 2021 13:57:28 +0100 Subject: [PATCH] Editor: skip short lines in block selection Do not include lines into the block selection that are shorter than the block selection start column. Task-number: QTCREATORBUG-26548 Change-Id: I6e4e26e1c498fb02dd0ebc8b78b8907c23f356b8 Reviewed-by: Eike Ziller --- src/plugins/texteditor/texteditor.cpp | 34 +++++++++++---------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 19c59388620..d558c58c743 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -1397,12 +1397,14 @@ QList TextEditorWidgetPrivate::generateCursorsForBlockSelection( while (block.isValid()) { const QString &blockText = block.text(); - cursor.setPosition(block.position() - + tabSettings.positionAtColumn(blockText, blockSelection.anchorColumn)); - cursor.setPosition(block.position() - + tabSettings.positionAtColumn(blockText, blockSelection.column), - QTextCursor::KeepAnchor); - result.append(cursor); + const int columnCount = tabSettings.columnCountForText(blockText); + if (blockSelection.anchorColumn < columnCount || blockSelection.column < columnCount) { + const int anchor = tabSettings.positionAtColumn(blockText, blockSelection.anchorColumn); + const int position = tabSettings.positionAtColumn(blockText, blockSelection.column); + cursor.setPosition(block.position() + anchor); + cursor.setPosition(block.position() + position, QTextCursor::KeepAnchor); + result.append(cursor); + } if (block.blockNumber() == blockSelection.blockNumber) break; block = forward ? block.next() : block.previous(); @@ -5234,11 +5236,6 @@ void TextEditorWidget::mouseMoveEvent(QMouseEvent *e) MultiTextCursor cursor = *startMouseMoveCursor; const QTextCursor anchorCursor = cursor.takeMainCursor(); const QTextCursor eventCursor = cursorForPosition(e->pos()); - const int eventCursorPos = eventCursor.position(); - const bool forward = anchorCursor.position() < eventCursorPos; - QTextBlock block = anchorCursor.block(); - const QTextBlock end = forward ? eventCursor.block().next() - : eventCursor.block().previous(); const TabSettings tabSettings = d->m_document->tabSettings(); int eventColumn = tabSettings.columnAt(eventCursor.block().text(), @@ -5247,18 +5244,15 @@ void TextEditorWidget::mouseMoveEvent(QMouseEvent *e) eventColumn += int((e->pos().x() - cursorRect(eventCursor).center().x()) / QFontMetricsF(font()).horizontalAdvance(' ')); } + int anchorColumn = tabSettings.columnAt(anchorCursor.block().text(), anchorCursor.positionInBlock()); + const TextEditorWidgetPrivate::BlockSelection blockSelection = {eventCursor.blockNumber(), + eventColumn, + anchorCursor.blockNumber(), + anchorColumn}; - for (; block.isValid() && block != end; block = forward ? block.next() : block.previous()) { - const QString &blockText = block.text(); - QTextCursor c = eventCursor; - c.setPosition(block.position() + tabSettings.positionAtColumn(blockText, anchorColumn)); - c.setPosition(block.position() + tabSettings.positionAtColumn(blockText, eventColumn), - QTextCursor::KeepAnchor); - cursor.addCursor(c); - } - cursor.mergeCursors(); + cursor.setCursors(d->generateCursorsForBlockSelection(blockSelection)); if (!cursor.isNull()) setMultiTextCursor(cursor); } else {