diff options
Diffstat (limited to 'src/plugins/debugger/enginemanager.cpp')
-rw-r--r-- | src/plugins/debugger/enginemanager.cpp | 147 |
1 files changed, 83 insertions, 64 deletions
diff --git a/src/plugins/debugger/enginemanager.cpp b/src/plugins/debugger/enginemanager.cpp index 3d659b589f..b03ac37f26 100644 --- a/src/plugins/debugger/enginemanager.cpp +++ b/src/plugins/debugger/enginemanager.cpp @@ -155,16 +155,18 @@ public: } EngineItem *findEngineItem(DebuggerEngine *engine); - void activateEngine(DebuggerEngine *engine); void activateEngineItem(EngineItem *engineItem); void activateEngineByIndex(int index); void selectUiForCurrentEngine(); void updateEngineChooserVisibility(); + void updatePerspectives(); TreeModel<TypedTreeItem<EngineItem>, EngineItem> m_engineModel; - QPointer<EngineItem> m_currentItem; + QPointer<EngineItem> m_currentItem; // The primary information is DebuggerMainWindow::d->m_currentPerspective Core::Id m_previousMode; QPointer<QComboBox> m_engineChooser; + bool m_shuttingDown = false; + Context m_currentAdditionalContext; }; //////////////////////////////////////////////////////////////////////// @@ -192,6 +194,11 @@ QWidget *EngineManager::engineChooser() return d->m_engineChooser; } +void EngineManager::updatePerspectives() +{ + d->updatePerspectives(); +} + EngineManager::~EngineManager() { theEngineManager = nullptr; @@ -208,11 +215,6 @@ QAbstractItemModel *EngineManager::model() return &d->m_engineModel; } -void EngineManager::activateEngine(DebuggerEngine *engine) -{ - d->activateEngine(engine); -} - QVariant EngineItem::data(int column, int role) const { if (m_engine) { @@ -273,7 +275,7 @@ bool EngineItem::setData(int row, const QVariant &value, int role) if (role == BaseTreeView::ItemActivatedRole) { EngineItem *engineItem = d->findEngineItem(m_engine); - d->activateEngineItem(engineItem); + d->activateEngineByIndex(engineItem->indexInParent()); return true; } @@ -316,21 +318,27 @@ bool EngineItem::setData(int row, const QVariant &value, int role) void EngineManagerPrivate::activateEngineByIndex(int index) { - activateEngineItem(m_engineModel.rootItem()->childAt(index)); + // The actual activation is triggered indirectly via the perspective change. + Perspective *perspective = nullptr; + if (index == 0) { + perspective = Perspective::findPerspective(Debugger::Constants::PRESET_PERSPECTIVE_ID); + } else { + EngineItem *engineItem = m_engineModel.rootItem()->childAt(index); + QTC_ASSERT(engineItem, return); + QTC_ASSERT(engineItem->m_engine, return); + perspective = engineItem->m_engine->perspective(); + } + + QTC_ASSERT(perspective, return); + perspective->select(); } void EngineManagerPrivate::activateEngineItem(EngineItem *engineItem) { - Context previousContext; - if (m_currentItem) { - if (DebuggerEngine *engine = m_currentItem->m_engine) { - previousContext.add(engine->languageContext()); - previousContext.add(engine->debuggerContext()); - } else { - previousContext.add(Context(Constants::C_DEBUGGER_NOTRUNNING)); - } - } + if (m_currentItem == engineItem) + return; + QTC_ASSERT(engineItem, return); m_currentItem = engineItem; Context newContext; @@ -343,7 +351,13 @@ void EngineManagerPrivate::activateEngineItem(EngineItem *engineItem) } } - ICore::updateAdditionalContexts(previousContext, newContext); + ICore::updateAdditionalContexts(m_currentAdditionalContext, newContext); + m_currentAdditionalContext = newContext; + + // In case this was triggered externally by some Perspective::select() call. + const int idx = engineItem->indexInParent(); + m_engineChooser->setCurrentIndex(idx); + selectUiForCurrentEngine(); } @@ -352,12 +366,7 @@ void EngineManagerPrivate::selectUiForCurrentEngine() if (ModeManager::currentModeId() != Constants::MODE_DEBUG) return; - Perspective *perspective = nullptr; int row = 0; - - if (m_currentItem && m_currentItem->m_engine) - perspective = m_currentItem->m_engine->perspective(); - if (m_currentItem) row = m_engineModel.rootItem()->indexOf(m_currentItem); @@ -371,12 +380,6 @@ void EngineManagerPrivate::selectUiForCurrentEngine() QStyle::CT_ComboBox, &option, sz).width(); m_engineChooser->setFixedWidth(width); - if (!perspective) - perspective = Perspective::findPerspective(Debugger::Constants::PRESET_PERSPECTIVE_ID); - - QTC_ASSERT(perspective, return); - perspective->select(); - m_engineModel.rootItem()->forFirstLevelChildren([this](EngineItem *engineItem) { if (engineItem && engineItem->m_engine) engineItem->m_engine->updateUi(engineItem == m_currentItem); @@ -392,12 +395,6 @@ EngineItem *EngineManagerPrivate::findEngineItem(DebuggerEngine *engine) }); } -void EngineManagerPrivate::activateEngine(DebuggerEngine *engine) -{ - EngineItem *engineItem = findEngineItem(engine); - activateEngineItem(engineItem); -} - void EngineManagerPrivate::updateEngineChooserVisibility() { // Show it if there's more than one option (i.e. not the preset engine only) @@ -407,12 +404,48 @@ void EngineManagerPrivate::updateEngineChooserVisibility() } } -void EngineManager::registerEngine(DebuggerEngine *engine) +void EngineManagerPrivate::updatePerspectives() +{ + d->updateEngineChooserVisibility(); + + Perspective *current = DebuggerMainWindow::currentPerspective(); + if (!current) { + return; + } + + m_engineModel.rootItem()->forFirstLevelChildren([this, current](EngineItem *engineItem) { + if (engineItem == m_currentItem) + return; + + bool shouldBeActive = false; + if (engineItem->m_engine) { + // Normal engine. + shouldBeActive = engineItem->m_engine->perspective()->isCurrent(); + } else { + // Preset. + shouldBeActive = current->id() == Debugger::Constants::PRESET_PERSPECTIVE_ID; + } + + if (shouldBeActive && engineItem != m_currentItem) + activateEngineItem(engineItem); + }); +} + +QString EngineManager::registerEngine(DebuggerEngine *engine) { auto engineItem = new EngineItem; engineItem->m_engine = engine; d->m_engineModel.rootItem()->appendChild(engineItem); d->updateEngineChooserVisibility(); + return QString::number(d->m_engineModel.rootItem()->childCount()); +} + +void EngineManager::unregisterEngine(DebuggerEngine *engine) +{ + EngineItem *engineItem = d->findEngineItem(engine); + QTC_ASSERT(engineItem, return); + d->m_engineModel.destroyItem(engineItem); + d->updateEngineChooserVisibility(); } void EngineManager::activateDebugMode() @@ -435,33 +468,6 @@ void EngineManager::deactivateDebugMode() } } -bool EngineManager::isLastOf(const QString &type) -{ - int count = 0; - d->m_engineModel.rootItem()->forFirstLevelChildren([&](EngineItem *engineItem) { - if (engineItem && engineItem->m_engine) - count += (engineItem->m_engine->debuggerName() == type); - }); - return count == 1; -} - -void EngineManager::unregisterEngine(DebuggerEngine *engine) -{ - if (ModeManager::currentModeId() == Constants::MODE_DEBUG) { - if (Perspective *parent = Perspective::findPerspective(Constants::PRESET_PERSPECTIVE_ID)) - parent->select(); - } - - d->activateEngineItem(d->m_engineModel.rootItem()->childAt(0)); // Preset. - - // Could be that the run controls died before it was appended. - if (auto engineItem = d->findEngineItem(engine)) - d->m_engineModel.destroyItem(engineItem); - - d->updateEngineChooserVisibility(); - emit theEngineManager->currentEngineChanged(); -} - QList<QPointer<DebuggerEngine>> EngineManager::engines() { QList<QPointer<DebuggerEngine>> result; @@ -477,5 +483,18 @@ QPointer<DebuggerEngine> EngineManager::currentEngine() return d->m_currentItem ? d->m_currentItem->m_engine : nullptr; } +bool EngineManager::shutDown() +{ + d->m_shuttingDown = true; + bool anyEngineAborting = false; + for (DebuggerEngine *engine : EngineManager::engines()) { + if (engine && engine->state() != Debugger::DebuggerNotReady) { + engine->abortDebugger(); + anyEngineAborting = true; + } + } + return anyEngineAborting; +} + } // namespace Internal } // namespace Debugger |