diff --git a/src/plugins/projectexplorer/iprojectpanelfactory.cpp b/src/plugins/projectexplorer/iprojectpanelfactory.cpp index aa81b05ccd6..debade23a90 100644 --- a/src/plugins/projectexplorer/iprojectpanelfactory.cpp +++ b/src/plugins/projectexplorer/iprojectpanelfactory.cpp @@ -31,6 +31,8 @@ using namespace ProjectExplorer; +QList IProjectPanelFactory::s_factories; + IProjectPanelFactory::IProjectPanelFactory() : m_priority(0), m_supportsFunction(&supportsAllProjects) @@ -67,6 +69,17 @@ bool IProjectPanelFactory::supportsAllProjects(Project *) return true; } +void IProjectPanelFactory::registerFactory(IProjectPanelFactory *factory) +{ + auto it = std::lower_bound(s_factories.begin(), s_factories.end(), factory, &IProjectPanelFactory::prioritySort); + s_factories.insert(it, factory); +} + +QList IProjectPanelFactory::factories() +{ + return s_factories; +} + bool IProjectPanelFactory::supports(Project *project) { return m_supportsFunction(project); diff --git a/src/plugins/projectexplorer/iprojectpanelfactory.h b/src/plugins/projectexplorer/iprojectpanelfactory.h index 20f84dc81d9..cf061be5611 100644 --- a/src/plugins/projectexplorer/iprojectpanelfactory.h +++ b/src/plugins/projectexplorer/iprojectpanelfactory.h @@ -34,7 +34,6 @@ #include "propertiespanel.h" #include "panelswidget.h" -#include #include #include @@ -44,9 +43,8 @@ namespace ProjectExplorer { class Project; class Target; -class PROJECTEXPLORER_EXPORT IProjectPanelFactory : public QObject +class PROJECTEXPLORER_EXPORT IProjectPanelFactory { - Q_OBJECT public: IProjectPanelFactory(); // simple properties @@ -93,11 +91,16 @@ public: static bool supportsAllProjects(Project *); + static void registerFactory(IProjectPanelFactory *factory); + + static QList factories(); + private: int m_priority; QString m_displayName; std::function m_supportsFunction; std::function m_createWidgetFunction; + static QList s_factories; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 84f7da59963..4ccc56801a2 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -321,6 +321,7 @@ ProjectExplorerPlugin::~ProjectExplorerPlugin() // Force sequence of deletion: delete d->m_kitManager; // remove all the profile informations delete d->m_toolChainManager; + qDeleteAll(IProjectPanelFactory::s_factories); delete d; } @@ -476,7 +477,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er editorSettingsPanelFactory->setDisplayName(displayName); QIcon icon = QIcon(QLatin1String(":/projectexplorer/images/EditorSettings.png")); editorSettingsPanelFactory->setSimpleCreateWidgetFunction(icon); - addAutoReleasedObject(editorSettingsPanelFactory); + IProjectPanelFactory::registerFactory(editorSettingsPanelFactory); auto codeStyleSettingsPanelFactory = new IProjectPanelFactory; codeStyleSettingsPanelFactory->setPriority(40); @@ -484,7 +485,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er codeStyleSettingsPanelFactory->setDisplayName(displayName); icon = QIcon(QLatin1String(":/projectexplorer/images/CodeStyleSettings.png")); codeStyleSettingsPanelFactory->setSimpleCreateWidgetFunction(icon); - addAutoReleasedObject(codeStyleSettingsPanelFactory); + IProjectPanelFactory::registerFactory(codeStyleSettingsPanelFactory); auto dependenciesPanelFactory = new IProjectPanelFactory; dependenciesPanelFactory->setPriority(50); @@ -492,7 +493,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er dependenciesPanelFactory->setDisplayName(displayName); icon = QIcon(QLatin1String(":/projectexplorer/images/ProjectDependencies.png")); dependenciesPanelFactory->setSimpleCreateWidgetFunction(icon); - addAutoReleasedObject(dependenciesPanelFactory); + IProjectPanelFactory::registerFactory(dependenciesPanelFactory); auto unconfiguredProjectPanel = new IProjectPanelFactory; unconfiguredProjectPanel->setPriority(-10); @@ -502,7 +503,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er }); icon = QIcon(QLatin1String(":/projectexplorer/images/unconfigured.png")); unconfiguredProjectPanel->setSimpleCreateWidgetFunction(icon); - addAutoReleasedObject(unconfiguredProjectPanel); + IProjectPanelFactory::registerFactory(unconfiguredProjectPanel); auto targetSettingsPanelFactory = new IProjectPanelFactory; targetSettingsPanelFactory->setPriority(-10); @@ -515,7 +516,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er targetSettingsPanelFactory->setCreateWidgetFunction([](Project *project) { return new TargetSettingsPanelWidget(project); }); - addAutoReleasedObject(targetSettingsPanelFactory); + IProjectPanelFactory::registerFactory(targetSettingsPanelFactory); addAutoReleasedObject(new ProcessStepFactory); diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp index 1fd136f1960..4e2a460976a 100644 --- a/src/plugins/projectexplorer/projectwindow.cpp +++ b/src/plugins/projectexplorer/projectwindow.cpp @@ -120,10 +120,8 @@ void ProjectWindow::projectUpdated(Project *p) QStringList ProjectWindow::tabDisplayNamesFor(Project *project) { - QList factories = ExtensionSystem::PluginManager::getObjects(); - Utils::sort(factories, &IProjectPanelFactory::prioritySort); QStringList subTabs; - foreach (IProjectPanelFactory *panelFactory, factories) { + foreach (IProjectPanelFactory *panelFactory, IProjectPanelFactory::factories()) { if (panelFactory->supports(project)) subTabs << panelFactory->displayName(); } @@ -218,9 +216,7 @@ void ProjectWindow::showProperties(int index, int subIndex) int pos = 0; IProjectPanelFactory *fac = 0; - QList factories = ExtensionSystem::PluginManager::getObjects(); - Utils::sort(factories, &IProjectPanelFactory::prioritySort); - foreach (IProjectPanelFactory *panelFactory, factories) { + foreach (IProjectPanelFactory *panelFactory, IProjectPanelFactory::factories()) { if (panelFactory->supports(project)) { if (subIndex == pos) { fac = panelFactory;