From cba001eff828a654255a869cef025b58bbf6ddce Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 19 Jan 2017 12:09:09 +0100 Subject: [PATCH] QmlDesigner: Do not move cursor when reformating When saving a .ui.qml file the complete file is reformated. Without this patch the cursor is moved to the bottom. The cursor is still moved, but they line is kept. Since we reformat the complete file this should be fine. Change-Id: Ia1ef003e2e6ca7497dcad7e0e8044ffb99c80ea3 Reviewed-by: Tim Jenssen --- .../components/texteditor/texteditorview.cpp | 41 ++++++++++++++++++- .../components/texteditor/texteditorview.h | 2 + .../texteditor/texteditorwidget.cpp | 7 ++++ .../components/texteditor/texteditorwidget.h | 1 + .../designercore/include/viewmanager.h | 1 + .../designercore/model/viewmanager.cpp | 5 +++ src/plugins/qmldesigner/shortcutmanager.cpp | 15 +------ 7 files changed, 58 insertions(+), 14 deletions(-) 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(); });