diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index b70b214d190..fcdc305acb4 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -530,6 +530,7 @@ public: void moveLineUpDown(bool up); void copyLineUpDown(bool up); void addSelectionNextFindMatch(); + void addCursorsToLineEnds(); void saveCurrentCursorPositionForNavigation(); void updateHighlights(); void updateCurrentLineInScrollbar(); @@ -6822,6 +6823,42 @@ void TextEditorWidget::copyLine() copy(); } +void TextEditorWidgetPrivate::addCursorsToLineEnds() +{ + MultiTextCursor multiCursor = q->multiTextCursor(); + MultiTextCursor newMultiCursor; + const QList cursors = multiCursor.cursors(); + + if (multiCursor.cursorCount() == 0) + return; + + QTextDocument *document = q->document(); + + for (const QTextCursor &cursor : cursors) { + if (!cursor.hasSelection()) + continue; + + QTextBlock block = document->findBlock(cursor.selectionStart()); + + while (block.isValid()) { + int blockEnd = block.position() + block.length() - 1; + if (blockEnd >= cursor.selectionEnd()) { + break; + } + + QTextCursor newCursor(document); + newCursor.setPosition(blockEnd); + newMultiCursor.addCursor(newCursor); + + block = block.next(); + } + } + + if (!newMultiCursor.isNull()) { + q->setMultiTextCursor(newMultiCursor); + } +} + void TextEditorWidgetPrivate::addSelectionNextFindMatch() { MultiTextCursor cursor = q->multiTextCursor(); @@ -6902,6 +6939,11 @@ void TextEditorWidget::duplicateSelection() d->duplicateSelection(false); } +void TextEditorWidget::addCursorsToLineEnds() +{ + d->addCursorsToLineEnds(); +} + void TextEditorWidget::addSelectionNextFindMatch() { d->addSelectionNextFindMatch(); diff --git a/src/plugins/texteditor/texteditor.h b/src/plugins/texteditor/texteditor.h index f1f3deb3b17..30858d84d29 100644 --- a/src/plugins/texteditor/texteditor.h +++ b/src/plugins/texteditor/texteditor.h @@ -384,6 +384,7 @@ public: void selectLineEnding(int index); void updateTextLineEndingLabel(); void addSelectionNextFindMatch(); + void addCursorsToLineEnds(); void gotoBlockStart(); void gotoBlockEnd(); diff --git a/src/plugins/texteditor/texteditoractionhandler.cpp b/src/plugins/texteditor/texteditoractionhandler.cpp index d0b0172629e..d474f99c174 100644 --- a/src/plugins/texteditor/texteditoractionhandler.cpp +++ b/src/plugins/texteditor/texteditoractionhandler.cpp @@ -329,6 +329,10 @@ void TextEditorActionHandlerPrivate::createActions() [] (TextEditorWidget *w) { w->copyLine(); }, false, tr("Copy &Line"), QKeySequence(tr("Ctrl+Ins")), G_EDIT_TEXT, advancedEditMenu); + registerAction(ADD_CURSORS_TO_LINE_ENDS, + [] (TextEditorWidget *w) { w->addCursorsToLineEnds(); }, false, tr("Create Cursors at Selected Line Ends"), + QKeySequence(tr("Alt+Shift+I")), + G_EDIT_TEXT, advancedEditMenu); registerAction(ADD_SELECT_NEXT_FIND_MATCH, [] (TextEditorWidget *w) { w->addSelectionNextFindMatch(); }, false, tr("Add Next Occurrence to Selection"), QKeySequence(tr("Ctrl+D")), diff --git a/src/plugins/texteditor/texteditorconstants.h b/src/plugins/texteditor/texteditorconstants.h index 68667f40adc..5a1d7c35fd3 100644 --- a/src/plugins/texteditor/texteditorconstants.h +++ b/src/plugins/texteditor/texteditorconstants.h @@ -181,6 +181,7 @@ const char SORT_SELECTED_LINES[] = "TextEditor.SortSelectedLines"; const char CUT_LINE[] = "TextEditor.CutLine"; const char COPY_LINE[] = "TextEditor.CopyLine"; const char ADD_SELECT_NEXT_FIND_MATCH[] = "TextEditor.AddSelectionNextFindMatch"; +const char ADD_CURSORS_TO_LINE_ENDS[] = "TextEditor.AddCursorsAtLineEnd"; const char DUPLICATE_SELECTION[] = "TextEditor.DuplicateSelection"; const char DUPLICATE_SELECTION_AND_COMMENT[] = "TextEditor.DuplicateSelectionAndComment"; const char DELETE_LINE[] = "TextEditor.DeleteLine";