From 866f16adb1aaff5c8e2d4a61625dc480e432cd0d Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 1 Jul 2022 17:03:45 +0200 Subject: [PATCH] QmlDesigner: Fix TextEditorView::reformatFile * Updating the document only if it actually changed * Using the text cursor of the widget * We can rely on the widget to exist * Simplify how the cursor is restored Task-number: QDS-6410 Change-Id: Idaa384533f12b9b7ad7078bcdc37c1afaf651662 Reviewed-by: Qt CI Bot Reviewed-by: Reviewed-by: Thomas Hartmann --- .../components/texteditor/texteditorview.cpp | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp index efec8afd9c7..077a6e14c36 100644 --- a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp +++ b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp @@ -52,6 +52,7 @@ #include #include #include +#include #include #include @@ -258,12 +259,7 @@ void TextEditorView::gotoCursorPosition(int line, int column) void TextEditorView::reformatFile() { - int oldLine = -1; - - if (m_widget) - oldLine = m_widget->currentLine(); - - QByteArray editorState = m_widget->textEditor()->saveState(); + QTC_ASSERT(!m_widget.isNull(), return); auto document = qobject_cast(Core::EditorManager::currentDocument()); @@ -292,16 +288,21 @@ void TextEditorView::reformatFile() return; const QString &newText = QmlJS::reformat(currentDocument); - QTextCursor tc(document->document()); + if (currentDocument->source() == newText) + return; + + QTextCursor tc = m_widget->textEditor()->textCursor(); + int pos = m_widget->textEditor()->textCursor().position(); Utils::ChangeSet changeSet; changeSet.replace(0, document->plainText().length(), newText); + + tc.beginEditBlock(); changeSet.apply(&tc); + tc.setPosition(pos); + tc.endEditBlock(); - m_widget->textEditor()->restoreState(editorState); - - if (m_widget) - m_widget->gotoCursorPosition(oldLine, 0); + m_widget->textEditor()->setTextCursor(tc); } }