From ae839652ffd19b383d8a404235bfbcd438193427 Mon Sep 17 00:00:00 2001 From: Liu Zhangjian Date: Mon, 4 Nov 2024 14:16:01 +0800 Subject: [PATCH] fix: [editor] The cursor is abnormal after completion as title Log: fix issue --- .../codeeditor/gui/completion/codecompletionwidget.cpp | 5 +++-- src/plugins/codeeditor/gui/tabwidget.cpp | 2 +- src/plugins/codeeditor/gui/texteditor.cpp | 8 +++++--- src/plugins/codeeditor/gui/texteditor.h | 4 ++-- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/plugins/codeeditor/gui/completion/codecompletionwidget.cpp b/src/plugins/codeeditor/gui/completion/codecompletionwidget.cpp index 2997039b6..09f177798 100644 --- a/src/plugins/codeeditor/gui/completion/codecompletionwidget.cpp +++ b/src/plugins/codeeditor/gui/completion/codecompletionwidget.cpp @@ -206,7 +206,7 @@ void CodeCompletionWidget::executeWithTextEdit(lsp::CompletionItem *item) textToBeInserted += extraCharacters; auto range = item->textEdit.range; editor()->replaceRange(range.start.line, range.start.character, - curLine, curIndex, textToBeInserted); + curLine, curIndex, textToBeInserted, true); if (cursorOffset) { editor()->lineIndexFromPosition(editor()->cursorPosition(), &curLine, &curIndex); editor()->setCursorPosition(curLine, curIndex + cursorOffset); @@ -234,7 +234,8 @@ void CodeCompletionWidget::executeWithoutTextEdit(lsp::CompletionItem *item) QRegularExpressionMatch match = identifier.match(text); int matchLength = match.hasMatch() ? match.capturedLength(0) : 0; length = qMax(length, matchLength); - editor()->replaceRange(pos - length, pos, textToInsert); + int startPos = pos - length; + editor()->replaceRange(startPos, pos, textToInsert, true); } void CodeCompletionWidget::modelContentChanged() diff --git a/src/plugins/codeeditor/gui/tabwidget.cpp b/src/plugins/codeeditor/gui/tabwidget.cpp index e0e71544e..259b410eb 100644 --- a/src/plugins/codeeditor/gui/tabwidget.cpp +++ b/src/plugins/codeeditor/gui/tabwidget.cpp @@ -605,7 +605,7 @@ void TabWidget::replaceAll(const QString &fileName, const QString &oldText, void TabWidget::replaceText(const QString &fileName, int line, int index, int length, const QString &after) { if (auto editor = d->findEditor(fileName)) - editor->replaceRange(line, index, line, index + length, after); + editor->replaceRange(line, index, line, index + length, after, true); } bool TabWidget::replaceRange(const QString &fileName, const dpfservice::Edit::Range &range, const QString &newText) diff --git a/src/plugins/codeeditor/gui/texteditor.cpp b/src/plugins/codeeditor/gui/texteditor.cpp index 22c77dd22..eedd74aba 100644 --- a/src/plugins/codeeditor/gui/texteditor.cpp +++ b/src/plugins/codeeditor/gui/texteditor.cpp @@ -650,19 +650,21 @@ int TextEditor::positionFromPoint(int x, int y) return pos; } -void TextEditor::replaceRange(int lineFrom, int indexFrom, int lineTo, int indexTo, const QString &text) +void TextEditor::replaceRange(int lineFrom, int indexFrom, int lineTo, int indexTo, const QString &text, bool changePos) { int startPos = positionFromLineIndex(lineFrom, indexFrom); int endPos = positionFromLineIndex(lineTo, indexTo); - replaceRange(startPos, endPos, text); + replaceRange(startPos, endPos, text, changePos); } -void TextEditor::replaceRange(int startPosition, int endPosition, const QString &text) +void TextEditor::replaceRange(int startPosition, int endPosition, const QString &text, bool changePos) { SendScintilla(SCI_CLEARSELECTIONS); SendScintilla(SCI_SETTARGETSTART, startPosition); SendScintilla(SCI_SETTARGETEND, endPosition); SendScintilla(SCI_REPLACETARGET, -1, textAsBytes(text).constData()); + if (changePos) + SendScintilla(SCI_GOTOPOS, startPosition + text.length()); } void TextEditor::insertText(const QString &text) diff --git a/src/plugins/codeeditor/gui/texteditor.h b/src/plugins/codeeditor/gui/texteditor.h index 9cd4f7191..912e81c38 100644 --- a/src/plugins/codeeditor/gui/texteditor.h +++ b/src/plugins/codeeditor/gui/texteditor.h @@ -90,8 +90,8 @@ class TextEditor : public QsciScintilla bool selectionStatus(const int &lineFrom, const int &lineTo, const int &indexFrom, const int &indexTo); QPoint pointFromPosition(int position); int positionFromPoint(int x, int y); - void replaceRange(int lineFrom, int indexFrom, int lineTo, int indexTo, const QString &text); - void replaceRange(int startPosition, int endPosition, const QString &text); + void replaceRange(int lineFrom, int indexFrom, int lineTo, int indexTo, const QString &text, bool changePos = false); + void replaceRange(int startPosition, int endPosition, const QString &text, bool changePos = false); void insertText(const QString &text); LanguageClientHandler *languageClient() const; int wordStartPositoin(int position);