From e57c1268ee302bd78059a13a046eade9d896c61e Mon Sep 17 00:00:00 2001 From: Ivan Donchevskii Date: Tue, 20 Nov 2018 11:23:30 +0100 Subject: [PATCH] ClangFormat: Move settings to the Code Style widget It makes sense to unify the indenter creation by replacing the CppCodeStylePreferencesFactory instead of removing it. We are reusing the same options page but with different kind of settings. With this change wizards will no more be confused by missing factory and will create the proper indenter. Fixes: QTCREATORBUG-21516 Change-Id: I38964d5fa1f2257617c66a1441db723d239a3237 Reviewed-by: Marco Bubke Reviewed-by: Nikolai Kosjar --- .../clangformat/clangformatconfigwidget.cpp | 7 +- src/plugins/clangformat/clangformatplugin.cpp | 92 ++++++------------- src/plugins/clangformat/clangformatplugin.h | 6 -- src/plugins/cppeditor/cppeditordocument.cpp | 10 +- .../cpptools/cppcodestylepreferencesfactory.h | 4 +- .../cpptools/cppcodestylesettingspage.cpp | 20 ++-- .../cpptools/cppcodestylesettingspage.h | 2 +- src/plugins/cpptools/cppmodelmanager.cpp | 2 - src/plugins/cpptools/cppmodelmanager.h | 7 -- .../codestylesettingspropertiespage.cpp | 5 +- src/plugins/texteditor/codestyleeditor.cpp | 5 - src/plugins/texteditor/codestyleeditor.h | 2 - .../icodestylepreferencesfactory.cpp | 7 ++ .../texteditor/icodestylepreferencesfactory.h | 2 + 14 files changed, 72 insertions(+), 99 deletions(-) diff --git a/src/plugins/clangformat/clangformatconfigwidget.cpp b/src/plugins/clangformat/clangformatconfigwidget.cpp index 6d81bde9721..8eee84109ac 100644 --- a/src/plugins/clangformat/clangformatconfigwidget.cpp +++ b/src/plugins/clangformat/clangformatconfigwidget.cpp @@ -132,10 +132,15 @@ void ClangFormatConfigWidget::initialize() m_ui->clangFormatOptionsTable->show(); m_ui->applyButton->show(); + QLayoutItem *lastItem = m_ui->verticalLayout->itemAt(m_ui->verticalLayout->count() - 1); + if (QSpacerItem *spacer = lastItem->spacerItem()) + m_ui->verticalLayout->removeItem(lastItem); + if (m_project && !m_project->projectDirectory().appendPath(SETTINGS_FILE_NAME).exists()) { m_ui->projectHasClangFormat->setText(tr("No .clang-format file for the project.")); m_ui->clangFormatOptionsTable->hide(); m_ui->applyButton->hide(); + m_ui->verticalLayout->addStretch(1); connect(m_ui->createFileButton, &QPushButton::clicked, this, [this]() { @@ -158,7 +163,7 @@ void ClangFormatConfigWidget::initialize() } else { m_ui->projectHasClangFormat->setText( tr("Current project has its own .clang-format file " - "and can be configured in Projects > Clang Format.")); + "and can be configured in Projects > Code Style > C++.")); } createStyleFileIfNeeded(true); m_ui->applyButton->hide(); diff --git a/src/plugins/clangformat/clangformatplugin.cpp b/src/plugins/clangformat/clangformatplugin.cpp index 0c51a5ed2c6..d5882aab587 100644 --- a/src/plugins/clangformat/clangformatplugin.cpp +++ b/src/plugins/clangformat/clangformatplugin.cpp @@ -36,13 +36,14 @@ #include #include #include -#include +#include #include #include #include -#include +#include +#include #include #include @@ -63,59 +64,38 @@ using namespace ProjectExplorer; namespace ClangFormat { -class ClangFormatOptionsPage : public Core::IOptionsPage -{ -public: - explicit ClangFormatOptionsPage() - { - setId("Cpp.CodeStyle.ClangFormat"); - setDisplayName(QCoreApplication::translate( - "ClangFormat::Internal::ClangFormatOptionsPage", - "Clang Format")); - setCategory(CppTools::Constants::CPP_SETTINGS_CATEGORY); - } - - QWidget *widget() - { - if (!m_widget) - m_widget = new ClangFormatConfigWidget; - return m_widget; - } - - void apply() - { - m_widget->apply(); - } - - void finish() - { - delete m_widget; - } - -private: - QPointer m_widget; -}; - ClangFormatPlugin::ClangFormatPlugin() = default; ClangFormatPlugin::~ClangFormatPlugin() = default; #ifdef KEEP_LINE_BREAKS_FOR_NON_EMPTY_LINES_BACKPORTED -static void disableCppCodeStyle() +class ClangFormatStyleFactory : public CppTools::CppCodeStylePreferencesFactory +{ +public: + QWidget *createCodeStyleEditor(TextEditor::ICodeStylePreferences *, + QWidget *parent = nullptr) override + { + if (!parent) + return new ClangFormatConfigWidget; + return new ClangFormatConfigWidget(SessionManager::startupProject()); + } + + QWidget *createEditor(TextEditor::ICodeStylePreferences *, QWidget *) const override + { + return nullptr; + } + + TextEditor::Indenter *createIndenter() const override + { + return new ClangFormatIndenter(); + } +}; + +static void replaceCppCodeStyle() { using namespace TextEditor; TextEditorSettings::unregisterCodeStyleFactory(CppTools::Constants::CPP_SETTINGS_ID); - TextEditorSettings::unregisterCodeStylePool(CppTools::Constants::CPP_SETTINGS_ID); - TextEditorSettings::unregisterCodeStyle(CppTools::Constants::CPP_SETTINGS_ID); - - QList pages = Core::IOptionsPage::allOptionsPages(); - int codeStylePageIndex = Utils::indexOf(pages, [](Core::IOptionsPage *page) { - return page->id() == CppTools::Constants::CPP_CODE_STYLE_SETTINGS_ID; - }); - if (codeStylePageIndex >= 0) { - auto *page = pages[codeStylePageIndex]; - page->finish(); - page->deleteLater(); - } + ICodeStylePreferencesFactory *factory = new ClangFormatStyleFactory(); + TextEditorSettings::registerCodeStyleFactory(factory); } #endif @@ -124,21 +104,7 @@ bool ClangFormatPlugin::initialize(const QStringList &arguments, QString *errorS Q_UNUSED(arguments); Q_UNUSED(errorString); #ifdef KEEP_LINE_BREAKS_FOR_NON_EMPTY_LINES_BACKPORTED - m_optionsPage = std::make_unique(); - - auto panelFactory = new ProjectPanelFactory(); - panelFactory->setPriority(120); - panelFactory->setDisplayName(tr("Clang Format")); - panelFactory->setCreateWidgetFunction([](Project *project) { - return new ClangFormatConfigWidget(project); - }); - ProjectPanelFactory::registerFactory(panelFactory); - - CppTools::CppModelManager::instance()->setCppIndenterCreator([]() { - return new ClangFormatIndenter(); - }); - - disableCppCodeStyle(); + replaceCppCodeStyle(); #endif return true; } diff --git a/src/plugins/clangformat/clangformatplugin.h b/src/plugins/clangformat/clangformatplugin.h index 00b59cd950e..e8c81179a00 100644 --- a/src/plugins/clangformat/clangformatplugin.h +++ b/src/plugins/clangformat/clangformatplugin.h @@ -27,12 +27,8 @@ #include -#include - namespace ClangFormat { -class ClangFormatOptionsPage; - class ClangFormatPlugin : public ExtensionSystem::IPlugin { Q_OBJECT @@ -45,8 +41,6 @@ public: private: bool initialize(const QStringList &arguments, QString *errorString) final; void extensionsInitialized() final {} - - std::unique_ptr m_optionsPage; }; } // namespace ClangTools diff --git a/src/plugins/cppeditor/cppeditordocument.cpp b/src/plugins/cppeditor/cppeditordocument.cpp index 06f0b186a3e..1a6912c0483 100644 --- a/src/plugins/cppeditor/cppeditordocument.cpp +++ b/src/plugins/cppeditor/cppeditordocument.cpp @@ -43,6 +43,9 @@ #include +#include +#include + #include #include #include @@ -59,6 +62,8 @@ CppTools::CppModelManager *mm() } // anonymous namespace +using namespace TextEditor; + namespace CppEditor { namespace Internal { @@ -103,7 +108,10 @@ CppEditorDocument::CppEditorDocument() { setId(CppEditor::Constants::CPPEDITOR_ID); setSyntaxHighlighter(new CppHighlighter); - setIndenter(CppTools::CppModelManager::instance()->createCppIndenter()); + + ICodeStylePreferencesFactory *factory + = TextEditorSettings::codeStyleFactory(CppTools::Constants::CPP_SETTINGS_ID); + setIndenter(factory->createIndenter()); connect(this, &TextEditor::TextDocument::tabSettingsChanged, this, &CppEditorDocument::invalidateFormatterCache); diff --git a/src/plugins/cpptools/cppcodestylepreferencesfactory.h b/src/plugins/cpptools/cppcodestylepreferencesfactory.h index 10715a12193..13d602a08df 100644 --- a/src/plugins/cpptools/cppcodestylepreferencesfactory.h +++ b/src/plugins/cpptools/cppcodestylepreferencesfactory.h @@ -25,11 +25,13 @@ #pragma once +#include "cpptools_global.h" + #include namespace CppTools { -class CppCodeStylePreferencesFactory : public TextEditor::ICodeStylePreferencesFactory +class CPPTOOLS_EXPORT CppCodeStylePreferencesFactory : public TextEditor::ICodeStylePreferencesFactory { public: CppCodeStylePreferencesFactory(); diff --git a/src/plugins/cpptools/cppcodestylesettingspage.cpp b/src/plugins/cpptools/cppcodestylesettingspage.cpp index dc5237efc04..26a0edaa6fb 100644 --- a/src/plugins/cpptools/cppcodestylesettingspage.cpp +++ b/src/plugins/cpptools/cppcodestylesettingspage.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -523,16 +524,19 @@ CppCodeStyleSettingsPage::CppCodeStyleSettingsPage(QWidget *parent) : QWidget *CppCodeStyleSettingsPage::widget() { if (!m_widget) { - CppCodeStylePreferences *originalCodeStylePreferences - = CppToolsSettings::instance()->cppCodeStyle(); - m_pageCppCodeStylePreferences = new CppCodeStylePreferences(m_widget); - m_pageCppCodeStylePreferences->setDelegatingPool(originalCodeStylePreferences->delegatingPool()); - m_pageCppCodeStylePreferences->setCodeStyleSettings(originalCodeStylePreferences->codeStyleSettings()); - m_pageCppCodeStylePreferences->setCurrentDelegate(originalCodeStylePreferences->currentDelegate()); + CppCodeStylePreferences *originalCodeStylePreferences = CppToolsSettings::instance() + ->cppCodeStyle(); + m_pageCppCodeStylePreferences = new CppCodeStylePreferences(); + m_pageCppCodeStylePreferences->setDelegatingPool( + originalCodeStylePreferences->delegatingPool()); + m_pageCppCodeStylePreferences->setCodeStyleSettings( + originalCodeStylePreferences->codeStyleSettings()); + m_pageCppCodeStylePreferences->setCurrentDelegate( + originalCodeStylePreferences->currentDelegate()); // we set id so that it won't be possible to set delegate to the original prefs m_pageCppCodeStylePreferences->setId(originalCodeStylePreferences->id()); - m_widget = new CodeStyleEditor(TextEditorSettings::codeStyleFactory(CppTools::Constants::CPP_SETTINGS_ID), - m_pageCppCodeStylePreferences); + m_widget = TextEditorSettings::codeStyleFactory(CppTools::Constants::CPP_SETTINGS_ID) + ->createCodeStyleEditor(m_pageCppCodeStylePreferences); } return m_widget; } diff --git a/src/plugins/cpptools/cppcodestylesettingspage.h b/src/plugins/cpptools/cppcodestylesettingspage.h index 9a294b0a27b..9f29d783ba3 100644 --- a/src/plugins/cpptools/cppcodestylesettingspage.h +++ b/src/plugins/cpptools/cppcodestylesettingspage.h @@ -91,7 +91,7 @@ public: private: CppCodeStylePreferences *m_pageCppCodeStylePreferences; - QPointer m_widget; + QPointer m_widget; }; } // namespace Internal diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 10fbbcf11e9..514b2d62230 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -39,7 +39,6 @@ #include "cpplocatordata.h" #include "cpplocatorfilter.h" #include "cppbuiltinmodelmanagersupport.h" -#include "cppqtstyleindenter.h" #include "cpprefactoringchanges.h" #include "cpprefactoringengine.h" #include "cppsourceprocessor.h" @@ -510,7 +509,6 @@ void CppModelManager::initializeBuiltinModelManagerSupport() CppModelManager::CppModelManager() : CppModelManagerBase(nullptr) - , createCppIndenter([]() { return new CppQtStyleIndenter; }) , d(new CppModelManagerPrivate) { d->m_indexingSupporter = 0; diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h index bafc3b32716..9fcd7169e7e 100644 --- a/src/plugins/cpptools/cppmodelmanager.h +++ b/src/plugins/cpptools/cppmodelmanager.h @@ -215,13 +215,6 @@ public: RefactoringEngineInterface *refactoringEngine); static void removeRefactoringEngine(RefactoringEngineType type); - using CppIndenterCreator = std::function; - void setCppIndenterCreator(CppIndenterCreator indenterCreator) - { - createCppIndenter = std::move(indenterCreator); - } - CppIndenterCreator createCppIndenter; - void setLocatorFilter(std::unique_ptr &&filter); void setClassesFilter(std::unique_ptr &&filter); void setIncludesFilter(std::unique_ptr &&filter); diff --git a/src/plugins/projectexplorer/codestylesettingspropertiespage.cpp b/src/plugins/projectexplorer/codestylesettingspropertiespage.cpp index 3750e6a123a..9410c499316 100644 --- a/src/plugins/projectexplorer/codestylesettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/codestylesettingspropertiespage.cpp @@ -49,8 +49,9 @@ CodeStyleSettingsWidget::CodeStyleSettingsWidget(Project *project) : QWidget(), Core::Id languageId = factory->languageId(); ICodeStylePreferences *codeStylePreferences = config->codeStyle(languageId); - auto preview = new CodeStyleEditor(factory, codeStylePreferences, m_ui.stackedWidget); - preview->clearMargins(); + auto preview = factory->createCodeStyleEditor(codeStylePreferences, m_ui.stackedWidget); + if (preview && preview->layout()) + preview->layout()->setContentsMargins(QMargins()); m_ui.stackedWidget->addWidget(preview); m_ui.languageComboBox->addItem(factory->displayName()); } diff --git a/src/plugins/texteditor/codestyleeditor.cpp b/src/plugins/texteditor/codestyleeditor.cpp index 526ee106d61..cbf74c0a124 100644 --- a/src/plugins/texteditor/codestyleeditor.cpp +++ b/src/plugins/texteditor/codestyleeditor.cpp @@ -79,11 +79,6 @@ CodeStyleEditor::CodeStyleEditor(ICodeStylePreferencesFactory *factory, updatePreview(); } -void CodeStyleEditor::clearMargins() -{ - m_layout->setContentsMargins(QMargins()); -} - void CodeStyleEditor::updatePreview() { QTextDocument *doc = m_preview->document(); diff --git a/src/plugins/texteditor/codestyleeditor.h b/src/plugins/texteditor/codestyleeditor.h index b90752252e7..edd04db1719 100644 --- a/src/plugins/texteditor/codestyleeditor.h +++ b/src/plugins/texteditor/codestyleeditor.h @@ -46,8 +46,6 @@ public: CodeStyleEditor(ICodeStylePreferencesFactory *factory, ICodeStylePreferences *codeStyle, QWidget *parent = nullptr); - void clearMargins(); - private: void updatePreview(); diff --git a/src/plugins/texteditor/icodestylepreferencesfactory.cpp b/src/plugins/texteditor/icodestylepreferencesfactory.cpp index d37a9991292..245d9b695c1 100644 --- a/src/plugins/texteditor/icodestylepreferencesfactory.cpp +++ b/src/plugins/texteditor/icodestylepreferencesfactory.cpp @@ -25,6 +25,8 @@ #include "icodestylepreferencesfactory.h" +#include "codestyleeditor.h" + using namespace TextEditor; ICodeStylePreferencesFactory::ICodeStylePreferencesFactory(QObject *parent) : @@ -32,3 +34,8 @@ ICodeStylePreferencesFactory::ICodeStylePreferencesFactory(QObject *parent) : { } +QWidget *ICodeStylePreferencesFactory::createCodeStyleEditor(ICodeStylePreferences *codeStyle, + QWidget *parent) +{ + return new CodeStyleEditor(this, codeStyle, parent); +} diff --git a/src/plugins/texteditor/icodestylepreferencesfactory.h b/src/plugins/texteditor/icodestylepreferencesfactory.h index 8fbc49e036b..43cc6edffdb 100644 --- a/src/plugins/texteditor/icodestylepreferencesfactory.h +++ b/src/plugins/texteditor/icodestylepreferencesfactory.h @@ -42,6 +42,8 @@ class TEXTEDITOR_EXPORT ICodeStylePreferencesFactory : public QObject public: explicit ICodeStylePreferencesFactory(QObject *parent = nullptr); + virtual QWidget *createCodeStyleEditor(ICodeStylePreferences *codeStyle, + QWidget *parent = nullptr); virtual Core::Id languageId() = 0; virtual QString displayName() = 0; virtual ICodeStylePreferences *createCodeStyle() const = 0;