forked from qt-creator/qt-creator
ProjectExplorerPlugin: Remove remaining used of global object pool
By moving ownership of the respective objects to the pre-existing private class by making them full members, following the general pattern used in the other plugins. Change-Id: Ifea639b68f25f0cbcb06230dc71a16d1dd3ae5ac Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
@@ -107,6 +107,7 @@ private:
|
||||
|
||||
friend class Internal::DeviceManagerPrivate;
|
||||
friend class ProjectExplorerPlugin;
|
||||
friend class ProjectExplorerPluginPrivate;
|
||||
};
|
||||
|
||||
} // namespace ProjectExplorer
|
||||
|
@@ -258,6 +258,21 @@ static bool isTextFile(const QString &fileName)
|
||||
TextEditor::Constants::C_TEXTEDITOR_MIMETYPE_TEXT);
|
||||
}
|
||||
|
||||
class ProjectsMode : public IMode
|
||||
{
|
||||
public:
|
||||
ProjectsMode()
|
||||
{
|
||||
setContext(Context(Constants::C_PROJECTEXPLORER));
|
||||
setDisplayName(QCoreApplication::translate("ProjectExplorer::ProjectsMode", "Projects"));
|
||||
setIcon(Utils::Icon::modeIcon(Icons::MODE_PROJECT_CLASSIC,
|
||||
Icons::MODE_PROJECT_FLAT, Icons::MODE_PROJECT_FLAT_ACTIVE));
|
||||
setPriority(Constants::P_MODE_SESSION);
|
||||
setId(Constants::MODE_SESSION);
|
||||
setContextHelpId(QLatin1String("Managing Projects"));
|
||||
}
|
||||
};
|
||||
|
||||
class ProjectExplorerPluginPrivate : public QObject
|
||||
{
|
||||
Q_DECLARE_TR_FUNCTIONS(ProjectExplorer::ProjectExplorerPlugin)
|
||||
@@ -399,7 +414,6 @@ public:
|
||||
QString m_sessionToRestoreAtStartup;
|
||||
|
||||
QStringList m_profileMimeTypes;
|
||||
AppOutputPane *m_outputPane = nullptr;
|
||||
int m_activeRunControlCount = 0;
|
||||
int m_shutdownWatchDogId = -1;
|
||||
|
||||
@@ -416,33 +430,76 @@ public:
|
||||
bool m_shouldHaveRunConfiguration = false;
|
||||
bool m_shuttingDown = false;
|
||||
Core::Id m_runMode = Constants::NO_RUN_MODE;
|
||||
ProjectWelcomePage *m_welcomePage = nullptr;
|
||||
IMode *m_projectsMode = nullptr;
|
||||
|
||||
TaskHub *m_taskHub = nullptr;
|
||||
KitManager *m_kitManager = nullptr;
|
||||
ToolChainManager *m_toolChainManager = nullptr;
|
||||
QStringList m_arguments;
|
||||
|
||||
#ifdef WITH_JOURNALD
|
||||
JournaldWatcher *m_journalWatcher = nullptr;
|
||||
JournaldWatcher m_journalWatcher;
|
||||
#endif
|
||||
QThreadPool m_threadPool;
|
||||
};
|
||||
|
||||
class ProjectsMode : public IMode
|
||||
{
|
||||
public:
|
||||
ProjectsMode(QWidget *proWindow)
|
||||
{
|
||||
setWidget(proWindow);
|
||||
setContext(Context(Constants::C_PROJECTEXPLORER));
|
||||
setDisplayName(QCoreApplication::translate("ProjectExplorer::ProjectsMode", "Projects"));
|
||||
setIcon(Utils::Icon::modeIcon(Icons::MODE_PROJECT_CLASSIC,
|
||||
Icons::MODE_PROJECT_FLAT, Icons::MODE_PROJECT_FLAT_ACTIVE));
|
||||
setPriority(Constants::P_MODE_SESSION);
|
||||
setId(Constants::MODE_SESSION);
|
||||
setContextHelpId(QLatin1String("Managing Projects"));
|
||||
}
|
||||
DeviceManager m_deviceManager{true};
|
||||
|
||||
#ifdef Q_OS_WINDOWS
|
||||
WinDebugInterface m_winDebugInterface;
|
||||
MsvcToolChainFactory m_mscvToolChainFactory;
|
||||
#else
|
||||
LinuxIccToolChainFactory m_linuxToolChainFactory;
|
||||
#endif
|
||||
|
||||
#ifndef Q_OS_MACOS
|
||||
MingwToolChainFactory m_mingwToolChainFactory; // Mingw offers cross-compiling to windows
|
||||
#endif
|
||||
|
||||
GccToolChainFactory m_gccToolChainFactory;
|
||||
ClangToolChainFactory m_clangToolChainFactory;
|
||||
CustomToolChainFactory m_customToolChainFactory;
|
||||
|
||||
DesktopDeviceFactory m_desktopDeviceFactory;
|
||||
|
||||
ToolChainOptionsPage m_toolChainOptionsPage;
|
||||
KitOptionsPage m_kitOptionsPage;
|
||||
|
||||
TaskHub m_taskHub;
|
||||
|
||||
ProjectWelcomePage m_welcomePage;
|
||||
|
||||
CustomWizardMetaFactory<CustomProjectWizard> m_customProjectWizard{IWizardFactory::ProjectWizard};
|
||||
CustomWizardMetaFactory<CustomWizard> m_fileWizard{IWizardFactory::FileWizard};
|
||||
|
||||
ProjectsMode m_projectsMode;
|
||||
|
||||
CopyTaskHandler m_copyTaskHandler;
|
||||
ShowInEditorTaskHandler m_showInEditorTaskHandler;
|
||||
VcsAnnotateTaskHandler m_vcsAnnotateTaskHandler;
|
||||
RemoveTaskHandler m_removeTaskHandler;
|
||||
ConfigTaskHandler m_configTaskHandler{Task::compilerMissingTask(), Constants::KITS_SETTINGS_PAGE_ID};
|
||||
|
||||
AppOutputPane m_outputPane;
|
||||
|
||||
AllProjectsFilter m_allProjectsFilter;
|
||||
CurrentProjectFilter m_currentProjectFilter;
|
||||
|
||||
ProcessStepFactory m_processStepFactory;
|
||||
|
||||
AllProjectsFind m_allProjectsFind;
|
||||
CurrentProjectFind m_curretProjectFind;
|
||||
|
||||
CustomExecutableRunConfigurationFactory m_customExecutableRunConfigFactory;
|
||||
|
||||
ProjectFileWizardExtension m_projectFileWizardExtension;
|
||||
|
||||
// Settings pages
|
||||
ProjectExplorerSettingsPage m_projectExplorerSettingsPage;
|
||||
DeviceSettingsPage m_deviceSettingsPage;
|
||||
|
||||
ProjectTreeWidgetFactory m_projectTreeFactory;
|
||||
FolderNavigationWidgetFactory m_folderNavigationWidgetFactory;
|
||||
DefaultDeployConfigurationFactory m_defaultDeployConfigFactory;
|
||||
|
||||
IDocumentFactory m_documentFactory;
|
||||
};
|
||||
|
||||
static ProjectExplorerPlugin *m_instance = nullptr;
|
||||
@@ -451,7 +508,6 @@ static ProjectExplorerPluginPrivate *dd = nullptr;
|
||||
ProjectExplorerPlugin::ProjectExplorerPlugin()
|
||||
{
|
||||
m_instance = this;
|
||||
dd = new ProjectExplorerPluginPrivate;
|
||||
}
|
||||
|
||||
ProjectExplorerPlugin::~ProjectExplorerPlugin()
|
||||
@@ -462,9 +518,6 @@ ProjectExplorerPlugin::~ProjectExplorerPlugin()
|
||||
// Force sequence of deletion:
|
||||
delete dd->m_kitManager; // remove all the profile information
|
||||
delete dd->m_toolChainManager;
|
||||
#ifdef WITH_JOURNALD
|
||||
delete dd->m_journalWatcher;
|
||||
#endif
|
||||
ProjectPanelFactory::destroyFactories();
|
||||
delete dd;
|
||||
}
|
||||
@@ -478,33 +531,14 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
|
||||
{
|
||||
Q_UNUSED(error);
|
||||
|
||||
dd = new ProjectExplorerPluginPrivate;
|
||||
|
||||
qRegisterMetaType<ProjectExplorer::RunControl *>();
|
||||
qRegisterMetaType<ProjectExplorer::DeployableFile>("ProjectExplorer::DeployableFile");
|
||||
|
||||
CustomWizard::setVerbose(arguments.count(QLatin1String("-customwizard-verbose")));
|
||||
JsonWizardFactory::setVerbose(arguments.count(QLatin1String("-customwizard-verbose")));
|
||||
|
||||
addAutoReleasedObject(new DeviceManager);
|
||||
|
||||
#ifdef WITH_JOURNALD
|
||||
dd->m_journalWatcher = new JournaldWatcher;
|
||||
#endif
|
||||
|
||||
// Add ToolChainFactories:
|
||||
if (Utils::HostOsInfo::isWindowsHost()) {
|
||||
addAutoReleasedObject(new WinDebugInterface);
|
||||
addAutoReleasedObject(new MsvcToolChainFactory);
|
||||
} else {
|
||||
addAutoReleasedObject(new LinuxIccToolChainFactory);
|
||||
}
|
||||
if (!Utils::HostOsInfo::isMacHost())
|
||||
addAutoReleasedObject(new MingwToolChainFactory); // Mingw offers cross-compiling to windows
|
||||
addAutoReleasedObject(new GccToolChainFactory);
|
||||
addAutoReleasedObject(new ClangToolChainFactory);
|
||||
addAutoReleasedObject(new CustomToolChainFactory);
|
||||
|
||||
addAutoReleasedObject(new DesktopDeviceFactory);
|
||||
|
||||
dd->m_kitManager = new KitManager; // register before ToolChainManager
|
||||
dd->m_toolChainManager = new ToolChainManager;
|
||||
|
||||
@@ -521,11 +555,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
|
||||
KitManager::registerKitInformation(new SysRootKitInformation);
|
||||
KitManager::registerKitInformation(new EnvironmentKitInformation);
|
||||
|
||||
addAutoReleasedObject(new ToolChainOptionsPage);
|
||||
addAutoReleasedObject(new KitOptionsPage);
|
||||
|
||||
addAutoReleasedObject(new TaskHub);
|
||||
|
||||
IWizardFactory::registerFactoryCreator([]() -> QList<IWizardFactory *> {
|
||||
QList<IWizardFactory *> result;
|
||||
result << CustomWizard::createWizards();
|
||||
@@ -533,8 +562,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
|
||||
return result;
|
||||
});
|
||||
|
||||
dd->m_welcomePage = new ProjectWelcomePage;
|
||||
connect(dd->m_welcomePage, &ProjectWelcomePage::manageSessions,
|
||||
connect(&dd->m_welcomePage, &ProjectWelcomePage::manageSessions,
|
||||
dd, &ProjectExplorerPluginPrivate::showSessionManager);
|
||||
|
||||
auto sessionManager = new SessionManager(this);
|
||||
@@ -572,9 +600,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
|
||||
: Utils::FileName());
|
||||
});
|
||||
|
||||
addAutoReleasedObject(new CustomWizardMetaFactory<CustomProjectWizard>(IWizardFactory::ProjectWizard));
|
||||
addAutoReleasedObject(new CustomWizardMetaFactory<CustomWizard>(IWizardFactory::FileWizard));
|
||||
|
||||
// For JsonWizard:
|
||||
JsonWizardFactory::registerPageFactory(new FieldPageFactory);
|
||||
JsonWizardFactory::registerPageFactory(new FilePageFactory);
|
||||
@@ -589,26 +614,13 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
|
||||
|
||||
Context projecTreeContext(Constants::C_PROJECT_TREE);
|
||||
|
||||
dd->m_projectsMode = new ProjectsMode(dd->m_proWindow);
|
||||
dd->m_projectsMode->setEnabled(false);
|
||||
addAutoReleasedObject(dd->m_projectsMode);
|
||||
|
||||
addAutoReleasedObject(new CopyTaskHandler);
|
||||
addAutoReleasedObject(new ShowInEditorTaskHandler);
|
||||
addAutoReleasedObject(new VcsAnnotateTaskHandler);
|
||||
addAutoReleasedObject(new RemoveTaskHandler);
|
||||
addAutoReleasedObject(new ConfigTaskHandler(Task::compilerMissingTask(),
|
||||
Constants::KITS_SETTINGS_PAGE_ID));
|
||||
dd->m_projectsMode.setWidget(dd->m_proWindow);
|
||||
dd->m_projectsMode.setEnabled(false);
|
||||
|
||||
ICore::addPreCloseListener([]() -> bool { return coreAboutToClose(); });
|
||||
|
||||
dd->m_outputPane = new AppOutputPane;
|
||||
addAutoReleasedObject(dd->m_outputPane);
|
||||
connect(SessionManager::instance(), &SessionManager::projectRemoved,
|
||||
dd->m_outputPane, &AppOutputPane::projectRemoved);
|
||||
|
||||
addAutoReleasedObject(new AllProjectsFilter);
|
||||
addAutoReleasedObject(new CurrentProjectFilter);
|
||||
&dd->m_outputPane, &AppOutputPane::projectRemoved);
|
||||
|
||||
// ProjectPanelFactories
|
||||
auto panelFactory = new ProjectPanelFactory;
|
||||
@@ -632,11 +644,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
|
||||
panelFactory->setCreateWidgetFunction([](Project *project) { return new DependenciesWidget(project); });
|
||||
ProjectPanelFactory::registerFactory(panelFactory);
|
||||
|
||||
addAutoReleasedObject(new ProcessStepFactory);
|
||||
|
||||
addAutoReleasedObject(new AllProjectsFind);
|
||||
addAutoReleasedObject(new CurrentProjectFind);
|
||||
|
||||
auto constraint = [](RunConfiguration *runConfiguration) {
|
||||
const Runnable runnable = runConfiguration->runnable();
|
||||
if (!runnable.is<StandardRunnable>())
|
||||
@@ -650,14 +657,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
|
||||
};
|
||||
RunControl::registerWorker<SimpleTargetRunner>(Constants::NORMAL_RUN_MODE, constraint);
|
||||
|
||||
addAutoReleasedObject(new CustomExecutableRunConfigurationFactory);
|
||||
|
||||
addAutoReleasedObject(new ProjectFileWizardExtension);
|
||||
|
||||
// Settings pages
|
||||
addAutoReleasedObject(new ProjectExplorerSettingsPage);
|
||||
addAutoReleasedObject(new DeviceSettingsPage);
|
||||
|
||||
// context menus
|
||||
ActionContainer *msessionContextMenu =
|
||||
ActionManager::createMenu(Constants::M_SESSIONCONTEXT);
|
||||
@@ -1187,10 +1186,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
|
||||
dd->updateWelcomePage();
|
||||
});
|
||||
|
||||
addAutoReleasedObject(new ProjectTreeWidgetFactory);
|
||||
addAutoReleasedObject(new FolderNavigationWidgetFactory);
|
||||
addAutoReleasedObject(new DefaultDeployConfigurationFactory);
|
||||
|
||||
QSettings *s = ICore::settings();
|
||||
const QStringList fileNames =
|
||||
s->value(QLatin1String("ProjectExplorer/RecentProjects/FileNames")).toStringList();
|
||||
@@ -1600,8 +1595,7 @@ void ProjectExplorerPlugin::extensionsInitialized()
|
||||
const QString filterSeparator = QLatin1String(";;");
|
||||
QStringList filterStrings;
|
||||
|
||||
auto factory = new IDocumentFactory;
|
||||
factory->setOpener([](QString fileName) -> IDocument* {
|
||||
dd->m_documentFactory.setOpener([](QString fileName) {
|
||||
const QFileInfo fi(fileName);
|
||||
if (fi.isDir())
|
||||
fileName = FolderNavigationWidget::projectFilesInDirectory(fi.absoluteFilePath()).value(0, fileName);
|
||||
@@ -1612,17 +1606,15 @@ void ProjectExplorerPlugin::extensionsInitialized()
|
||||
return nullptr;
|
||||
});
|
||||
|
||||
factory->addMimeType(QStringLiteral("inode/directory"));
|
||||
dd->m_documentFactory.addMimeType(QStringLiteral("inode/directory"));
|
||||
for (const QString &mimeType : dd->m_projectCreators.keys()) {
|
||||
factory->addMimeType(mimeType);
|
||||
dd->m_documentFactory.addMimeType(mimeType);
|
||||
Utils::MimeType mime = Utils::mimeTypeForName(mimeType);
|
||||
allGlobPatterns.append(mime.globPatterns());
|
||||
filterStrings.append(mime.filterString());
|
||||
dd->m_profileMimeTypes += mimeType;
|
||||
}
|
||||
|
||||
addAutoReleasedObject(factory);
|
||||
|
||||
QString allProjectsFilter = tr("All Projects");
|
||||
allProjectsFilter += QLatin1String(" (") + allGlobPatterns.join(QLatin1Char(' '))
|
||||
+ QLatin1Char(')');
|
||||
@@ -1655,17 +1647,16 @@ ExtensionSystem::IPlugin::ShutdownFlag ProjectExplorerPlugin::aboutToShutdown()
|
||||
dd, &ProjectExplorerPluginPrivate::currentModeChanged);
|
||||
ProjectTree::aboutToShutDown();
|
||||
SessionManager::closeAllProjects();
|
||||
dd->m_projectsMode = nullptr;
|
||||
|
||||
dd->m_shuttingDown = true;
|
||||
|
||||
// Attempt to synchronously shutdown all run controls.
|
||||
// If that fails, fall back to asynchronous shutdown (Debugger run controls
|
||||
// might shutdown asynchronously).
|
||||
delete dd->m_welcomePage;
|
||||
|
||||
if (dd->m_activeRunControlCount == 0)
|
||||
return SynchronousShutdown;
|
||||
|
||||
dd->m_outputPane->closeTabs(AppOutputPane::CloseTabNoPrompt /* No prompt any more */);
|
||||
dd->m_outputPane.closeTabs(AppOutputPane::CloseTabNoPrompt /* No prompt any more */);
|
||||
dd->m_shutdownWatchDogId = dd->startTimer(10 * 1000); // Make sure we shutdown *somehow*
|
||||
return AsynchronousShutdown;
|
||||
}
|
||||
@@ -1883,7 +1874,7 @@ ProjectExplorerPlugin::OpenProjectResult ProjectExplorerPlugin::openProjects(con
|
||||
|
||||
void ProjectExplorerPluginPrivate::updateWelcomePage()
|
||||
{
|
||||
m_welcomePage->reloadWelcomeScreenData();
|
||||
m_welcomePage.reloadWelcomeScreenData();
|
||||
}
|
||||
|
||||
void ProjectExplorerPluginPrivate::currentModeChanged(Id mode, Id oldMode)
|
||||
@@ -1997,7 +1988,7 @@ void ProjectExplorerPluginPrivate::restoreSession()
|
||||
// update welcome page
|
||||
connect(ModeManager::instance(), &ModeManager::currentModeChanged,
|
||||
dd, &ProjectExplorerPluginPrivate::currentModeChanged);
|
||||
connect(dd->m_welcomePage, &ProjectWelcomePage::requestProject,
|
||||
connect(&dd->m_welcomePage, &ProjectWelcomePage::requestProject,
|
||||
m_instance, &ProjectExplorerPlugin::openProjectWelcomePage);
|
||||
dd->m_arguments = arguments;
|
||||
// delay opening projects from the command line even more
|
||||
@@ -2061,13 +2052,13 @@ void ProjectExplorerPlugin::startRunControl(RunControl *runControl)
|
||||
|
||||
void ProjectExplorerPluginPrivate::startRunControl(RunControl *runControl)
|
||||
{
|
||||
m_outputPane->createNewOutputWindow(runControl);
|
||||
m_outputPane->flash(); // one flash for starting
|
||||
m_outputPane->showTabFor(runControl);
|
||||
m_outputPane.createNewOutputWindow(runControl);
|
||||
m_outputPane.flash(); // one flash for starting
|
||||
m_outputPane.showTabFor(runControl);
|
||||
Core::Id runMode = runControl->runMode();
|
||||
bool popup = (runMode == Constants::NORMAL_RUN_MODE && dd->m_projectExplorerSettings.showRunOutput)
|
||||
|| (runMode == Constants::DEBUG_RUN_MODE && m_projectExplorerSettings.showDebugOutput);
|
||||
m_outputPane->setBehaviorOnOutput(runControl, popup ? AppOutputPane::Popup : AppOutputPane::Flash);
|
||||
m_outputPane.setBehaviorOnOutput(runControl, popup ? AppOutputPane::Popup : AppOutputPane::Flash);
|
||||
connect(runControl, &QObject::destroyed, this, &ProjectExplorerPluginPrivate::checkForShutdown,
|
||||
Qt::QueuedConnection);
|
||||
++m_activeRunControlCount;
|
||||
@@ -2344,7 +2335,7 @@ int ProjectExplorerPluginPrivate::queue(QList<Project *> projects, QList<Id> ste
|
||||
&& stepIds.contains(Constants::BUILDSTEPS_BUILD)) {
|
||||
ProjectExplorerSettings::StopBeforeBuild stopCondition = m_projectExplorerSettings.stopBeforeBuild;
|
||||
const QList<RunControl *> toStop
|
||||
= Utils::filtered(m_outputPane->allRunControls(), [&projects, stopCondition](RunControl *rc) -> bool {
|
||||
= Utils::filtered(m_outputPane.allRunControls(), [&projects, stopCondition](RunControl *rc) -> bool {
|
||||
if (!rc->isRunning())
|
||||
return false;
|
||||
|
||||
@@ -2541,7 +2532,7 @@ bool ProjectExplorerPlugin::coreAboutToClose()
|
||||
if (box.clickedButton() != closeAnyway)
|
||||
return false;
|
||||
}
|
||||
if (!dd->m_outputPane->aboutToClose())
|
||||
if (!dd->m_outputPane.aboutToClose())
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
@@ -2604,7 +2595,7 @@ void ProjectExplorerPlugin::runRunConfiguration(RunConfiguration *rc,
|
||||
QList<QPair<Runnable, Utils::ProcessHandle>> ProjectExplorerPlugin::runningRunControlProcesses()
|
||||
{
|
||||
QList<QPair<Runnable, Utils::ProcessHandle>> processes;
|
||||
foreach (RunControl *rc, dd->m_outputPane->allRunControls()) {
|
||||
foreach (RunControl *rc, dd->m_outputPane.allRunControls()) {
|
||||
if (rc->isRunning())
|
||||
processes << qMakePair(rc->runnable(), rc->applicationProcessHandle());
|
||||
}
|
||||
@@ -2613,8 +2604,8 @@ QList<QPair<Runnable, Utils::ProcessHandle>> ProjectExplorerPlugin::runningRunCo
|
||||
|
||||
void ProjectExplorerPluginPrivate::projectAdded(Project *pro)
|
||||
{
|
||||
if (m_projectsMode)
|
||||
m_projectsMode->setEnabled(true);
|
||||
m_projectsMode.setEnabled(true);
|
||||
|
||||
// more specific action en and disabling ?
|
||||
pro->subscribeSignal(&BuildConfiguration::enabledChanged, this, [this]() {
|
||||
auto bc = qobject_cast<BuildConfiguration *>(sender());
|
||||
@@ -2633,8 +2624,7 @@ void ProjectExplorerPluginPrivate::projectAdded(Project *pro)
|
||||
void ProjectExplorerPluginPrivate::projectRemoved(Project *pro)
|
||||
{
|
||||
Q_UNUSED(pro);
|
||||
if (m_projectsMode)
|
||||
m_projectsMode->setEnabled(SessionManager::hasProjects());
|
||||
m_projectsMode.setEnabled(SessionManager::hasProjects());
|
||||
}
|
||||
|
||||
void ProjectExplorerPluginPrivate::projectDisplayNameChanged(Project *pro)
|
||||
|
@@ -79,7 +79,7 @@ private:
|
||||
|
||||
static QVector<Core::Id> m_registeredCategories;
|
||||
|
||||
friend class ProjectExplorerPlugin;
|
||||
friend class ProjectExplorerPluginPrivate;
|
||||
};
|
||||
|
||||
} // namespace ProjectExplorer
|
||||
|
Reference in New Issue
Block a user