From bb88c8c9beb8d43871c252934da0a75b2e45fc36 Mon Sep 17 00:00:00 2001 From: Artem Sokolovskii Date: Thu, 11 Jan 2024 11:31:00 +0100 Subject: [PATCH] ClangFormat: Separate ClangFormat and Standard Indenter UI The combined UI was a bit misleading for the user and cause bunch of synchronization problems. The synchronization between old CodeStyle settings and ClangFormat settings was removed. Corresponding classes and functions were also cleared. The behavior now: When "Indenting only" or "Full Formatting" modes are chosen then The ClangFormat settings page is visible and the ClangFormat indenter is used. For "Disable" mode standard CodeStyle pages are shown and standard indenter respectively. Change-Id: Idb4974c68ceb16ef2e55b108043cc6f56f859840 Reviewed-by: Christian Kandeler --- .../clangformat/clangformatconfigwidget.cpp | 36 ++------ .../clangformat/clangformatconfigwidget.h | 9 +- src/plugins/clangformat/clangformatfile.cpp | 90 ------------------- src/plugins/clangformat/clangformatfile.h | 4 - .../clangformatglobalconfigwidget.cpp | 10 ++- .../clangformatglobalconfigwidget.h | 7 +- src/plugins/clangformat/clangformatplugin.cpp | 2 +- .../cppcodestylepreferencesfactory.cpp | 2 +- .../cppcodestylepreferencesfactory.h | 7 +- .../cppeditor/cppcodestylesettingspage.cpp | 29 +++--- .../cppeditor/cppcodestylesettingspage.h | 19 +--- .../texteditor/icodestylepreferences.cpp | 10 +-- .../texteditor/icodestylepreferences.h | 4 +- 13 files changed, 45 insertions(+), 184 deletions(-) diff --git a/src/plugins/clangformat/clangformatconfigwidget.cpp b/src/plugins/clangformat/clangformatconfigwidget.cpp index cc5b3083a09..cba028342e7 100644 --- a/src/plugins/clangformat/clangformatconfigwidget.cpp +++ b/src/plugins/clangformat/clangformatconfigwidget.cpp @@ -49,7 +49,7 @@ using namespace Utils; namespace ClangFormat { -class ClangFormatConfigWidget final : public CppEditor::CppCodeStyleWidget +class ClangFormatConfigWidget final : public TextEditor::CodeStyleEditorWidget { public: ClangFormatConfigWidget(TextEditor::ICodeStylePreferences *codeStyle, @@ -57,9 +57,6 @@ public: QWidget *parent); void apply() final; void finish() final; - void setCodeStyleSettings(const CppEditor::CppCodeStyleSettings &settings) final; - void setTabSettings(const TextEditor::TabSettings &settings) final; - void synchronize() final; private: bool eventFilter(QObject *object, QEvent *event) final; @@ -103,7 +100,7 @@ bool ClangFormatConfigWidget::eventFilter(QObject *object, QEvent *event) ClangFormatConfigWidget::ClangFormatConfigWidget(TextEditor::ICodeStylePreferences *codeStyle, Project *project, QWidget *parent) - : CppCodeStyleWidget(parent) + : CodeStyleEditorWidget(parent) { m_project = project; m_config = std::make_unique(codeStyle->currentPreferences()); @@ -115,7 +112,7 @@ ClangFormatConfigWidget::ClangFormatConfigWidget(TextEditor::ICodeStylePreferenc m_checksScrollArea->setWidget(m_checksWidget); m_checksScrollArea->setWidgetResizable(true); m_checksWidget->setEnabled(!codeStyle->isReadOnly() && !codeStyle->isTemporarilyReadOnly() - && !codeStyle->isAdditionalTabDisabled()); + && codeStyle->isAdditionalTabVisible()); static const int expectedMajorVersion = 17; @@ -189,7 +186,7 @@ void ClangFormatConfigWidget::slotCodeStyleChanged( m_style = m_config->style(); m_checksWidget->setEnabled(!codeStyle->isReadOnly() && !codeStyle->isTemporarilyReadOnly() - && !codeStyle->isAdditionalTabDisabled()); + && codeStyle->isAdditionalTabVisible()); fillTable(); updatePreview(); @@ -479,29 +476,6 @@ void ClangFormatConfigWidget::saveChanges(QObject *sender) fillTable(); updatePreview(); - synchronize(); -} - -void ClangFormatConfigWidget::setCodeStyleSettings(const CppEditor::CppCodeStyleSettings &settings) -{ - m_config->fromCppCodeStyleSettings(settings); - - fillTable(); - updatePreview(); -} - -void ClangFormatConfigWidget::setTabSettings(const TextEditor::TabSettings &settings) -{ - m_config->fromTabSettings(settings); - - fillTable(); - updatePreview(); -} - -void ClangFormatConfigWidget::synchronize() -{ - emit codeStyleSettingsChanged(m_config->toCppCodeStyleSettings(m_project)); - emit tabSettingsChanged(m_config->toTabSettings(m_project)); } void ClangFormatConfigWidget::apply() @@ -520,7 +494,7 @@ void ClangFormatConfigWidget::finish() m_config->setStyle(m_style); } -CppEditor::CppCodeStyleWidget *createClangFormatConfigWidget( +TextEditor::CodeStyleEditorWidget *createClangFormatConfigWidget( TextEditor::ICodeStylePreferences *codeStyle, Project *project, QWidget *parent) diff --git a/src/plugins/clangformat/clangformatconfigwidget.h b/src/plugins/clangformat/clangformatconfigwidget.h index 3e8334dea91..5a7860caba7 100644 --- a/src/plugins/clangformat/clangformatconfigwidget.h +++ b/src/plugins/clangformat/clangformatconfigwidget.h @@ -9,13 +9,16 @@ QT_BEGIN_NAMESPACE class QWidget; QT_END_NAMESPACE -namespace CppEditor { class CppCodeStyleWidget; } -namespace TextEditor { class ICodeStylePreferences; } +namespace TextEditor { +class ICodeStylePreferences; +class CodeStyleEditorWidget; +} // namespace TextEditor + namespace ProjectExplorer { class Project; } namespace ClangFormat { -CppEditor::CppCodeStyleWidget *createClangFormatConfigWidget( +TextEditor::CodeStyleEditorWidget *createClangFormatConfigWidget( TextEditor::ICodeStylePreferences *codeStyle, ProjectExplorer::Project *project, QWidget *parent); diff --git a/src/plugins/clangformat/clangformatfile.cpp b/src/plugins/clangformat/clangformatfile.cpp index 395b7ba53b4..700d18f711f 100644 --- a/src/plugins/clangformat/clangformatfile.cpp +++ b/src/plugins/clangformat/clangformatfile.cpp @@ -129,93 +129,3 @@ void ClangFormatFile::saveStyleToFile(clang::format::FormatStyle style, Utils::F styleStr.append("\n"); filePath.writeFileContents(QByteArray::fromStdString(styleStr)); } - -CppEditor::CppCodeStyleSettings ClangFormatFile::toCppCodeStyleSettings( - ProjectExplorer::Project *project) const -{ - using namespace clang::format; - auto settings = CppEditor::CppCodeStyleSettings::getProjectCodeStyle(project); - - FormatStyle style; - bool success = parseConfigurationFile(m_filePath, style); - QTC_ASSERT(success, return settings); - - // Modifier offset should be opposite to indent width in order indentAccessSpecifiers - // to be false - settings.indentAccessSpecifiers = (style.AccessModifierOffset != -1 * int(style.IndentWidth)); - - if (style.NamespaceIndentation == FormatStyle::NamespaceIndentationKind::NI_All) { - settings.indentNamespaceBody = true; - settings.indentNamespaceBraces = settings.indentNamespaceBody; - } - - if (style.BreakBeforeBraces == FormatStyle::BS_Whitesmiths) { - settings.indentClassBraces = true; - settings.indentEnumBraces = settings.indentClassBraces; - settings.indentBlockBraces = settings.indentClassBraces; - settings.indentFunctionBraces = settings.indentClassBraces; - } - - settings.indentSwitchLabels = style.IndentCaseLabels; -#if LLVM_VERSION_MAJOR >= 11 - settings.indentBlocksRelativeToSwitchLabels = style.IndentCaseBlocks; -#endif - if (style.DerivePointerAlignment - && ClangFormatSettings::instance().mode() == ClangFormatSettings::Mode::Formatting) { - settings.bindStarToIdentifier = style.PointerAlignment == FormatStyle::PAS_Right; - settings.bindStarToTypeName = style.PointerAlignment == FormatStyle::PAS_Left; - settings.bindStarToLeftSpecifier = style.PointerAlignment == FormatStyle::PAS_Left; - settings.bindStarToRightSpecifier = style.PointerAlignment == FormatStyle::PAS_Right; - } - - settings.extraPaddingForConditionsIfConfusingAlign = style.BreakBeforeBinaryOperators - == FormatStyle::BOS_All; - settings.alignAssignments = style.BreakBeforeBinaryOperators == FormatStyle::BOS_All - || style.BreakBeforeBinaryOperators - == FormatStyle::BOS_NonAssignment; - - return settings; -} - -void ClangFormatFile::fromCppCodeStyleSettings(const CppEditor::CppCodeStyleSettings &settings) -{ - ::fromCppCodeStyleSettings(m_style, settings); - saveNewFormat(); -} - -TextEditor::TabSettings ClangFormatFile::toTabSettings(ProjectExplorer::Project *project) const -{ - using namespace clang::format; - auto settings = CppEditor::CppCodeStyleSettings::getProjectTabSettings(project); - - FormatStyle style; - bool success = parseConfigurationFile(m_filePath, style); - QTC_ASSERT(success, return settings); - - settings.m_indentSize = style.IndentWidth; - settings.m_tabSize = style.TabWidth; - - switch (style.UseTab) { -#if LLVM_VERSION_MAJOR >= 11 - case FormatStyle::UT_AlignWithSpaces: -#endif - case FormatStyle::UT_ForIndentation: - case FormatStyle::UT_ForContinuationAndIndentation: - settings.m_tabPolicy = TextEditor::TabSettings::TabPolicy::MixedTabPolicy; - break; - case FormatStyle::UT_Never: - settings.m_tabPolicy = TextEditor::TabSettings::TabPolicy::SpacesOnlyTabPolicy; - break; - case FormatStyle::UT_Always: - settings.m_tabPolicy = TextEditor::TabSettings::TabPolicy::TabsOnlyTabPolicy; - break; - } - - return settings; -} - -void ClangFormatFile::fromTabSettings(const TextEditor::TabSettings &settings) -{ - ::fromTabSettings(m_style, settings); - saveNewFormat(); -} diff --git a/src/plugins/clangformat/clangformatfile.h b/src/plugins/clangformat/clangformatfile.h index ad32952b0f0..547f1f6ab2d 100644 --- a/src/plugins/clangformat/clangformatfile.h +++ b/src/plugins/clangformat/clangformatfile.h @@ -32,10 +32,6 @@ public: using Field = std::pair; QString changeFields(QList fields); QString changeField(Field field); - CppEditor::CppCodeStyleSettings toCppCodeStyleSettings(ProjectExplorer::Project *project) const; - TextEditor::TabSettings toTabSettings(ProjectExplorer::Project *project) const; - void fromCppCodeStyleSettings(const CppEditor::CppCodeStyleSettings &settings); - void fromTabSettings(const TextEditor::TabSettings &settings); bool isReadOnly() const; void setIsReadOnly(bool isReadOnly); diff --git a/src/plugins/clangformat/clangformatglobalconfigwidget.cpp b/src/plugins/clangformat/clangformatglobalconfigwidget.cpp index 75fa1f91cd8..ac1cae84742 100644 --- a/src/plugins/clangformat/clangformatglobalconfigwidget.cpp +++ b/src/plugins/clangformat/clangformatglobalconfigwidget.cpp @@ -27,7 +27,7 @@ namespace ClangFormat { ClangFormatGlobalConfigWidget::ClangFormatGlobalConfigWidget( TextEditor::ICodeStylePreferences *codeStyle, ProjectExplorer::Project *project, QWidget *parent) - : CppCodeStyleWidget(parent) + : TextEditor::CodeStyleEditorWidget(parent) , m_project(project) , m_codeStyle(codeStyle) { @@ -122,7 +122,7 @@ void ClangFormatGlobalConfigWidget::initIndentationOrFormattingCombobox() m_indentingOrFormatting->insertItem(static_cast(ClangFormatSettings::Mode::Formatting), Tr::tr("Full formatting")); m_indentingOrFormatting->insertItem(static_cast(ClangFormatSettings::Mode::Disable), - Tr::tr("Disable")); + Tr::tr("Use built-in indenter")); m_indentingOrFormatting->setCurrentIndex( static_cast(getProjectIndentationOrFormattingSettings(m_project))); @@ -226,8 +226,10 @@ void ClangFormatGlobalConfigWidget::initCustomSettingsCheckBox() if (m_ignoreChanges.isLocked()) return; Utils::GuardLocker locker(m_ignoreChanges); - m_codeStyle->currentPreferences()->setTemporarilyReadOnly(!m_useCustomSettingsCheckBox->isChecked()); - m_codeStyle->currentPreferences()->setIsAdditionalTabDisabled(!m_useCustomSettingsCheckBox->isEnabled()); + m_codeStyle->currentPreferences()->setTemporarilyReadOnly( + !m_useCustomSettingsCheckBox->isChecked()); + m_codeStyle->currentPreferences()->setIsAdditionalTabVisible( + m_useCustomSettingsCheckBox->isEnabled()); ClangFormatSettings::instance().write(); emit m_codeStyle->currentPreferencesChanged(m_codeStyle->currentPreferences()); }; diff --git a/src/plugins/clangformat/clangformatglobalconfigwidget.h b/src/plugins/clangformat/clangformatglobalconfigwidget.h index f2d16113881..e4ba4653349 100644 --- a/src/plugins/clangformat/clangformatglobalconfigwidget.h +++ b/src/plugins/clangformat/clangformatglobalconfigwidget.h @@ -15,11 +15,14 @@ class QSpinBox; QT_END_NAMESPACE namespace ProjectExplorer { class Project; } -namespace TextEditor { class ICodeStylePreferences; } +namespace TextEditor { +class ICodeStylePreferences; +class CodeStyleEditorWidget; +} // namespace TextEditor namespace ClangFormat { -class ClangFormatGlobalConfigWidget : public CppEditor::CppCodeStyleWidget +class ClangFormatGlobalConfigWidget : public TextEditor::CodeStyleEditorWidget { Q_OBJECT diff --git a/src/plugins/clangformat/clangformatplugin.cpp b/src/plugins/clangformat/clangformatplugin.cpp index c0eefa624a1..5d34be67200 100644 --- a/src/plugins/clangformat/clangformatplugin.cpp +++ b/src/plugins/clangformat/clangformatplugin.cpp @@ -44,7 +44,7 @@ public: return new ClangFormatForwardingIndenter(doc); } - std::pair additionalTab( + std::pair additionalTab( ICodeStylePreferences *codeStyle, Project *project, QWidget *parent) const override { return {createClangFormatConfigWidget(codeStyle, project, parent), Tr::tr("ClangFormat")}; diff --git a/src/plugins/cppeditor/cppcodestylepreferencesfactory.cpp b/src/plugins/cppeditor/cppcodestylepreferencesfactory.cpp index f712b9b48cb..a24c5c26c91 100644 --- a/src/plugins/cppeditor/cppcodestylepreferencesfactory.cpp +++ b/src/plugins/cppeditor/cppcodestylepreferencesfactory.cpp @@ -110,7 +110,7 @@ QString CppCodeStylePreferencesFactory::previewText() const return QLatin1String(defaultPreviewText); } -std::pair CppCodeStylePreferencesFactory::additionalTab( +std::pair CppCodeStylePreferencesFactory::additionalTab( TextEditor::ICodeStylePreferences *codeStyle, ProjectExplorer::Project *project, QWidget *parent) const diff --git a/src/plugins/cppeditor/cppcodestylepreferencesfactory.h b/src/plugins/cppeditor/cppcodestylepreferencesfactory.h index 4120bb8dad2..a54ac689b45 100644 --- a/src/plugins/cppeditor/cppcodestylepreferencesfactory.h +++ b/src/plugins/cppeditor/cppcodestylepreferencesfactory.h @@ -9,9 +9,8 @@ namespace CppEditor { -class CppCodeStyleWidget; - -class CPPEDITOR_EXPORT CppCodeStylePreferencesFactory : public TextEditor::ICodeStylePreferencesFactory +class CPPEDITOR_EXPORT CppCodeStylePreferencesFactory + : public TextEditor::ICodeStylePreferencesFactory { public: CppCodeStylePreferencesFactory(); @@ -25,7 +24,7 @@ public: TextEditor::Indenter *createIndenter(QTextDocument *doc) const override; QString snippetProviderGroupId() const override; QString previewText() const override; - virtual std::pair additionalTab( + virtual std::pair additionalTab( TextEditor::ICodeStylePreferences *codeStyle, ProjectExplorer::Project *project, QWidget *parent) const; diff --git a/src/plugins/cppeditor/cppcodestylesettingspage.cpp b/src/plugins/cppeditor/cppcodestylesettingspage.cpp index cea4e5c0bc4..65abc1da5ea 100644 --- a/src/plugins/cppeditor/cppcodestylesettingspage.cpp +++ b/src/plugins/cppeditor/cppcodestylesettingspage.cpp @@ -427,7 +427,12 @@ void CppCodeStylePreferencesWidget::setCodeStyleSettings(const CppCodeStyleSetti void CppCodeStylePreferencesWidget::slotCurrentPreferencesChanged(ICodeStylePreferences *preferences, bool preview) { const bool enable = !preferences->isReadOnly() && (!preferences->isTemporarilyReadOnly() - || preferences->isAdditionalTabDisabled()); + || !preferences->isAdditionalTabVisible()); + + d->m_categoryTab->setTabVisible(0, preferences->isAdditionalTabVisible()); + for (int i = 1; i < d->m_categoryTab->count(); ++i) + d->m_categoryTab->setTabVisible(i, !preferences->isAdditionalTabVisible()); + for (QWidget *widget : d->m_controllers) widget->setEnabled(enable); @@ -510,7 +515,7 @@ void CppCodeStylePreferencesWidget::setVisualizeWhitespace(bool on) } } -void CppCodeStylePreferencesWidget::addTab(CppCodeStyleWidget *page, QString tabName) +void CppCodeStylePreferencesWidget::addTab(TextEditor::CodeStyleEditorWidget *page, QString tabName) { if (!page) return; @@ -518,27 +523,13 @@ void CppCodeStylePreferencesWidget::addTab(CppCodeStyleWidget *page, QString tab d->m_categoryTab->insertTab(0, page, tabName); d->m_categoryTab->setCurrentIndex(0); - connect(page, &CppEditor::CppCodeStyleWidget::codeStyleSettingsChanged, - this, [this](const CppEditor::CppCodeStyleSettings &settings) { - setCodeStyleSettings(settings, true); - }); - - connect(page, &CppEditor::CppCodeStyleWidget::tabSettingsChanged, - this, &CppCodeStylePreferencesWidget::setTabSettings); - - connect(this, &CppCodeStylePreferencesWidget::codeStyleSettingsChanged, - page, &CppCodeStyleWidget::setCodeStyleSettings); - - connect(this, &CppCodeStylePreferencesWidget::tabSettingsChanged, - page, &CppCodeStyleWidget::setTabSettings); - connect(this, &CppCodeStylePreferencesWidget::applyEmitted, - page, &CppCodeStyleWidget::apply); + page, &TextEditor::CodeStyleEditorWidget::apply); connect(this, &CppCodeStylePreferencesWidget::finishEmitted, - page, &CppCodeStyleWidget::finish); + page, &TextEditor::CodeStyleEditorWidget::finish); - page->synchronize(); + slotCurrentPreferencesChanged(m_preferences->currentPreferences(), false); } void CppCodeStylePreferencesWidget::apply() diff --git a/src/plugins/cppeditor/cppcodestylesettingspage.h b/src/plugins/cppeditor/cppcodestylesettingspage.h index 666b3ab4a29..be3fb4af48a 100644 --- a/src/plugins/cppeditor/cppcodestylesettingspage.h +++ b/src/plugins/cppeditor/cppcodestylesettingspage.h @@ -22,23 +22,6 @@ namespace TextEditor { namespace CppEditor { class CppCodeStylePreferences; -class CPPEDITOR_EXPORT CppCodeStyleWidget : public TextEditor::CodeStyleEditorWidget -{ - Q_OBJECT -public: - CppCodeStyleWidget(QWidget *parent = nullptr) - : CodeStyleEditorWidget(parent) - {} - - virtual void setCodeStyleSettings(const CppEditor::CppCodeStyleSettings &) {} - virtual void setTabSettings(const TextEditor::TabSettings &) {} - virtual void synchronize() {} - -signals: - void codeStyleSettingsChanged(const CppEditor::CppCodeStyleSettings &); - void tabSettingsChanged(const TextEditor::TabSettings &); -}; - namespace Internal { class CppCodeStylePreferencesWidgetPrivate; @@ -51,7 +34,7 @@ public: ~CppCodeStylePreferencesWidget() override; void setCodeStyle(CppCodeStylePreferences *codeStylePreferences); - void addTab(CppCodeStyleWidget *page, QString tabName); + void addTab(TextEditor::CodeStyleEditorWidget *page, QString tabName); void apply() override; void finish() override; diff --git a/src/plugins/texteditor/icodestylepreferences.cpp b/src/plugins/texteditor/icodestylepreferences.cpp index 864c3a777ea..d7547d430ea 100644 --- a/src/plugins/texteditor/icodestylepreferences.cpp +++ b/src/plugins/texteditor/icodestylepreferences.cpp @@ -24,7 +24,7 @@ public: QString m_displayName; bool m_readOnly = false; bool m_temporarilyReadOnly = false; - bool m_isAdditionalTabDisabled = false; + bool m_isAdditionalTabVisible = false; Key m_settingsSuffix; }; @@ -82,14 +82,14 @@ bool ICodeStylePreferences::isTemporarilyReadOnly() const return d->m_temporarilyReadOnly; } -bool ICodeStylePreferences::isAdditionalTabDisabled() const +bool ICodeStylePreferences::isAdditionalTabVisible() const { - return d->m_isAdditionalTabDisabled; + return d->m_isAdditionalTabVisible; } -void ICodeStylePreferences::setIsAdditionalTabDisabled(bool on) +void ICodeStylePreferences::setIsAdditionalTabVisible(bool on) { - d->m_isAdditionalTabDisabled = on; + d->m_isAdditionalTabVisible = on; } void ICodeStylePreferences::setTabSettings(const TabSettings &settings) diff --git a/src/plugins/texteditor/icodestylepreferences.h b/src/plugins/texteditor/icodestylepreferences.h index 450941997f8..7239411b5c4 100644 --- a/src/plugins/texteditor/icodestylepreferences.h +++ b/src/plugins/texteditor/icodestylepreferences.h @@ -41,8 +41,8 @@ public: bool isTemporarilyReadOnly() const; void setTemporarilyReadOnly(bool on); - bool isAdditionalTabDisabled() const; - void setIsAdditionalTabDisabled(bool on); + bool isAdditionalTabVisible() const; + void setIsAdditionalTabVisible(bool on); void setTabSettings(const TabSettings &settings); TabSettings tabSettings() const;