aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/debugger/enginemanager.cpp
diff options
context:
space:
mode:
authorOrgad Shaneh <orgad.shaneh@audiocodes.com>2019-04-07 20:40:29 +0300
committerOrgad Shaneh <orgad.shaneh@audiocodes.com>2019-04-07 23:13:17 +0300
commit39ba01da711c07c43abe8aeacedd98990874ba82 (patch)
tree4a1c8853bd8db754fbf57eac5fff21b7e7342c8a /src/plugins/debugger/enginemanager.cpp
parenta33386e014db5fdf65903654e9b1ae542ee36c0f (diff)
parent5273ef2a8aa3c8d268b107edc770b53e1aed7803 (diff)
Merge remote-tracking branch 'origin/4.9'
Diffstat (limited to 'src/plugins/debugger/enginemanager.cpp')
-rw-r--r--src/plugins/debugger/enginemanager.cpp147
1 files changed, 83 insertions, 64 deletions
diff --git a/src/plugins/debugger/enginemanager.cpp b/src/plugins/debugger/enginemanager.cpp
index 3d659b589f7..b03ac37f26c 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