From ac25398b7b5014874d7536f97490520609a24a17 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 26 Nov 2024 13:49:27 +0100 Subject: [PATCH] Editor: Do not allow changing document tab settings for clangformat the clangformat plugin ignores our internal tab settings so there is no need to be able to change those settings for files that are indented by the clang format indenter. Change-Id: I7b91f84e9ec4fbe977024aa648f49ea0b0dc6bcf Reviewed-by: Christian Stenger --- .../clangformat/clangformatbaseindenter.cpp | 5 ++ .../clangformat/clangformatbaseindenter.h | 2 + .../clangformat/clangformatindenter.cpp | 5 ++ src/plugins/clangformat/clangformatindenter.h | 2 + src/plugins/texteditor/indenter.h | 2 + src/plugins/texteditor/texteditor.cpp | 89 ++++++++++--------- 6 files changed, 62 insertions(+), 43 deletions(-) diff --git a/src/plugins/clangformat/clangformatbaseindenter.cpp b/src/plugins/clangformat/clangformatbaseindenter.cpp index 7b4549a9b41..6fa11690538 100644 --- a/src/plugins/clangformat/clangformatbaseindenter.cpp +++ b/src/plugins/clangformat/clangformatbaseindenter.cpp @@ -1031,4 +1031,9 @@ void ClangFormatBaseIndenter::setOverriddenStyle(const clang::format::FormatStyl d->m_overriddenStyle = style; } +bool ClangFormatBaseIndenter::respectsTabSettings() const +{ + return false; +} + } // namespace ClangFormat diff --git a/src/plugins/clangformat/clangformatbaseindenter.h b/src/plugins/clangformat/clangformatbaseindenter.h index 8d72bd4e0fe..8511e0d13ed 100644 --- a/src/plugins/clangformat/clangformatbaseindenter.h +++ b/src/plugins/clangformat/clangformatbaseindenter.h @@ -55,6 +55,8 @@ public: void setOverriddenPreferences(TextEditor::ICodeStylePreferences *preferences) final; void setOverriddenStyle(const clang::format::FormatStyle &style); + bool respectsTabSettings() const override; + protected: virtual bool formatCodeInsteadOfIndent() const { return false; } virtual bool formatWhileTyping() const { return false; } diff --git a/src/plugins/clangformat/clangformatindenter.cpp b/src/plugins/clangformat/clangformatindenter.cpp index 1b2d76813f1..5f30c77ebf9 100644 --- a/src/plugins/clangformat/clangformatindenter.cpp +++ b/src/plugins/clangformat/clangformatindenter.cpp @@ -235,4 +235,9 @@ std::optional ClangFormatForwardingIndenter::margin() const return currentIndenter()->margin(); } +bool ClangFormatForwardingIndenter::respectsTabSettings() const +{ + return currentIndenter()->respectsTabSettings(); +} + } // namespace ClangFormat diff --git a/src/plugins/clangformat/clangformatindenter.h b/src/plugins/clangformat/clangformatindenter.h index be3d54e6c8d..19d4c997428 100644 --- a/src/plugins/clangformat/clangformatindenter.h +++ b/src/plugins/clangformat/clangformatindenter.h @@ -60,6 +60,8 @@ public: int cursorPositionInEditor = -1) override; std::optional margin() const override; + bool respectsTabSettings() const override; + private: TextEditor::Indenter *currentIndenter() const; diff --git a/src/plugins/texteditor/indenter.h b/src/plugins/texteditor/indenter.h index 645150fc6e6..c0acdb58248 100644 --- a/src/plugins/texteditor/indenter.h +++ b/src/plugins/texteditor/indenter.h @@ -108,6 +108,8 @@ public: virtual std::optional margin() const { return std::nullopt; } + virtual bool respectsTabSettings() const { return true; } + protected: QTextDocument *m_doc; Utils::FilePath m_fileName; diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index ac8e9800b40..5ddc6f1dcc1 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -314,51 +314,54 @@ private: QTC_ASSERT(m_doc, return); auto menu = new QMenu; menu->addAction(ActionManager::command(Constants::AUTO_INDENT_SELECTION)->action()); - auto documentSettings = menu->addMenu(Tr::tr("Document Settings")); + if (auto indenter = m_doc->indenter(); indenter && indenter->respectsTabSettings()) { + auto documentSettings = menu->addMenu(Tr::tr("Document Settings")); - auto modifyTabSettings = [this](std::function modifier) { - return [this, modifier]() { - auto ts = m_doc->tabSettings(); - modifier(ts); - m_doc->setTabSettings(ts); - }; - }; - documentSettings->addAction( - Tr::tr("Auto detect"), - modifyTabSettings([doc = m_doc->document()](TabSettings &tabSettings) { - tabSettings = tabSettings.autoDetect(doc); - })); - auto tabSettings = documentSettings->addMenu(Tr::tr("Tab Settings")); - tabSettings->addAction(Tr::tr("Spaces"), modifyTabSettings([](TabSettings &tabSettings) { - tabSettings.m_tabPolicy = TabSettings::SpacesOnlyTabPolicy; - })); - tabSettings->addAction(Tr::tr("Tabs"), modifyTabSettings([](TabSettings &tabSettings) { - tabSettings.m_tabPolicy = TabSettings::TabsOnlyTabPolicy; - })); - auto indentSize = documentSettings->addMenu(Tr::tr("Indent Size")); - auto indentSizeGroup = new QActionGroup(indentSize); - indentSizeGroup->setExclusive(true); - for (int i = 1; i <= 8; ++i) { - auto action = indentSizeGroup->addAction(QString::number(i)); - action->setCheckable(true); - action->setChecked(i == m_doc->tabSettings().m_indentSize); - connect(action, &QAction::triggered, modifyTabSettings([i](TabSettings &tabSettings) { - tabSettings.m_indentSize = i; - })); + auto modifyTabSettings = + [this](std::function modifier) { + return [this, modifier]() { + auto ts = m_doc->tabSettings(); + modifier(ts); + m_doc->setTabSettings(ts); + }; + }; + documentSettings->addAction( + Tr::tr("Auto detect"), + modifyTabSettings([doc = m_doc->document()](TabSettings &tabSettings) { + tabSettings = tabSettings.autoDetect(doc); + })); + auto tabSettings = documentSettings->addMenu(Tr::tr("Tab Settings")); + tabSettings->addAction(Tr::tr("Spaces"), modifyTabSettings([](TabSettings &tabSettings) { + tabSettings.m_tabPolicy = TabSettings::SpacesOnlyTabPolicy; + })); + tabSettings->addAction(Tr::tr("Tabs"), modifyTabSettings([](TabSettings &tabSettings) { + tabSettings.m_tabPolicy = TabSettings::TabsOnlyTabPolicy; + })); + auto indentSize = documentSettings->addMenu(Tr::tr("Indent Size")); + auto indentSizeGroup = new QActionGroup(indentSize); + indentSizeGroup->setExclusive(true); + for (int i = 1; i <= 8; ++i) { + auto action = indentSizeGroup->addAction(QString::number(i)); + action->setCheckable(true); + action->setChecked(i == m_doc->tabSettings().m_indentSize); + connect(action, &QAction::triggered, modifyTabSettings([i](TabSettings &tabSettings) { + tabSettings.m_indentSize = i; + })); + } + indentSize->addActions(indentSizeGroup->actions()); + auto tabSize = documentSettings->addMenu(Tr::tr("Tab Size")); + auto tabSizeGroup = new QActionGroup(tabSize); + tabSizeGroup->setExclusive(true); + for (int i = 1; i <= 8; ++i) { + auto action = tabSizeGroup->addAction(QString::number(i)); + action->setCheckable(true); + action->setChecked(i == m_doc->tabSettings().m_tabSize); + connect(action, &QAction::triggered, modifyTabSettings([i](TabSettings &tabSettings) { + tabSettings.m_tabSize = i; + })); + } + tabSize->addActions(tabSizeGroup->actions()); } - indentSize->addActions(indentSizeGroup->actions()); - auto tabSize = documentSettings->addMenu(Tr::tr("Tab Size")); - auto tabSizeGroup = new QActionGroup(tabSize); - tabSizeGroup->setExclusive(true); - for (int i = 1; i <= 8; ++i) { - auto action = tabSizeGroup->addAction(QString::number(i)); - action->setCheckable(true); - action->setChecked(i == m_doc->tabSettings().m_tabSize); - connect(action, &QAction::triggered, modifyTabSettings([i](TabSettings &tabSettings) { - tabSettings.m_tabSize = i; - })); - } - tabSize->addActions(tabSizeGroup->actions()); Id globalSettingsCategory; if (auto codeStyle = m_doc->codeStyle())