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;