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 <qt_ci_bot@qt-project.org>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Thomas Hartmann
2022-07-01 17:03:45 +02:00
parent 5a9a6804ee
commit 866f16adb1

View File

@@ -52,6 +52,7 @@
#include <qmljs/qmljsmodelmanagerinterface.h>
#include <qmljs/qmljsreformatter.h>
#include <utils/changeset.h>
#include <utils/qtcassert.h>
#include <QDebug>
#include <QPair>
@@ -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<QmlJSEditor::QmlJSEditorDocument *>(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);
}
}