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 <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2024-11-26 13:49:27 +01:00
parent fb964aa7d7
commit ac25398b7b
6 changed files with 62 additions and 43 deletions

View File

@@ -1031,4 +1031,9 @@ void ClangFormatBaseIndenter::setOverriddenStyle(const clang::format::FormatStyl
d->m_overriddenStyle = style;
}
bool ClangFormatBaseIndenter::respectsTabSettings() const
{
return false;
}
} // namespace ClangFormat

View File

@@ -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; }

View File

@@ -235,4 +235,9 @@ std::optional<int> ClangFormatForwardingIndenter::margin() const
return currentIndenter()->margin();
}
bool ClangFormatForwardingIndenter::respectsTabSettings() const
{
return currentIndenter()->respectsTabSettings();
}
} // namespace ClangFormat

View File

@@ -60,6 +60,8 @@ public:
int cursorPositionInEditor = -1) override;
std::optional<int> margin() const override;
bool respectsTabSettings() const override;
private:
TextEditor::Indenter *currentIndenter() const;

View File

@@ -108,6 +108,8 @@ public:
virtual std::optional<int> margin() const { return std::nullopt; }
virtual bool respectsTabSettings() const { return true; }
protected:
QTextDocument *m_doc;
Utils::FilePath m_fileName;

View File

@@ -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<void(TabSettings &tabSettings)> 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<void(TabSettings & tabSettings)> 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())