diff --git a/src/plugins/cppeditor/cppeditorplugin.cpp b/src/plugins/cppeditor/cppeditorplugin.cpp index 73a64d3b08a..398b810f909 100644 --- a/src/plugins/cppeditor/cppeditorplugin.cpp +++ b/src/plugins/cppeditor/cppeditorplugin.cpp @@ -166,7 +166,6 @@ public: QAction *m_reparseExternallyChangedFiles = nullptr; QAction *m_findRefsCategorizedAction = nullptr; - QAction *m_openTypeHierarchyAction = nullptr; QAction *m_openIncludeHierarchyAction = nullptr; CppQuickFixSettingsPage m_quickFixSettingsPage; @@ -174,7 +173,6 @@ public: QPointer m_cppCodeModelInspectorDialog; CppOutlineWidgetFactory m_cppOutlineWidgetFactory; - CppTypeHierarchyFactory m_cppTypeHierarchyFactory; CppIncludeHierarchyFactory m_cppIncludeHierarchyFactory; CppEditorFactory m_cppEditorFactory; @@ -353,13 +351,7 @@ void CppEditorPlugin::addPerSymbolActions() addSymbolActionToMenus(TextEditor::Constants::RENAME_SYMBOL); - ActionBuilder openTypeHierarchy(this, Constants::OPEN_TYPE_HIERARCHY); - openTypeHierarchy.setText(Tr::tr("Open Type Hierarchy")); - openTypeHierarchy.setContext(context); - openTypeHierarchy.bindContextAction(&d->m_openTypeHierarchyAction); - openTypeHierarchy.setDefaultKeySequence(Tr::tr("Meta+Shift+T"), Tr::tr("Ctrl+Shift+T")); - openTypeHierarchy.addToContainers(menus, Constants::G_SYMBOL); - openTypeHierarchy.addOnTriggered(this, &CppEditorPlugin::openTypeHierarchy); + setupCppTypeHierarchy(); addSymbolActionToMenus(TextEditor::Constants::OPEN_CALL_HIERARCHY); @@ -551,7 +543,6 @@ void CppEditorPluginPrivate::onTaskStarted(Id type) ActionManager::command(TextEditor::Constants::FIND_USAGES)->action()->setEnabled(false); ActionManager::command(TextEditor::Constants::RENAME_SYMBOL)->action()->setEnabled(false); m_reparseExternallyChangedFiles->setEnabled(false); - m_openTypeHierarchyAction->setEnabled(false); m_openIncludeHierarchyAction->setEnabled(false); } } @@ -562,7 +553,6 @@ void CppEditorPluginPrivate::onAllTasksFinished(Id type) ActionManager::command(TextEditor::Constants::FIND_USAGES)->action()->setEnabled(true); ActionManager::command(TextEditor::Constants::RENAME_SYMBOL)->action()->setEnabled(true); m_reparseExternallyChangedFiles->setEnabled(true); - m_openTypeHierarchyAction->setEnabled(true); m_openIncludeHierarchyAction->setEnabled(true); } } @@ -578,14 +568,6 @@ void CppEditorPluginPrivate::inspectCppCodeModel() } } -void CppEditorPlugin::openTypeHierarchy() -{ - if (currentCppEditorWidget()) { - emit typeHierarchyRequested(); - NavigationWidget::activateSubWidget(Constants::TYPE_HIERARCHY_ID, Side::Left); - } -} - void CppEditorPlugin::openIncludeHierarchy() { if (currentCppEditorWidget()) { diff --git a/src/plugins/cppeditor/cppeditorplugin.h b/src/plugins/cppeditor/cppeditorplugin.h index d208a5cd1ab..e2cce3b2f79 100644 --- a/src/plugins/cppeditor/cppeditorplugin.h +++ b/src/plugins/cppeditor/cppeditorplugin.h @@ -26,14 +26,12 @@ public: static void clearHeaderSourceCache(); void openDeclarationDefinitionInNextSplit(); - void openTypeHierarchy(); void openIncludeHierarchy(); void showPreProcessorDialog(); void renameSymbolUnderCursor(); void switchDeclarationDefinition(); signals: - void typeHierarchyRequested(); void includeHierarchyRequested(); private: diff --git a/src/plugins/cppeditor/cpptypehierarchy.cpp b/src/plugins/cppeditor/cpptypehierarchy.cpp index a46eafd98b0..bb49e60aa4f 100644 --- a/src/plugins/cppeditor/cpptypehierarchy.cpp +++ b/src/plugins/cppeditor/cpptypehierarchy.cpp @@ -6,11 +6,13 @@ #include "cppeditorconstants.h" #include "cppeditortr.h" #include "cppeditorwidget.h" -#include "cppeditorplugin.h" #include "cppelementevaluator.h" -#include +#include #include +#include +#include +#include #include #include @@ -25,15 +27,14 @@ #include #include #include -#include #include #include #include #include -#include #include #include +using namespace Core; using namespace Utils; namespace CppEditor::Internal { @@ -195,8 +196,6 @@ CppTypeHierarchyWidget::CppTypeHierarchyWidget() showNoTypeHierarchyLabel(); setLayout(m_stackLayout); - connect(CppEditorPlugin::instance(), &CppEditorPlugin::typeHierarchyRequested, - this, &CppTypeHierarchyWidget::perform); connect(&m_futureWatcher, &QFutureWatcher::finished, this, &CppTypeHierarchyWidget::displayHierarchy); } @@ -399,18 +398,63 @@ QMimeData *CppTypeHierarchyModel::mimeData(const QModelIndexList &indexes) const // CppTypeHierarchyFactory -CppTypeHierarchyFactory::CppTypeHierarchyFactory() +class CppTypeHierarchyFactory final : public INavigationWidgetFactory { - setDisplayName(Tr::tr("Type Hierarchy")); - setPriority(700); - setId(Constants::TYPE_HIERARCHY_ID); +public: + CppTypeHierarchyFactory() + { + setDisplayName(Tr::tr("Type Hierarchy")); + setPriority(700); + setId(Constants::TYPE_HIERARCHY_ID); + + ActionBuilder openTypeHierarchy(this, Constants::OPEN_TYPE_HIERARCHY); + openTypeHierarchy.setText(Tr::tr("Open Type Hierarchy")); + openTypeHierarchy.setContext(Context(Constants::CPPEDITOR_ID)); + openTypeHierarchy.bindContextAction(&m_openTypeHierarchyAction); + openTypeHierarchy.setDefaultKeySequence(Tr::tr("Meta+Shift+T"), Tr::tr("Ctrl+Shift+T")); + openTypeHierarchy.addToContainers({Constants::M_TOOLS_CPP, Constants::M_CONTEXT}, + Constants::G_SYMBOL); + + connect(m_openTypeHierarchyAction, &QAction::triggered, this, [] { + NavigationWidget::activateSubWidget(Constants::TYPE_HIERARCHY_ID, Side::Left); + }); + + connect(ProgressManager::instance(), &ProgressManager::taskStarted, [this](Id type) { + if (type == Constants::TASK_INDEX) + m_openTypeHierarchyAction->setEnabled(false); + }); + connect(ProgressManager::instance(), &ProgressManager::allTasksFinished, [this](Id type) { + if (type == Constants::TASK_INDEX) + m_openTypeHierarchyAction->setEnabled(true); + }); + } + + NavigationView createWidget() final + { + auto w = new CppTypeHierarchyWidget; + connect(m_openTypeHierarchyAction, &QAction::triggered, w, &CppTypeHierarchyWidget::perform); + w->perform(); + + return {w, {}}; + } + + QAction *m_openTypeHierarchyAction = nullptr; +}; + +static CppTypeHierarchyFactory &cppTypeHierarchyFactory() +{ + static CppTypeHierarchyFactory theCppTypeHierarchyFactory; + return theCppTypeHierarchyFactory; } -Core::NavigationView CppTypeHierarchyFactory::createWidget() +void openCppTypeHierarchy() { - auto w = new CppTypeHierarchyWidget; - w->perform(); - return {w, {}}; + cppTypeHierarchyFactory().m_openTypeHierarchyAction->trigger(); +} + +void setupCppTypeHierarchy() +{ + (void) cppTypeHierarchyFactory(); // Trigger instantiation } } // CppEditor::Internal diff --git a/src/plugins/cppeditor/cpptypehierarchy.h b/src/plugins/cppeditor/cpptypehierarchy.h index 37eaec2a78e..c6c99f214f7 100644 --- a/src/plugins/cppeditor/cpptypehierarchy.h +++ b/src/plugins/cppeditor/cpptypehierarchy.h @@ -3,16 +3,9 @@ #pragma once -#include - namespace CppEditor::Internal { -class CppTypeHierarchyFactory : public Core::INavigationWidgetFactory -{ -public: - CppTypeHierarchyFactory(); - - Core::NavigationView createWidget() override; -}; +void openCppTypeHierarchy(); +void setupCppTypeHierarchy(); } // CppEditor::Internal diff --git a/src/plugins/cppeditor/fileandtokenactions_test.cpp b/src/plugins/cppeditor/fileandtokenactions_test.cpp index ed6b80cecc8..66f9e5d31eb 100644 --- a/src/plugins/cppeditor/fileandtokenactions_test.cpp +++ b/src/plugins/cppeditor/fileandtokenactions_test.cpp @@ -12,6 +12,7 @@ #include "cppmodelmanager.h" #include "cpptoolsreuse.h" #include "cpptoolstestcase.h" +#include "cpptypehierarchy.h" #include "cppworkingcopy.h" #include "projectinfo.h" @@ -382,7 +383,7 @@ public: void OpenTypeHierarchyTokenAction::run(CppEditorWidget *) { - CppEditorPlugin::instance()->openTypeHierarchy(); + openCppTypeHierarchy(); QApplication::processEvents(); }