diff --git a/src/plugins/clangformat/clangformatconfigwidget.cpp b/src/plugins/clangformat/clangformatconfigwidget.cpp index 5d6037cdf40..3ed402523b1 100644 --- a/src/plugins/clangformat/clangformatconfigwidget.cpp +++ b/src/plugins/clangformat/clangformatconfigwidget.cpp @@ -46,7 +46,6 @@ #include #include -#include #include #include @@ -88,8 +87,6 @@ ClangFormatConfigWidget::ClangFormatConfigWidget(TextEditor::ICodeStylePreferenc m_config = std::make_unique(filePathToCurrentSettings(codeStyle->currentPreferences())); resize(489, 305); - m_projectHasClangFormat = new QLabel(this); - m_overrideDefault = new QCheckBox(tr("Override Clang Format configuration file")); m_fallbackConfig = new QLabel(tr("Clang-Format Style")); m_checksScrollArea = new QScrollArea(); m_checksWidget = new QWidget; @@ -118,14 +115,10 @@ ClangFormatConfigWidget::ClangFormatConfigWidget(TextEditor::ICodeStylePreferenc using namespace Layouting; Column { - m_projectHasClangFormat, - m_overrideDefault, m_fallbackConfig, Row { m_checksScrollArea, m_preview } }.attachTo(this); - initOverrideCheckBox(); - connect(codeStyle, &TextEditor::ICodeStylePreferences::currentPreferencesChanged, this, &ClangFormatConfigWidget::slotCodeStyleChanged); @@ -155,29 +148,6 @@ void ClangFormatConfigWidget::slotCodeStyleChanged( updatePreview(); } -void ClangFormatConfigWidget::initOverrideCheckBox() -{ - if (m_project) { - m_overrideDefault->setChecked( - m_project->namedSettings(Constants::OVERRIDE_FILE_ID).toBool()); - } else { - m_overrideDefault->setChecked(ClangFormatSettings::instance().overrideDefaultFile()); - m_overrideDefault->setToolTip( - tr("Override Clang Format configuration file with the fallback configuration.")); - } - - connect(m_overrideDefault, &QCheckBox::toggled, - this, &ClangFormatConfigWidget::showOrHideWidgets); - connect(m_overrideDefault, &QCheckBox::toggled, this, [this](bool checked) { - if (m_project) - m_project->setNamedSettings(Constants::OVERRIDE_FILE_ID, checked); - else { - ClangFormatSettings::instance().setOverrideDefaultFile(checked); - ClangFormatSettings::instance().write(); - } - }); -} - void ClangFormatConfigWidget::connectChecks() { auto doSaveChanges = [this](QObject *sender) { @@ -200,19 +170,8 @@ void ClangFormatConfigWidget::connectChecks() } } -static bool projectConfigExists() -{ - return Core::ICore::userResourcePath() - .pathAppended("clang-format") - .pathAppended(currentProjectUniqueId()) - .pathAppended(Constants::SETTINGS_FILE_NAME) - .exists(); -} - void ClangFormatConfigWidget::showOrHideWidgets() { - m_projectHasClangFormat->hide(); - auto verticalLayout = qobject_cast(layout()); QTC_ASSERT(verticalLayout, return); @@ -220,31 +179,10 @@ void ClangFormatConfigWidget::showOrHideWidgets() if (lastItem->spacerItem()) verticalLayout->removeItem(lastItem); - if (!m_overrideDefault->isChecked() && m_project) { - // Show the fallback configuration only globally. - m_fallbackConfig->hide(); - m_checksScrollArea->hide(); - m_preview->hide(); - verticalLayout->addStretch(1); - return; - } - createStyleFileIfNeeded(!m_project); m_fallbackConfig->show(); m_checksScrollArea->show(); m_preview->show(); - - if (!m_project) { - const Project *currentProject = SessionManager::startupProject(); - if (!currentProject || !projectConfigExists()) { - m_projectHasClangFormat->hide(); - } else { - m_projectHasClangFormat->show(); - m_projectHasClangFormat->setText( - tr("Current project has its own overridden .clang-format file " - "and can be configured in Projects > Code Style > C++.")); - } - } } void ClangFormatConfigWidget::updatePreview() diff --git a/src/plugins/clangformat/clangformatconfigwidget.h b/src/plugins/clangformat/clangformatconfigwidget.h index 391d347153d..c06fcc1cdb7 100644 --- a/src/plugins/clangformat/clangformatconfigwidget.h +++ b/src/plugins/clangformat/clangformatconfigwidget.h @@ -71,7 +71,6 @@ private: void showOrHideWidgets(); void initChecksAndPreview(); - void initOverrideCheckBox(); void connectChecks(); void fillTable(); @@ -90,8 +89,6 @@ private: Utils::Guard m_ignoreChanges; - QLabel *m_projectHasClangFormat; - QCheckBox *m_overrideDefault; QLabel *m_fallbackConfig; }; diff --git a/src/plugins/clangformat/clangformatglobalconfigwidget.cpp b/src/plugins/clangformat/clangformatglobalconfigwidget.cpp index a80a54c5967..dc66cb20085 100644 --- a/src/plugins/clangformat/clangformatglobalconfigwidget.cpp +++ b/src/plugins/clangformat/clangformatglobalconfigwidget.cpp @@ -27,6 +27,7 @@ #include "clangformatconstants.h" #include "clangformatsettings.h" +#include "clangformatutils.h" #include @@ -47,13 +48,16 @@ namespace ClangFormat { ClangFormatGlobalConfigWidget::ClangFormatGlobalConfigWidget(ProjectExplorer::Project *project, QWidget *parent) : CppCodeStyleWidget(parent) + , m_project(project) { resize(489, 305); + m_projectHasClangFormat = new QLabel(this); m_formattingModeLabel = new QLabel(tr("Formatting mode:")); m_indentingOrFormatting = new QComboBox(this); m_formatWhileTyping = new QCheckBox(tr("Format while typing")); m_formatOnSave = new QCheckBox(tr("Format edited code on file save")); + m_overrideDefault = new QCheckBox(tr("Override Clang Format configuration file")); using namespace Layouting; @@ -62,7 +66,9 @@ ClangFormatGlobalConfigWidget::ClangFormatGlobalConfigWidget(ProjectExplorer::Pr Column { Row { m_formattingModeLabel, m_indentingOrFormatting, st }, m_formatWhileTyping, - m_formatOnSave + m_formatOnSave, + m_projectHasClangFormat, + m_overrideDefault } }; @@ -72,9 +78,13 @@ ClangFormatGlobalConfigWidget::ClangFormatGlobalConfigWidget(ProjectExplorer::Pr initCheckBoxes(); initIndentationOrFormattingCombobox(); + initOverrideCheckBox(); if (project) { - globalSettingsGroupBox.widget->hide(); + m_formattingModeLabel->hide(); + m_formatOnSave->hide(); + m_formatWhileTyping->hide(); + m_indentingOrFormatting->hide(); return; } globalSettingsGroupBox.widget->show(); @@ -111,6 +121,52 @@ void ClangFormatGlobalConfigWidget::initIndentationOrFormattingCombobox() static_cast(ClangFormatSettings::instance().mode())); } +bool ClangFormatGlobalConfigWidget::projectClangFormatFileExists() +{ + llvm::Expected styleFromProjectFolder + = clang::format::getStyle("file", m_project->projectFilePath().path().toStdString(), "none"); + + return styleFromProjectFolder && !(*styleFromProjectFolder == clang::format::getNoStyle()); +} + +void ClangFormatGlobalConfigWidget::initOverrideCheckBox() +{ + if (!m_project || !projectClangFormatFileExists()) { + m_projectHasClangFormat->hide(); + } else { + m_projectHasClangFormat->show(); + m_projectHasClangFormat->setText(tr("The current project has its own .clang-format file which " + "can be overridden by the settings below.")); + } + + auto setEnableOverrideCheckBox = [this](int index) { + bool isDisable = index == static_cast(ClangFormatSettings::Mode::Disable); + m_overrideDefault->setEnabled(!isDisable); + }; + + setEnableOverrideCheckBox(m_indentingOrFormatting->currentIndex()); + connect(m_indentingOrFormatting, &QComboBox::currentIndexChanged, + this, setEnableOverrideCheckBox); + + m_overrideDefault->setToolTip( + tr("Override Clang Format configuration file with the chosen configuration.")); + + if (m_project) + m_overrideDefault->setChecked( + m_project->namedSettings(Constants::OVERRIDE_FILE_ID).toBool()); + else + m_overrideDefault->setChecked(ClangFormatSettings::instance().overrideDefaultFile()); + + connect(m_overrideDefault, &QCheckBox::toggled, this, [this](bool checked) { + if (m_project) + m_project->setNamedSettings(Constants::OVERRIDE_FILE_ID, checked); + else { + ClangFormatSettings::instance().setOverrideDefaultFile(checked); + ClangFormatSettings::instance().write(); + } + }); +} + void ClangFormatGlobalConfigWidget::apply() { diff --git a/src/plugins/clangformat/clangformatglobalconfigwidget.h b/src/plugins/clangformat/clangformatglobalconfigwidget.h index 25435feadaf..4665e8d7892 100644 --- a/src/plugins/clangformat/clangformatglobalconfigwidget.h +++ b/src/plugins/clangformat/clangformatglobalconfigwidget.h @@ -52,11 +52,18 @@ public: private: void initCheckBoxes(); void initIndentationOrFormattingCombobox(); + void initOverrideCheckBox(); + bool projectClangFormatFileExists(); + + ProjectExplorer::Project *m_project; + + QLabel *m_projectHasClangFormat; QLabel *m_formattingModeLabel; QComboBox *m_indentingOrFormatting; QCheckBox *m_formatWhileTyping; QCheckBox *m_formatOnSave; + QCheckBox *m_overrideDefault; }; } // namespace ClangFormat