From 3c5520efaa32e6921e03a5495cce44b56872c508 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 15 Nov 2023 15:19:51 +0100 Subject: [PATCH] ProjectExplorer: Let ProjectPanelFactories auto-register Change-Id: Iaca1438f1199c2dd112b61a8ff74f4707867e7c5 Reviewed-by: Christian Stenger --- .../autotest/projectsettingswidget.cpp | 1 - .../axivion/axivionprojectsettings.cpp | 1 - .../clangtoolsprojectsettingswidget.cpp | 6 ++-- src/plugins/copilot/copilotprojectpanel.cpp | 1 - .../cppeditor/cppcodemodelsettingspage.cpp | 1 - src/plugins/cppeditor/cppfilesettingspage.cpp | 1 - .../cppquickfixprojectsettingswidget.cpp | 1 - src/plugins/gitlab/gitlabprojectsettings.cpp | 1 - .../languageclient/languageclientsettings.cpp | 1 - .../codestylesettingspropertiespage.cpp | 1 - .../projectexplorer/dependenciespanel.cpp | 1 - .../editorsettingspropertiespage.cpp | 1 - .../projectcommentssettings.cpp | 1 - .../projectexplorer/projectexplorer.cpp | 1 - .../projectexplorer/projectpanelfactory.cpp | 28 ++++++++++--------- .../projectexplorer/projectpanelfactory.h | 4 --- .../todo/todoprojectsettingswidget.cpp | 1 - 17 files changed, 18 insertions(+), 34 deletions(-) diff --git a/src/plugins/autotest/projectsettingswidget.cpp b/src/plugins/autotest/projectsettingswidget.cpp index 84b3b612f64..e82d9e90201 100644 --- a/src/plugins/autotest/projectsettingswidget.cpp +++ b/src/plugins/autotest/projectsettingswidget.cpp @@ -162,7 +162,6 @@ public: setCreateWidgetFunction([](Project *project) { return new ProjectTestSettingsWidget(project); }); - ProjectPanelFactory::registerFactory(this); } }; diff --git a/src/plugins/axivion/axivionprojectsettings.cpp b/src/plugins/axivion/axivionprojectsettings.cpp index 659933c3bf0..a06a411aad8 100644 --- a/src/plugins/axivion/axivionprojectsettings.cpp +++ b/src/plugins/axivion/axivionprojectsettings.cpp @@ -259,7 +259,6 @@ public: setCreateWidgetFunction([](ProjectExplorer::Project *project) { return new AxivionProjectSettingsWidget(project); }); - ProjectExplorer::ProjectPanelFactory::registerFactory(this); } }; diff --git a/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp b/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp index 0012668dd61..81db07183d0 100644 --- a/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp +++ b/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp @@ -251,9 +251,9 @@ public: setPriority(100); setId(Constants::PROJECT_PANEL_ID); setDisplayName(Tr::tr("Clang Tools")); - setCreateWidgetFunction( - [](Project *project) { return new ClangToolsProjectSettingsWidget(project); }); - ProjectPanelFactory::registerFactory(this); + setCreateWidgetFunction([](Project *project) { + return new ClangToolsProjectSettingsWidget(project); + }); } }; diff --git a/src/plugins/copilot/copilotprojectpanel.cpp b/src/plugins/copilot/copilotprojectpanel.cpp index 5b570a0de26..12aa5ad2c5d 100644 --- a/src/plugins/copilot/copilotprojectpanel.cpp +++ b/src/plugins/copilot/copilotprojectpanel.cpp @@ -65,7 +65,6 @@ public: setPriority(1000); setDisplayName(Tr::tr("Copilot")); setCreateWidgetFunction(&createCopilotProjectPanel); - ProjectPanelFactory::registerFactory(this); } }; diff --git a/src/plugins/cppeditor/cppcodemodelsettingspage.cpp b/src/plugins/cppeditor/cppcodemodelsettingspage.cpp index 8b494d0b4bf..8bd2ce1eae2 100644 --- a/src/plugins/cppeditor/cppcodemodelsettingspage.cpp +++ b/src/plugins/cppeditor/cppcodemodelsettingspage.cpp @@ -637,7 +637,6 @@ public: setCreateWidgetFunction([](Project *project) { return new ClangdProjectSettingsWidget(project); }); - ProjectPanelFactory::registerFactory(this); } }; diff --git a/src/plugins/cppeditor/cppfilesettingspage.cpp b/src/plugins/cppeditor/cppfilesettingspage.cpp index 84d874ca87b..878879a8a74 100644 --- a/src/plugins/cppeditor/cppfilesettingspage.cpp +++ b/src/plugins/cppeditor/cppfilesettingspage.cpp @@ -597,7 +597,6 @@ public: setCreateWidgetFunction([](Project *project) { return new CppFileSettingsForProjectWidget(project); }); - ProjectPanelFactory::registerFactory(this); } }; diff --git a/src/plugins/cppeditor/cppquickfixprojectsettingswidget.cpp b/src/plugins/cppeditor/cppquickfixprojectsettingswidget.cpp index 80866402b90..feb9777e45b 100644 --- a/src/plugins/cppeditor/cppquickfixprojectsettingswidget.cpp +++ b/src/plugins/cppeditor/cppquickfixprojectsettingswidget.cpp @@ -115,7 +115,6 @@ public: setCreateWidgetFunction([](Project *project) { return new CppQuickFixProjectSettingsWidget(project); }); - ProjectPanelFactory::registerFactory(this); } }; diff --git a/src/plugins/gitlab/gitlabprojectsettings.cpp b/src/plugins/gitlab/gitlabprojectsettings.cpp index 6b4a09c0ade..a4e5a30850d 100644 --- a/src/plugins/gitlab/gitlabprojectsettings.cpp +++ b/src/plugins/gitlab/gitlabprojectsettings.cpp @@ -339,7 +339,6 @@ public: setCreateWidgetFunction([](ProjectExplorer::Project *project) { return new GitLabProjectSettingsWidget(project); }); - ProjectExplorer::ProjectPanelFactory::registerFactory(this); } }; diff --git a/src/plugins/languageclient/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp index 0aeb2fc8d4b..a9fc9ebf6e9 100644 --- a/src/plugins/languageclient/languageclientsettings.cpp +++ b/src/plugins/languageclient/languageclientsettings.cpp @@ -1151,7 +1151,6 @@ public: setCreateWidgetFunction([](Project *project) { return new LanguageClientProjectSettingsWidget(project); }); - ProjectPanelFactory::registerFactory(this); } }; diff --git a/src/plugins/projectexplorer/codestylesettingspropertiespage.cpp b/src/plugins/projectexplorer/codestylesettingspropertiespage.cpp index 6f3f4761241..ed859e84337 100644 --- a/src/plugins/projectexplorer/codestylesettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/codestylesettingspropertiespage.cpp @@ -70,7 +70,6 @@ public: setPriority(40); setDisplayName(Tr::tr("Code Style")); setCreateWidgetFunction([](Project *project) { return new CodeStyleSettingsWidget(project); }); - ProjectPanelFactory::registerFactory(this); } }; diff --git a/src/plugins/projectexplorer/dependenciespanel.cpp b/src/plugins/projectexplorer/dependenciespanel.cpp index 1e9f2c1d0c2..3ca788eaf88 100644 --- a/src/plugins/projectexplorer/dependenciespanel.cpp +++ b/src/plugins/projectexplorer/dependenciespanel.cpp @@ -271,7 +271,6 @@ public: setPriority(50); setDisplayName(Tr::tr("Dependencies")); setCreateWidgetFunction([](Project *project) { return new DependenciesWidget(project); }); - ProjectPanelFactory::registerFactory(this); } }; diff --git a/src/plugins/projectexplorer/editorsettingspropertiespage.cpp b/src/plugins/projectexplorer/editorsettingspropertiespage.cpp index 96deedfd625..ba0e4936f91 100644 --- a/src/plugins/projectexplorer/editorsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/editorsettingspropertiespage.cpp @@ -167,7 +167,6 @@ public: setPriority(30); setDisplayName(Tr::tr("Editor")); setCreateWidgetFunction([](Project *project) { return new EditorSettingsWidget(project); }); - ProjectPanelFactory::registerFactory(this); } }; diff --git a/src/plugins/projectexplorer/projectcommentssettings.cpp b/src/plugins/projectexplorer/projectcommentssettings.cpp index 1858f96213e..00175fbb6cc 100644 --- a/src/plugins/projectexplorer/projectcommentssettings.cpp +++ b/src/plugins/projectexplorer/projectcommentssettings.cpp @@ -142,7 +142,6 @@ public: TextEditor::TextEditorSettings::setCommentsSettingsRetriever([](const FilePath &filePath) { return ProjectCommentsSettings(ProjectManager::projectForFile(filePath)).settings(); }); - ProjectPanelFactory::registerFactory(this); } }; diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 4f8c6b9ba77..f2143cc1549 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -411,7 +411,6 @@ public: setCreateWidgetFunction([](Project *project) { return new ProjectEnvironmentWidget(project); }); - ProjectPanelFactory::registerFactory(this); } }; diff --git a/src/plugins/projectexplorer/projectpanelfactory.cpp b/src/plugins/projectexplorer/projectpanelfactory.cpp index 4a4881e3f8c..4eff3d1ed67 100644 --- a/src/plugins/projectexplorer/projectpanelfactory.cpp +++ b/src/plugins/projectexplorer/projectpanelfactory.cpp @@ -4,6 +4,7 @@ #include "projectpanelfactory.h" #include "project.h" +#include "projectsettingswidget.h" #include "projectwindow.h" #include @@ -14,10 +15,14 @@ using namespace Utils; namespace ProjectExplorer { static QList s_factories; +bool s_sorted = false; ProjectPanelFactory::ProjectPanelFactory() : m_supportsFunction([] (Project *) { return true; }) -{ } +{ + s_factories.append(this); + s_sorted = false; +} int ProjectPanelFactory::priority() const { @@ -39,27 +44,24 @@ void ProjectPanelFactory::setDisplayName(const QString &name) m_displayName = name; } -void ProjectPanelFactory::registerFactory(ProjectPanelFactory *factory) -{ - auto it = std::lower_bound(s_factories.begin(), s_factories.end(), factory, - [](ProjectPanelFactory *a, ProjectPanelFactory *b) { - return (a->priority() == b->priority() && a < b) || a->priority() < b->priority(); - }); - - s_factories.insert(it, factory); -} - QList ProjectPanelFactory::factories() { + if (!s_sorted) { + s_sorted = true; + std::sort(s_factories.begin(), s_factories.end(), + [](ProjectPanelFactory *a, ProjectPanelFactory *b) { + return (a->priority() == b->priority() && a < b) || a->priority() < b->priority(); + }); + } return s_factories; } -Utils::Id ProjectPanelFactory::id() const +Id ProjectPanelFactory::id() const { return m_id; } -void ProjectPanelFactory::setId(Utils::Id id) +void ProjectPanelFactory::setId(Id id) { m_id = id; } diff --git a/src/plugins/projectexplorer/projectpanelfactory.h b/src/plugins/projectexplorer/projectpanelfactory.h index 5eb12c2ea34..d09f1dd0c1b 100644 --- a/src/plugins/projectexplorer/projectpanelfactory.h +++ b/src/plugins/projectexplorer/projectpanelfactory.h @@ -15,7 +15,6 @@ namespace ProjectExplorer { class Project; -class ProjectExplorerPlugin; class PROJECTEXPLORER_EXPORT ProjectPanelFactory { @@ -42,9 +41,6 @@ public: using SupportsFunction = std::function; void setSupportsFunction(std::function function); - // This takes ownership. - static void registerFactory(ProjectPanelFactory *factory); - static QList factories(); Utils::TreeItem *createPanelItem(Project *project); diff --git a/src/plugins/todo/todoprojectsettingswidget.cpp b/src/plugins/todo/todoprojectsettingswidget.cpp index 61a4cbc958c..0f438626941 100644 --- a/src/plugins/todo/todoprojectsettingswidget.cpp +++ b/src/plugins/todo/todoprojectsettingswidget.cpp @@ -179,7 +179,6 @@ public: provider, [project, provider] { provider->projectSettingsChanged(project); }); return widget; }); - ProjectPanelFactory::registerFactory(this); } };