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 <eike.ziller@qt.io>
This commit is contained in:
David Schulz
2021-11-16 13:57:28 +01:00
parent 4d1e10e7d4
commit 76921ea170

View File

@@ -1397,12 +1397,14 @@ QList<QTextCursor> TextEditorWidgetPrivate::generateCursorsForBlockSelection(
while (block.isValid()) { while (block.isValid()) {
const QString &blockText = block.text(); const QString &blockText = block.text();
cursor.setPosition(block.position() const int columnCount = tabSettings.columnCountForText(blockText);
+ tabSettings.positionAtColumn(blockText, blockSelection.anchorColumn)); if (blockSelection.anchorColumn < columnCount || blockSelection.column < columnCount) {
cursor.setPosition(block.position() const int anchor = tabSettings.positionAtColumn(blockText, blockSelection.anchorColumn);
+ tabSettings.positionAtColumn(blockText, blockSelection.column), const int position = tabSettings.positionAtColumn(blockText, blockSelection.column);
QTextCursor::KeepAnchor); cursor.setPosition(block.position() + anchor);
cursor.setPosition(block.position() + position, QTextCursor::KeepAnchor);
result.append(cursor); result.append(cursor);
}
if (block.blockNumber() == blockSelection.blockNumber) if (block.blockNumber() == blockSelection.blockNumber)
break; break;
block = forward ? block.next() : block.previous(); block = forward ? block.next() : block.previous();
@@ -5234,11 +5236,6 @@ void TextEditorWidget::mouseMoveEvent(QMouseEvent *e)
MultiTextCursor cursor = *startMouseMoveCursor; MultiTextCursor cursor = *startMouseMoveCursor;
const QTextCursor anchorCursor = cursor.takeMainCursor(); const QTextCursor anchorCursor = cursor.takeMainCursor();
const QTextCursor eventCursor = cursorForPosition(e->pos()); 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(); const TabSettings tabSettings = d->m_document->tabSettings();
int eventColumn = tabSettings.columnAt(eventCursor.block().text(), 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()) eventColumn += int((e->pos().x() - cursorRect(eventCursor).center().x())
/ QFontMetricsF(font()).horizontalAdvance(' ')); / QFontMetricsF(font()).horizontalAdvance(' '));
} }
int anchorColumn = tabSettings.columnAt(anchorCursor.block().text(), int anchorColumn = tabSettings.columnAt(anchorCursor.block().text(),
anchorCursor.positionInBlock()); anchorCursor.positionInBlock());
const TextEditorWidgetPrivate::BlockSelection blockSelection = {eventCursor.blockNumber(),
eventColumn,
anchorCursor.blockNumber(),
anchorColumn};
for (; block.isValid() && block != end; block = forward ? block.next() : block.previous()) { cursor.setCursors(d->generateCursorsForBlockSelection(blockSelection));
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();
if (!cursor.isNull()) if (!cursor.isNull())
setMultiTextCursor(cursor); setMultiTextCursor(cursor);
} else { } else {