diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp index a795e181b69..1dde39c7273 100644 --- a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp +++ b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp @@ -29,15 +29,21 @@ #include #include +#include #include #include #include #include #include - #include + #include +#include #include +#include +#include + +#include #include #include @@ -196,6 +202,39 @@ void TextEditorView::gotoCursorPosition(int line, int column) m_widget->gotoCursorPosition(line, column); } +void TextEditorView::reformatFile() +{ + int oldLine = -1; + + if (m_widget) + oldLine = m_widget->currentLine(); + + QByteArray editorState = m_widget->textEditor()->saveState(); + + DesignerSettings settings = QmlDesignerPlugin::instance()->settings(); + + auto document = + qobject_cast(Core::EditorManager::instance()->currentDocument()); + + /* Reformat document if we have a .ui.qml file */ + if (document + && document->filePath().toString().endsWith(".ui.qml") + && settings.value(DesignerSettingsKey::REFORMAT_UI_QML_FILES).toBool()) { + + const QString &newText = QmlJS::reformat(document->semanticInfo().document); + QTextCursor tc(document->document()); + + Utils::ChangeSet changeSet; + changeSet.replace(0, document->plainText().length(), newText); + changeSet.apply(&tc); + + m_widget->textEditor()->restoreState(editorState); + + if (m_widget) + m_widget->gotoCursorPosition(oldLine, 0); + } +} + void TextEditorView::instancePropertyChanged(const QList > &/*propertyList*/) { } diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorview.h b/src/plugins/qmldesigner/components/texteditor/texteditorview.h index df43b644044..23386b2943f 100644 --- a/src/plugins/qmldesigner/components/texteditor/texteditorview.h +++ b/src/plugins/qmldesigner/components/texteditor/texteditorview.h @@ -90,6 +90,8 @@ public: void gotoCursorPosition(int line, int column); + void reformatFile(); + private: std::unique_ptr m_widget; }; diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp b/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp index c287993c85d..5e7407fdf7b 100644 --- a/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp +++ b/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp @@ -129,4 +129,11 @@ void TextEditorWidget::clearStatusBar() m_statusBar->clearText(); } +int TextEditorWidget::currentLine() const +{ + if (m_textEditor) + return m_textEditor->currentLine(); + return -1; +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorwidget.h b/src/plugins/qmldesigner/components/texteditor/texteditorwidget.h index 5922729ceb9..41da765aa0b 100644 --- a/src/plugins/qmldesigner/components/texteditor/texteditorwidget.h +++ b/src/plugins/qmldesigner/components/texteditor/texteditorwidget.h @@ -57,6 +57,7 @@ public: void setStatusText(const QString &text); void clearStatusBar(); + int currentLine() const; private: void updateSelectionByCursorPosition(); diff --git a/src/plugins/qmldesigner/designercore/include/viewmanager.h b/src/plugins/qmldesigner/designercore/include/viewmanager.h index 7fdfaff75c8..cf5967cd4ad 100644 --- a/src/plugins/qmldesigner/designercore/include/viewmanager.h +++ b/src/plugins/qmldesigner/designercore/include/viewmanager.h @@ -85,6 +85,7 @@ public: NodeInstanceView *nodeInstanceView() const; void exportAsImage(); + void reformatFileUsingTextEditorView(); QWidgetAction *componentViewAction() const; diff --git a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp index 355be0de0e9..02e95806bc9 100644 --- a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp +++ b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp @@ -344,6 +344,11 @@ void ViewManager::exportAsImage() d->formEditorView.exportAsImage(); } +void ViewManager::reformatFileUsingTextEditorView() +{ + d->textEditorView.reformatFile(); +} + } // namespace QmlDesigner #endif //QMLDESIGNER_TEST diff --git a/src/plugins/qmldesigner/shortcutmanager.cpp b/src/plugins/qmldesigner/shortcutmanager.cpp index bb907d9a6c7..873a427441a 100644 --- a/src/plugins/qmldesigner/shortcutmanager.cpp +++ b/src/plugins/qmldesigner/shortcutmanager.cpp @@ -143,19 +143,8 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex //Save Core::ActionManager::registerAction(&m_saveAction, Core::Constants::SAVE, qmlDesignerMainContext); connect(&m_saveAction, &QAction::triggered, em, [em] { - DesignerSettings settings = QmlDesignerPlugin::instance()->settings(); - /* Reformat document if we have a .ui.qml file */ - if (settings.value(DesignerSettingsKey::REFORMAT_UI_QML_FILES).toBool() - && em->currentDocument()->filePath().toString().endsWith(".ui.qml")) - if (QmlJSEditor::QmlJSEditorDocument *document - = qobject_cast(em->currentDocument())) { - const QString &newText = QmlJS::reformat(document->semanticInfo().document); - QTextCursor tc(document->document()); - tc.movePosition(QTextCursor::Start); - tc.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); - tc.insertText(newText); - } - em->saveDocument(); + QmlDesignerPlugin::instance()->viewManager().reformatFileUsingTextEditorView(); + em->saveDocument(); });