diff --git a/src/plugins/qmljseditor/qmljseditingsettingspage.cpp b/src/plugins/qmljseditor/qmljseditingsettingspage.cpp index c2c9cc2aa9b..9f3befc471e 100644 --- a/src/plugins/qmljseditor/qmljseditingsettingspage.cpp +++ b/src/plugins/qmljseditor/qmljseditingsettingspage.cpp @@ -37,6 +37,7 @@ const char AUTO_FORMAT_ON_SAVE[] = "QmlJSEditor.AutoFormatOnSave"; const char AUTO_FORMAT_ONLY_CURRENT_PROJECT[] = "QmlJSEditor.AutoFormatOnlyCurrentProject"; const char QML_CONTEXTPANE_KEY[] = "QmlJSEditor.ContextPaneEnabled"; const char QML_CONTEXTPANEPIN_KEY[] = "QmlJSEditor.ContextPanePinned"; +const char FOLD_AUX_DATA[] = "QmlJSEditor.FoldAuxData"; using namespace QmlJSEditor; using namespace QmlJSEditor::Internal; @@ -45,7 +46,8 @@ QmlJsEditingSettings::QmlJsEditingSettings() : m_enableContextPane(false), m_pinContextPane(false), m_autoFormatOnSave(false), - m_autoFormatOnlyCurrentProject(false) + m_autoFormatOnlyCurrentProject(false), + m_foldAuxData(false) {} void QmlJsEditingSettings::set() @@ -62,6 +64,7 @@ void QmlJsEditingSettings::fromSettings(QSettings *settings) m_autoFormatOnSave = settings->value(AUTO_FORMAT_ON_SAVE, QVariant(false)).toBool(); m_autoFormatOnlyCurrentProject = settings->value(AUTO_FORMAT_ONLY_CURRENT_PROJECT, QVariant(false)).toBool(); + m_foldAuxData = settings->value(FOLD_AUX_DATA, QVariant(true)).toBool(); settings->endGroup(); } @@ -72,6 +75,7 @@ void QmlJsEditingSettings::toSettings(QSettings *settings) const settings->setValue(QML_CONTEXTPANEPIN_KEY, m_pinContextPane); settings->setValue(AUTO_FORMAT_ON_SAVE, m_autoFormatOnSave); settings->setValue(AUTO_FORMAT_ONLY_CURRENT_PROJECT, m_autoFormatOnlyCurrentProject); + settings->setValue(FOLD_AUX_DATA, m_foldAuxData); settings->endGroup(); } @@ -80,7 +84,8 @@ bool QmlJsEditingSettings::equals(const QmlJsEditingSettings &other) const return m_enableContextPane == other.m_enableContextPane && m_pinContextPane == other.m_pinContextPane && m_autoFormatOnSave == other.m_autoFormatOnSave - && m_autoFormatOnlyCurrentProject == other.m_autoFormatOnlyCurrentProject; + && m_autoFormatOnlyCurrentProject == other.m_autoFormatOnlyCurrentProject + && m_foldAuxData == other.m_foldAuxData; } bool QmlJsEditingSettings::enableContextPane() const @@ -123,6 +128,16 @@ void QmlJsEditingSettings::setAutoFormatOnlyCurrentProject(const bool autoFormat m_autoFormatOnlyCurrentProject = autoFormatOnlyCurrentProject; } +bool QmlJsEditingSettings::foldAuxData() const +{ + return m_foldAuxData; +} + +void QmlJsEditingSettings::setFoldAuxData(const bool foldAuxData) +{ + m_foldAuxData = foldAuxData; +} + class QmlJsEditingSettingsPageWidget final : public Core::IOptionsPageWidget { Q_DECLARE_TR_FUNCTIONS(QmlDesigner::Internal::QmlJsEditingSettingsPage) @@ -137,6 +152,7 @@ public: m_ui.textEditHelperCheckBoxPin->setChecked(s.pinContextPane()); m_ui.autoFormatOnSave->setChecked(s.autoFormatOnSave()); m_ui.autoFormatOnlyCurrentProject->setChecked(s.autoFormatOnlyCurrentProject()); + m_ui.foldAuxDataCheckBox->setChecked(s.foldAuxData()); } void apply() final @@ -146,6 +162,7 @@ public: s.setPinContextPane(m_ui.textEditHelperCheckBoxPin->isChecked()); s.setAutoFormatOnSave(m_ui.autoFormatOnSave->isChecked()); s.setAutoFormatOnlyCurrentProject(m_ui.autoFormatOnlyCurrentProject->isChecked()); + s.setFoldAuxData(m_ui.foldAuxDataCheckBox->isChecked()); s.set(); } diff --git a/src/plugins/qmljseditor/qmljseditingsettingspage.h b/src/plugins/qmljseditor/qmljseditingsettingspage.h index 7a8fb9be749..e3536a44ef6 100644 --- a/src/plugins/qmljseditor/qmljseditingsettingspage.h +++ b/src/plugins/qmljseditor/qmljseditingsettingspage.h @@ -60,11 +60,15 @@ namespace QmlJSEditor { bool autoFormatOnlyCurrentProject() const; void setAutoFormatOnlyCurrentProject(const bool autoFormatOnlyCurrentProject); + bool foldAuxData() const; + void setFoldAuxData(const bool foldAuxData); + private: bool m_enableContextPane; bool m_pinContextPane; bool m_autoFormatOnSave; bool m_autoFormatOnlyCurrentProject; + bool m_foldAuxData; }; inline bool operator==(const QmlJsEditingSettings &s1, const QmlJsEditingSettings &s2) diff --git a/src/plugins/qmljseditor/qmljseditingsettingspage.ui b/src/plugins/qmljseditor/qmljseditingsettingspage.ui index b4dea80704d..875a1ad0733 100644 --- a/src/plugins/qmljseditor/qmljseditingsettingspage.ui +++ b/src/plugins/qmljseditor/qmljseditingsettingspage.ui @@ -79,6 +79,22 @@ + + + + Features + + + + + + Auto-fold auxiliary data + + + + + + diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index c260c2f7085..9f1799eef27 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -36,6 +36,7 @@ #include "qmljsquickfixassist.h" #include "qmloutlinemodel.h" #include "quicktoolbar.h" +#include "qmljseditingsettingspage.h" #include #include @@ -158,6 +159,24 @@ void QmlJSEditorWidget::finalizeInitialization() createToolBar(); } +bool QmlJSEditorWidget::restoreState(const QByteArray &state) +{ + QStringList qmlTypes { QmlJSTools::Constants::QML_MIMETYPE, + QmlJSTools::Constants::QBS_MIMETYPE, + QmlJSTools::Constants::QMLTYPES_MIMETYPE, + QmlJSTools::Constants::QMLUI_MIMETYPE }; + + if (QmlJsEditingSettings::get().foldAuxData() && qmlTypes.contains(textDocument()->mimeType())) { + int version = 0; + QDataStream stream(state); + stream >> version; + if (version < 1) + foldAuxiliaryData(); + } + + return TextEditorWidget::restoreState(state); +} + QModelIndex QmlJSEditorWidget::outlineModelIndex() { if (!m_outlineModelIndex.isValid()) { @@ -217,6 +236,27 @@ void QmlJSEditorWidget::updateCodeWarnings(Document::Ptr doc) } } +void QmlJSEditorWidget::foldAuxiliaryData() +{ + QTextDocument *doc = document(); + auto documentLayout = qobject_cast(doc->documentLayout()); + QTC_ASSERT(documentLayout, return); + QTextBlock block = doc->lastBlock(); + + while (block.isValid() && block.isVisible()) { + if (TextDocumentLayout::canFold(block) && block.next().isVisible()) { + const QString trimmedText = block.text().trimmed(); + if (trimmedText.startsWith("/*##^##")) { + TextDocumentLayout::doFoldOrUnfold(block, false); + documentLayout->requestUpdate(); + documentLayout->emitDocumentSizeChanged(); + break; + } + } + block = block.previous(); + } +} + void QmlJSEditorWidget::modificationChanged(bool changed) { if (!changed && m_modelManager) diff --git a/src/plugins/qmljseditor/qmljseditor.h b/src/plugins/qmljseditor/qmljseditor.h index 2e160527f00..cb5265e66ef 100644 --- a/src/plugins/qmljseditor/qmljseditor.h +++ b/src/plugins/qmljseditor/qmljseditor.h @@ -60,6 +60,7 @@ public: QmlJSEditorWidget(); void finalizeInitialization() override; + bool restoreState(const QByteArray &state) override; QmlJSEditorDocument *qmlJsEditorDocument() const; @@ -92,6 +93,7 @@ private: void semanticInfoUpdated(const QmlJSTools::SemanticInfo &semanticInfo); void updateCodeWarnings(QmlJS::Document::Ptr doc); + void foldAuxiliaryData(); protected: void contextMenuEvent(QContextMenuEvent *e) override; diff --git a/src/plugins/texteditor/texteditor.h b/src/plugins/texteditor/texteditor.h index 9421fc2cf54..f7b69b48221 100644 --- a/src/plugins/texteditor/texteditor.h +++ b/src/plugins/texteditor/texteditor.h @@ -190,7 +190,7 @@ public: virtual void openFinishedSuccessfully(); // IEditor QByteArray saveState() const; - bool restoreState(const QByteArray &state); + virtual bool restoreState(const QByteArray &state); void gotoLine(int line, int column = 0, bool centerLine = true, bool animate = false); int position(TextPositionOperation posOp = CurrentPosition, int at = -1) const;