From d9cd74f06db92a03a2e3a3fa2bdd6981da33ddd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Sch=C3=A4pers?= Date: Sun, 24 Jan 2021 17:11:02 +0100 Subject: [PATCH] Texteditor: Add ability to get margin from indenter And implement it in the clang-format plugin to use the ColumnLimit from the style. This would be quite useful if you're working on different projects with a different ColumnLimit. This way you get an visual representation and do not only have to rely on clang-format. Change-Id: Ib0258e3fba6f45f0f46ce612f806527a47868ad9 Reviewed-by: Leena Miettinen Reviewed-by: David Schulz --- .../clangformat/clangformatbaseindenter.cpp | 5 +++++ .../clangformat/clangformatbaseindenter.h | 2 ++ .../projectexplorer/editorconfiguration.cpp | 8 +++++++ .../projectexplorer/editorconfiguration.h | 1 + .../editorsettingspropertiespage.cpp | 3 +++ .../editorsettingspropertiespage.ui | 10 +++++++++ .../texteditor/displaysettingspage.cpp | 2 ++ src/plugins/texteditor/displaysettingspage.ui | 10 +++++++++ src/plugins/texteditor/indenter.h | 2 ++ src/plugins/texteditor/marginsettings.cpp | 7 +++++++ src/plugins/texteditor/marginsettings.h | 1 + src/plugins/texteditor/texteditor.cpp | 21 ++++++++++++++++++- src/plugins/texteditor/texteditor.h | 2 ++ 13 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/plugins/clangformat/clangformatbaseindenter.cpp b/src/plugins/clangformat/clangformatbaseindenter.cpp index 877a7f6f01c..5d2bda07d7f 100644 --- a/src/plugins/clangformat/clangformatbaseindenter.cpp +++ b/src/plugins/clangformat/clangformatbaseindenter.cpp @@ -679,6 +679,11 @@ bool ClangFormatBaseIndenter::isElectricCharacter(const QChar &ch) const return false; } +std::optional ClangFormat::ClangFormatBaseIndenter::margin() const +{ + return styleForFile().ColumnLimit; +} + void ClangFormatBaseIndenter::autoIndent(const QTextCursor &cursor, const TextEditor::TabSettings & /*tabSettings*/, int cursorPositionInEditor) diff --git a/src/plugins/clangformat/clangformatbaseindenter.h b/src/plugins/clangformat/clangformatbaseindenter.h index 00dc3e9c7a6..2e8e944c5bf 100644 --- a/src/plugins/clangformat/clangformatbaseindenter.h +++ b/src/plugins/clangformat/clangformatbaseindenter.h @@ -66,6 +66,8 @@ public: bool isElectricCharacter(const QChar &ch) const override; + std::optional margin() const override; + protected: virtual clang::format::FormatStyle styleForFile() const; virtual bool formatCodeInsteadOfIndent() const { return false; } diff --git a/src/plugins/projectexplorer/editorconfiguration.cpp b/src/plugins/projectexplorer/editorconfiguration.cpp index 50c5503c931..0555deb7a62 100644 --- a/src/plugins/projectexplorer/editorconfiguration.cpp +++ b/src/plugins/projectexplorer/editorconfiguration.cpp @@ -372,6 +372,14 @@ void EditorConfiguration::setShowWrapColumn(bool onoff) } } +void EditorConfiguration::setUseIndenter(bool onoff) +{ + if (d->m_marginSettings.m_useIndenter != onoff) { + d->m_marginSettings.m_useIndenter = onoff; + emit marginSettingsChanged(d->m_marginSettings); + } +} + void EditorConfiguration::setWrapColumn(int column) { if (d->m_marginSettings.m_marginColumn != column) { diff --git a/src/plugins/projectexplorer/editorconfiguration.h b/src/plugins/projectexplorer/editorconfiguration.h index 60e72dfb61c..fb9561d90a4 100644 --- a/src/plugins/projectexplorer/editorconfiguration.h +++ b/src/plugins/projectexplorer/editorconfiguration.h @@ -94,6 +94,7 @@ public: void setMarginSettings(const TextEditor::MarginSettings &settings); void setShowWrapColumn(bool onoff); + void setUseIndenter(bool onoff); void setWrapColumn(int column); void setTextCodec(QTextCodec *textCodec); diff --git a/src/plugins/projectexplorer/editorsettingspropertiespage.cpp b/src/plugins/projectexplorer/editorsettingspropertiespage.cpp index 1a9ede8c850..2ed5d783763 100644 --- a/src/plugins/projectexplorer/editorsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/editorsettingspropertiespage.cpp @@ -55,6 +55,8 @@ EditorSettingsWidget::EditorSettingsWidget(Project *project) : QWidget(), m_proj connect(m_ui.showWrapColumn, &QAbstractButton::toggled, config, &EditorConfiguration::setShowWrapColumn); + connect(m_ui.useIndenter, &QAbstractButton::toggled, + config, &EditorConfiguration::setUseIndenter); connect(m_ui.wrapColumn, QOverload::of(&QSpinBox::valueChanged), config, &EditorConfiguration::setWrapColumn); @@ -73,6 +75,7 @@ EditorSettingsWidget::EditorSettingsWidget(Project *project) : QWidget(), m_proj void EditorSettingsWidget::settingsToUi(const EditorConfiguration *config) { m_ui.showWrapColumn->setChecked(config->marginSettings().m_showMargin); + m_ui.useIndenter->setChecked(config->marginSettings().m_useIndenter); m_ui.wrapColumn->setValue(config->marginSettings().m_marginColumn); m_ui.behaviorSettingsWidget->setCodeStyle(config->codeStyle()); m_ui.globalSelector->setCurrentIndex(config->useGlobalSettings() ? 0 : 1); diff --git a/src/plugins/projectexplorer/editorsettingspropertiespage.ui b/src/plugins/projectexplorer/editorsettingspropertiespage.ui index 5a2ab33188c..07ab72656f2 100644 --- a/src/plugins/projectexplorer/editorsettingspropertiespage.ui +++ b/src/plugins/projectexplorer/editorsettingspropertiespage.ui @@ -81,6 +81,16 @@ + + + + If available, use a different margin. For example, the ColumnLimit from the clang-format plugin. + + + Use context specific margin + + + diff --git a/src/plugins/texteditor/displaysettingspage.cpp b/src/plugins/texteditor/displaysettingspage.cpp index 1894f511374..fa551504211 100644 --- a/src/plugins/texteditor/displaysettingspage.cpp +++ b/src/plugins/texteditor/displaysettingspage.cpp @@ -89,6 +89,7 @@ void DisplaySettingsWidget::settingsFromUI(DisplaySettings &displaySettings, displaySettings.m_displayLineNumbers = m_ui.displayLineNumbers->isChecked(); displaySettings.m_textWrapping = m_ui.enableTextWrapping->isChecked(); marginSettings.m_showMargin = m_ui.showWrapColumn->isChecked(); + marginSettings.m_useIndenter = m_ui.useIndenter->isChecked(); marginSettings.m_marginColumn = m_ui.wrapColumn->value(); displaySettings.m_visualizeWhitespace = m_ui.visualizeWhitespace->isChecked(); displaySettings.m_displayFoldingMarkers = m_ui.displayFoldingMarkers->isChecked(); @@ -121,6 +122,7 @@ void DisplaySettingsWidget::settingsToUI() m_ui.displayLineNumbers->setChecked(displaySettings.m_displayLineNumbers); m_ui.enableTextWrapping->setChecked(displaySettings.m_textWrapping); m_ui.showWrapColumn->setChecked(marginSettings.m_showMargin); + m_ui.useIndenter->setChecked(marginSettings.m_useIndenter); m_ui.wrapColumn->setValue(marginSettings.m_marginColumn); m_ui.visualizeWhitespace->setChecked(displaySettings.m_visualizeWhitespace); m_ui.displayFoldingMarkers->setChecked(displaySettings.m_displayFoldingMarkers); diff --git a/src/plugins/texteditor/displaysettingspage.ui b/src/plugins/texteditor/displaysettingspage.ui index 8fb605ab7eb..7f1e0c87a5b 100644 --- a/src/plugins/texteditor/displaysettingspage.ui +++ b/src/plugins/texteditor/displaysettingspage.ui @@ -56,6 +56,16 @@ + + + + If available, use a different margin. For example, the ColumnLimit from the clang-format plugin. + + + Use context specific margin + + + diff --git a/src/plugins/texteditor/indenter.h b/src/plugins/texteditor/indenter.h index 5dbf7ac2db5..407778b7172 100644 --- a/src/plugins/texteditor/indenter.h +++ b/src/plugins/texteditor/indenter.h @@ -120,6 +120,8 @@ public: int cursorPositionInEditor = -1) = 0; + virtual std::optional margin() const { return std::nullopt; } + protected: QTextDocument *m_doc; Utils::FilePath m_fileName; diff --git a/src/plugins/texteditor/marginsettings.cpp b/src/plugins/texteditor/marginsettings.cpp index b915d7df20d..ff37a43126c 100644 --- a/src/plugins/texteditor/marginsettings.cpp +++ b/src/plugins/texteditor/marginsettings.cpp @@ -32,11 +32,13 @@ static const char showWrapColumnKey[] = "ShowMargin"; static const char wrapColumnKey[] = "MarginColumn"; static const char groupPostfix[] = "MarginSettings"; +static const char useIndenterColumnKey[] = "UseIndenter"; using namespace TextEditor; MarginSettings::MarginSettings() : m_showMargin(false) + , m_useIndenter(false) , m_marginColumn(80) { } @@ -48,6 +50,7 @@ void MarginSettings::toSettings(const QString &category, QSettings *s) const group.insert(0, category); s->beginGroup(group); s->setValue(QLatin1String(showWrapColumnKey), m_showMargin); + s->setValue(QLatin1String(useIndenterColumnKey), m_useIndenter); s->setValue(QLatin1String(wrapColumnKey), m_marginColumn); s->endGroup(); } @@ -62,24 +65,28 @@ void MarginSettings::fromSettings(const QString &category, const QSettings *s) *this = MarginSettings(); // Assign defaults m_showMargin = s->value(group + QLatin1String(showWrapColumnKey), m_showMargin).toBool(); + m_useIndenter = s->value(group + QLatin1String(useIndenterColumnKey), m_useIndenter).toBool(); m_marginColumn = s->value(group + QLatin1String(wrapColumnKey), m_marginColumn).toInt(); } void MarginSettings::toMap(const QString &prefix, QVariantMap *map) const { map->insert(prefix + QLatin1String(showWrapColumnKey), m_showMargin); + map->insert(prefix + QLatin1String(useIndenterColumnKey), m_useIndenter); map->insert(prefix + QLatin1String(wrapColumnKey), m_marginColumn); } void MarginSettings::fromMap(const QString &prefix, const QVariantMap &map) { m_showMargin = map.value(prefix + QLatin1String(showWrapColumnKey), m_showMargin).toBool(); + m_useIndenter = map.value(prefix + QLatin1String(useIndenterColumnKey), m_useIndenter).toBool(); m_marginColumn = map.value(prefix + QLatin1String(wrapColumnKey), m_marginColumn).toInt(); } bool MarginSettings::equals(const MarginSettings &other) const { return m_showMargin == other.m_showMargin + && m_useIndenter == other.m_useIndenter && m_marginColumn == other.m_marginColumn ; } diff --git a/src/plugins/texteditor/marginsettings.h b/src/plugins/texteditor/marginsettings.h index ff8be7bcdea..2dd2e26aa4b 100644 --- a/src/plugins/texteditor/marginsettings.h +++ b/src/plugins/texteditor/marginsettings.h @@ -49,6 +49,7 @@ public: bool equals(const MarginSettings &other) const; bool m_showMargin; + bool m_useIndenter; int m_marginColumn; }; diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index b4149370211..0235c77c37a 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -1478,6 +1478,7 @@ void TextEditorWidget::openFinishedSuccessfully() moveCursor(QTextCursor::Start); d->updateCannotDecodeInfo(); updateTextCodecLabel(); + updateVisualWrapColumn(); } TextDocumentPtr TextEditorWidget::textDocumentPtr() const @@ -7438,8 +7439,8 @@ void TextEditorWidget::setDisplaySettings(const DisplaySettings &ds) void TextEditorWidget::setMarginSettings(const MarginSettings &ms) { - setVisibleWrapColumn(ms.m_showMargin ? ms.m_marginColumn : 0); d->m_marginSettings = ms; + updateVisualWrapColumn(); viewport()->update(); extraArea()->update(); @@ -8261,6 +8262,24 @@ bool TextEditorWidget::inFindScope(int selectionStart, int selectionEnd) return true; } +void TextEditorWidget::updateVisualWrapColumn() +{ + auto calcMargin = [this]() { + const auto &ms = d->m_marginSettings; + + if (!ms.m_showMargin) { + return 0; + } + if (ms.m_useIndenter) { + if (auto margin = d->m_document->indenter()->margin()) { + return *margin; + } + } + return ms.m_marginColumn; + }; + setVisibleWrapColumn(calcMargin()); +} + void TextEditorWidget::setBlockSelection(bool on) { if (d->m_inBlockSelectionMode == on) diff --git a/src/plugins/texteditor/texteditor.h b/src/plugins/texteditor/texteditor.h index b64bd3461ad..b48c7b3ee3d 100644 --- a/src/plugins/texteditor/texteditor.h +++ b/src/plugins/texteditor/texteditor.h @@ -621,6 +621,8 @@ private: friend class Internal::TextEditorWidgetPrivate; friend class Internal::TextEditorOverlay; friend class RefactorOverlay; + + void updateVisualWrapColumn(); }; class TEXTEDITOR_EXPORT TextEditorLinkLabel : public Utils::ElidingLabel