Debugger: Fix switch from and to sub-perspectives

Change-Id: I17d3b7eb6416843b7a330da14528f0670cd88452
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2018-08-22 13:08:49 +02:00
parent 763a1cfc06
commit 0303b84fff
5 changed files with 118 additions and 105 deletions

View File

@@ -39,7 +39,6 @@ const char C_CPPDEBUGGER[] = "Gdb Debugger";
const char C_QMLDEBUGGER[] = "Qml/JavaScript Debugger"; const char C_QMLDEBUGGER[] = "Qml/JavaScript Debugger";
const char PRESET_PERSPRECTIVE_ID[] = "Debugger.Perspective.Preset"; const char PRESET_PERSPRECTIVE_ID[] = "Debugger.Perspective.Preset";
const char PERSPECTIVE_ID[] = "Debugger.Perspective";
// Menu Groups // Menu Groups
const char G_GENERAL[] = "Debugger.Group.General"; const char G_GENERAL[] = "Debugger.Group.General";

View File

@@ -526,11 +526,12 @@ public:
void DebuggerEnginePrivate::setupViews() void DebuggerEnginePrivate::setupViews()
{ {
const DebuggerRunParameters &rp = m_engine->runParameters(); const DebuggerRunParameters &rp = m_runParameters;
QTC_CHECK(!m_perspective); QTC_CHECK(!m_perspective);
const QString id = Constants::PERSPECTIVE_ID + m_debuggerName + rp.displayName; const QString perspectiveId = "Debugger.Perspective." + m_debuggerName + '.' + rp.displayName;
m_perspective = new Perspective(id, m_engine->displayName()); m_perspective = new Perspective(perspectiveId, m_engine->displayName(),
Debugger::Constants::PRESET_PERSPRECTIVE_ID);
m_progress.setProgressRange(0, 1000); m_progress.setProgressRange(0, 1000);
FutureProgress *fp = ProgressManager::addTask(m_progress.future(), FutureProgress *fp = ProgressManager::addTask(m_progress.future(),
@@ -571,7 +572,10 @@ void DebuggerEnginePrivate::setupViews()
this, &DebuggerEnginePrivate::resetLocation); this, &DebuggerEnginePrivate::resetLocation);
QSettings *settings = ICore::settings(); QSettings *settings = ICore::settings();
const QString perspectiveId = m_perspective->id();
auto dockId = [perspectiveId](const QString &dockname) {
return QString(dockname + '.' + perspectiveId);
};
m_modulesView = new BaseTreeView; m_modulesView = new BaseTreeView;
m_modulesView->setModel(m_modulesHandler.model()); m_modulesView->setModel(m_modulesHandler.model());
@@ -581,7 +585,7 @@ void DebuggerEnginePrivate::setupViews()
m_engine, &DebuggerEngine::reloadModules, m_engine, &DebuggerEngine::reloadModules,
Qt::QueuedConnection); Qt::QueuedConnection);
m_modulesWindow = addSearch(m_modulesView); m_modulesWindow = addSearch(m_modulesView);
m_modulesWindow->setObjectName(DOCKWIDGET_MODULES + perspectiveId); m_modulesWindow->setObjectName(dockId(DOCKWIDGET_MODULES));
m_modulesWindow->setWindowTitle(tr("&Modules")); m_modulesWindow->setWindowTitle(tr("&Modules"));
m_registerView = new BaseTreeView; m_registerView = new BaseTreeView;
@@ -592,7 +596,7 @@ void DebuggerEnginePrivate::setupViews()
m_engine, &DebuggerEngine::reloadRegisters, m_engine, &DebuggerEngine::reloadRegisters,
Qt::QueuedConnection); Qt::QueuedConnection);
m_registerWindow = addSearch(m_registerView); m_registerWindow = addSearch(m_registerView);
m_registerWindow->setObjectName(DOCKWIDGET_REGISTER + m_perspective->id()); m_registerWindow->setObjectName(dockId(DOCKWIDGET_REGISTER));
m_registerWindow->setWindowTitle(tr("Reg&isters")); m_registerWindow->setWindowTitle(tr("Reg&isters"));
m_stackView = new BaseTreeView; m_stackView = new BaseTreeView;
@@ -600,7 +604,7 @@ void DebuggerEnginePrivate::setupViews()
m_stackView->setSettings(settings, "Debugger.StackView"); m_stackView->setSettings(settings, "Debugger.StackView");
m_stackView->setIconSize(QSize(10, 10)); m_stackView->setIconSize(QSize(10, 10));
m_stackWindow = addSearch(m_stackView); m_stackWindow = addSearch(m_stackView);
m_stackWindow->setObjectName(DOCKWIDGET_STACK + m_perspective->id()); m_stackWindow->setObjectName(dockId(DOCKWIDGET_STACK));
m_stackWindow->setWindowTitle(tr("&Stack")); m_stackWindow->setWindowTitle(tr("&Stack"));
m_sourceFilesView = new BaseTreeView; m_sourceFilesView = new BaseTreeView;
@@ -611,7 +615,7 @@ void DebuggerEnginePrivate::setupViews()
m_engine, &DebuggerEngine::reloadSourceFiles, m_engine, &DebuggerEngine::reloadSourceFiles,
Qt::QueuedConnection); Qt::QueuedConnection);
m_sourceFilesWindow = addSearch(m_sourceFilesView); m_sourceFilesWindow = addSearch(m_sourceFilesView);
m_sourceFilesWindow->setObjectName(DOCKWIDGET_SOURCE_FILES + m_perspective->id()); m_sourceFilesWindow->setObjectName(dockId(DOCKWIDGET_SOURCE_FILES));
m_sourceFilesWindow->setWindowTitle(tr("Source Files")); m_sourceFilesWindow->setWindowTitle(tr("Source Files"));
m_threadsView = new BaseTreeView; m_threadsView = new BaseTreeView;
@@ -620,13 +624,13 @@ void DebuggerEnginePrivate::setupViews()
m_threadsView->setSettings(settings, "Debugger.ThreadsView"); m_threadsView->setSettings(settings, "Debugger.ThreadsView");
m_threadsView->setIconSize(QSize(10, 10)); m_threadsView->setIconSize(QSize(10, 10));
m_threadsWindow = addSearch(m_threadsView); m_threadsWindow = addSearch(m_threadsView);
m_threadsWindow->setObjectName(DOCKWIDGET_THREADS + m_perspective->id()); m_threadsWindow->setObjectName(dockId(DOCKWIDGET_THREADS));
m_threadsWindow->setWindowTitle(tr("&Threads")); m_threadsWindow->setWindowTitle(tr("&Threads"));
m_returnView = new WatchTreeView{ReturnType}; m_returnView = new WatchTreeView{ReturnType};
m_returnView->setModel(m_watchHandler.model()); m_returnView->setModel(m_watchHandler.model());
m_returnWindow = addSearch(m_returnView); m_returnWindow = addSearch(m_returnView);
m_returnWindow->setObjectName("CppDebugReturn" + m_perspective->id()); m_returnWindow->setObjectName(dockId("CppDebugReturn"));
m_returnWindow->setWindowTitle(tr("Locals")); m_returnWindow->setWindowTitle(tr("Locals"));
m_returnWindow->setVisible(false); m_returnWindow->setVisible(false);
@@ -634,26 +638,26 @@ void DebuggerEnginePrivate::setupViews()
m_localsView->setModel(m_watchHandler.model()); m_localsView->setModel(m_watchHandler.model());
m_localsView->setSettings(settings, "Debugger.LocalsView"); m_localsView->setSettings(settings, "Debugger.LocalsView");
m_localsWindow = addSearch(m_localsView); m_localsWindow = addSearch(m_localsView);
m_localsWindow->setObjectName("CppDebugLocals" + m_perspective->id()); m_localsWindow->setObjectName(dockId("CppDebugLocals"));
m_localsWindow->setWindowTitle(tr("Locals")); m_localsWindow->setWindowTitle(tr("Locals"));
m_inspectorView = new WatchTreeView{InspectType}; m_inspectorView = new WatchTreeView{InspectType};
m_inspectorView->setModel(m_watchHandler.model()); m_inspectorView->setModel(m_watchHandler.model());
m_inspectorView->setSettings(settings, "Debugger.LocalsView"); // sic! same as locals view. m_inspectorView->setSettings(settings, "Debugger.LocalsView"); // sic! same as locals view.
m_inspectorWindow = addSearch(m_inspectorView); m_inspectorWindow = addSearch(m_inspectorView);
m_inspectorWindow->setObjectName("Inspector" + m_perspective->id()); m_inspectorWindow->setObjectName(dockId("Inspector"));
m_inspectorWindow->setWindowTitle(tr("Locals")); m_inspectorWindow->setWindowTitle(tr("Locals"));
m_watchersView = new WatchTreeView{WatchersType}; m_watchersView = new WatchTreeView{WatchersType};
m_watchersView->setModel(m_watchHandler.model()); m_watchersView->setModel(m_watchHandler.model());
m_watchersView->setSettings(settings, "Debugger.WatchersView"); m_watchersView->setSettings(settings, "Debugger.WatchersView");
m_watchersWindow = addSearch(m_watchersView); m_watchersWindow = addSearch(m_watchersView);
m_watchersWindow->setObjectName("CppDebugWatchers" + m_perspective->id()); m_watchersWindow->setObjectName(dockId("CppDebugWatchers"));
m_watchersWindow->setWindowTitle(tr("&Expressions")); m_watchersWindow->setWindowTitle(tr("&Expressions"));
m_localsAndInspectorWindow = new LocalsAndInspectorWindow( m_localsAndInspectorWindow = new LocalsAndInspectorWindow(
m_localsWindow, m_inspectorWindow, m_returnWindow); m_localsWindow, m_inspectorWindow, m_returnWindow);
m_localsAndInspectorWindow->setObjectName(DOCKWIDGET_LOCALS_AND_INSPECTOR + m_perspective->id()); m_localsAndInspectorWindow->setObjectName(dockId(DOCKWIDGET_LOCALS_AND_INSPECTOR));
m_localsAndInspectorWindow->setWindowTitle(m_localsWindow->windowTitle()); m_localsAndInspectorWindow->setWindowTitle(m_localsWindow->windowTitle());
// Locals // Locals
@@ -670,7 +674,7 @@ void DebuggerEnginePrivate::setupViews()
m_breakView->setModel(m_breakHandler.model()); m_breakView->setModel(m_breakHandler.model());
m_breakView->setRootIsDecorated(true); m_breakView->setRootIsDecorated(true);
m_breakWindow = addSearch(m_breakView); m_breakWindow = addSearch(m_breakView);
m_breakWindow->setObjectName(DOCKWIDGET_BREAK + m_perspective->id()); m_breakWindow->setObjectName(dockId(DOCKWIDGET_BREAK));
m_breakWindow->setWindowTitle(tr("&Breakpoints")); m_breakWindow->setWindowTitle(tr("&Breakpoints"));
m_perspective->addToolBarWidget(EngineManager::engineChooser()); m_perspective->addToolBarWidget(EngineManager::engineChooser());
@@ -776,7 +780,6 @@ void DebuggerEnginePrivate::setupViews()
m_inspectorWindow->setFont(font); m_inspectorWindow->setFont(font);
}); });
m_perspective->setParentPerspective(Debugger::Constants::PRESET_PERSPRECTIVE_ID);
m_perspective->addWindow(m_stackWindow, Perspective::SplitVertical, nullptr); m_perspective->addWindow(m_stackWindow, Perspective::SplitVertical, nullptr);
m_perspective->addWindow(m_breakWindow, Perspective::SplitHorizontal, m_stackWindow); m_perspective->addWindow(m_breakWindow, Perspective::SplitHorizontal, m_stackWindow);
m_perspective->addWindow(m_threadsWindow, Perspective::AddToTab, m_breakWindow,false); m_perspective->addWindow(m_threadsWindow, Perspective::AddToTab, m_breakWindow,false);

View File

@@ -147,12 +147,13 @@ public:
QString m_id; QString m_id;
QString m_name; QString m_name;
QString m_parentPerspective; QString m_parentPerspectiveId;
QVector<DockOperation> m_dockOperations; QVector<DockOperation> m_dockOperations;
QVector<ToolbarOperation> m_toolBarOperations; QVector<ToolbarOperation> m_toolBarOperations;
QPointer<QWidget> m_centralWidget; QPointer<QWidget> m_centralWidget;
Perspective::Callback m_aboutToActivateCallback; Perspective::Callback m_aboutToActivateCallback;
QPointer<QWidget> m_toolButtonBox; QPointer<QWidget> m_toolButtonBox;
QString m_lastActiveSubPerspectiveId;
}; };
class DebuggerMainWindowPrivate : public QObject class DebuggerMainWindowPrivate : public QObject
@@ -162,8 +163,9 @@ public:
void ensureToolBarDockExists(); void ensureToolBarDockExists();
void restorePerspective(Perspective *perspective); void selectPerspective(Perspective *perspective);
void loadPerspectiveHelper(Perspective *perspective, bool fromStoredSettings = true); void depopulateCurrentPerspective();
void populateCurrentPerspective();
void savePerspectiveHelper(const Perspective *perspective); void savePerspectiveHelper(const Perspective *perspective);
void destroyPerspective(Perspective *perspective); void destroyPerspective(Perspective *perspective);
void registerPerspective(Perspective *perspective); void registerPerspective(Perspective *perspective);
@@ -196,7 +198,12 @@ DebuggerMainWindowPrivate::DebuggerMainWindowPrivate(DebuggerMainWindow *parent)
m_perspectiveChooser->setProperty("panelwidget", true); m_perspectiveChooser->setProperty("panelwidget", true);
connect(m_perspectiveChooser, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), connect(m_perspectiveChooser, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated),
this, [this](int item) { this, [this](int item) {
restorePerspective(Perspective::findPerspective(m_perspectiveChooser->itemData(item).toString())); Perspective *perspective = Perspective::findPerspective(m_perspectiveChooser->itemData(item).toString());
QTC_ASSERT(perspective, return);
if (auto subPerspective = Perspective::findPerspective(perspective->d->m_lastActiveSubPerspectiveId))
subPerspective->select();
else
perspective->select();
}); });
} }
@@ -257,8 +264,8 @@ void DebuggerMainWindow::doShutdown()
void DebuggerMainWindowPrivate::registerPerspective(Perspective *perspective) void DebuggerMainWindowPrivate::registerPerspective(Perspective *perspective)
{ {
m_perspectives.append(perspective); m_perspectives.append(perspective);
QString parentPerspective = perspective->d->m_parentPerspective; QString parentPerspective = perspective->d->m_parentPerspectiveId;
// Add "main" perspectives to the chooser. // Add only "main" perspectives to the chooser.
if (parentPerspective.isEmpty()) { if (parentPerspective.isEmpty()) {
m_perspectiveChooser->addItem(perspective->name(), perspective->id()); m_perspectiveChooser->addItem(perspective->name(), perspective->id());
increaseChooserWidthIfNecessary(perspective->name()); increaseChooserWidthIfNecessary(perspective->name());
@@ -291,8 +298,8 @@ void DebuggerMainWindowPrivate::destroyPerspective(Perspective *perspective)
if (perspective == m_currentPerspective) { if (perspective == m_currentPerspective) {
m_currentPerspective = nullptr; m_currentPerspective = nullptr;
if (!perspective->d->m_parentPerspective.isEmpty()) { if (!perspective->d->m_parentPerspectiveId.isEmpty()) {
if (Perspective *parent = Perspective::findPerspective(perspective->d->m_parentPerspective)) if (Perspective *parent = Perspective::findPerspective(perspective->d->m_parentPerspectiveId))
parent->select(); parent->select();
} }
} }
@@ -308,7 +315,20 @@ void DebuggerMainWindow::onModeChanged(Core::Id mode)
{ {
if (mode == Debugger::Constants::MODE_DEBUG) { if (mode == Debugger::Constants::MODE_DEBUG) {
theMainWindow->setDockActionsVisible(true); theMainWindow->setDockActionsVisible(true);
theMainWindow->d->restorePerspective(nullptr); Perspective *perspective = theMainWindow->d->m_currentPerspective;
if (!perspective) {
const QSettings *settings = ICore::settings();
const QString lastPerspectiveId = settings->value(QLatin1String(LAST_PERSPECTIVE_KEY)).toString();
perspective = Perspective::findPerspective(lastPerspectiveId);
// If we don't find a perspective with the stored name, pick any.
// This can happen e.g. when a plugin was disabled that provided
// the stored perspective, or when the save file was modified externally.
if (!perspective && !theMainWindow->d->m_perspectives.isEmpty())
perspective = theMainWindow->d->m_perspectives.first();
}
// There's at least the debugger preset perspective that should be found above.
QTC_ASSERT(perspective, return);
perspective->select();
} else { } else {
theMainWindow->setDockActionsVisible(false); theMainWindow->setDockActionsVisible(false);
@@ -344,7 +364,8 @@ void DebuggerMainWindow::closeEvent(QCloseEvent *)
void DebuggerMainWindowPrivate::resetCurrentPerspective() void DebuggerMainWindowPrivate::resetCurrentPerspective()
{ {
loadPerspectiveHelper(m_currentPerspective, false); depopulateCurrentPerspective();
populateCurrentPerspective();
} }
int DebuggerMainWindowPrivate::indexInChooser(Perspective *perspective) const int DebuggerMainWindowPrivate::indexInChooser(Perspective *perspective) const
@@ -352,9 +373,23 @@ int DebuggerMainWindowPrivate::indexInChooser(Perspective *perspective) const
return perspective ? m_perspectiveChooser->findData(perspective->d->m_id) : -1; return perspective ? m_perspectiveChooser->findData(perspective->d->m_id) : -1;
} }
void DebuggerMainWindowPrivate::restorePerspective(Perspective *perspective) void DebuggerMainWindowPrivate::selectPerspective(Perspective *perspective)
{ {
loadPerspectiveHelper(perspective, true); QTC_ASSERT(perspective, return);
depopulateCurrentPerspective();
m_currentPerspective = perspective;
perspective->aboutToActivate();
populateCurrentPerspective();
QSettings *settings = ICore::settings();
settings->beginGroup(perspective->d->m_id);
if (settings->value(QLatin1String("ToolSettingsSaved"), false).toBool())
q->restoreSettings(settings);
settings->endGroup();
const int index = indexInChooser(m_currentPerspective); const int index = indexInChooser(m_currentPerspective);
if (index != -1) if (index != -1)
@@ -460,15 +495,14 @@ QWidget *createModeWindow(const Core::Id &mode)
return splitter; return splitter;
} }
void DebuggerMainWindowPrivate::loadPerspectiveHelper(Perspective *perspective, bool fromStoredSettings) void DebuggerMainWindowPrivate::depopulateCurrentPerspective()
{ {
// Clean up old perspective. // Clean up old perspective.
if (m_currentPerspective) {
savePerspectiveHelper(m_currentPerspective); savePerspectiveHelper(m_currentPerspective);
const QList<QDockWidget *> allDocks = q->dockWidgets(); for (QDockWidget *dock : q->dockWidgets()) {
for (QDockWidget *dock : allDocks) {
if (dock->property(OWNED_BY_PERSPECTIVE).toBool()) { if (dock->property(OWNED_BY_PERSPECTIVE).toBool()) {
dock->setParent(nullptr); // Prevent deletion of plugin-owned widgets.
if (dock->widget())
dock->widget()->setParent(nullptr); dock->widget()->setParent(nullptr);
ActionManager::unregisterAction(dock->toggleViewAction(), ActionManager::unregisterAction(dock->toggleViewAction(),
Id("Dock.").withSuffix(dock->objectName())); Id("Dock.").withSuffix(dock->objectName()));
@@ -476,41 +510,28 @@ void DebuggerMainWindowPrivate::loadPerspectiveHelper(Perspective *perspective,
} }
} }
if (m_currentPerspective) {
ICore::removeAdditionalContext(m_currentPerspective->context()); ICore::removeAdditionalContext(m_currentPerspective->context());
QWidget *central = m_currentPerspective->centralWidget(); QWidget *central = m_currentPerspective->centralWidget();
m_centralWidgetStack->removeWidget(central ? central : m_editorPlaceHolder); m_centralWidgetStack->removeWidget(central ? central : m_editorPlaceHolder);
m_currentPerspective->d->destroyToolBar(); m_currentPerspective->d->destroyToolBar();
} }
if (perspective) {
m_currentPerspective = perspective;
} else {
const QSettings *settings = ICore::settings();
const QString lastPerspectiveId = settings->value(QLatin1String(LAST_PERSPECTIVE_KEY)).toString();
m_currentPerspective = Perspective::findPerspective(lastPerspectiveId);
// If we don't find a perspective with the stored name, pick any.
// This can happen e.g. when a plugin was disabled that provided
// the stored perspective, or when the save file was modified externally.
if (!m_currentPerspective && !m_perspectives.isEmpty())
m_currentPerspective = m_perspectives.first();
} }
QTC_ASSERT(m_currentPerspective, return);
ICore::addAdditionalContext(m_currentPerspective->context());
m_currentPerspective->aboutToActivate();
void DebuggerMainWindowPrivate::populateCurrentPerspective()
{
// Create dock widgets wrapping ther perspective's widgets.
QHash<QString, QDockWidget *> dockForDockId; QHash<QString, QDockWidget *> dockForDockId;
for (const DockOperation &op : m_currentPerspective->d->m_dockOperations) { for (const DockOperation &op : m_currentPerspective->d->m_dockOperations) {
QTC_ASSERT(op.widget, continue); QTC_ASSERT(op.widget, continue);
const QString dockId = op.widget->objectName(); const QString dockId = op.widget->objectName();
QDockWidget *dock = dockForDockId.value(dockId);
if (!dock) {
QTC_CHECK(!dockId.isEmpty()); QTC_CHECK(!dockId.isEmpty());
dock = q->addDockForWidget(op.widget); QTC_ASSERT(!dockForDockId.contains(dockId), continue);
QDockWidget *dock = q->addDockForWidget(op.widget);
dock->setProperty(OWNED_BY_PERSPECTIVE, true); dock->setProperty(OWNED_BY_PERSPECTIVE, true);
dockForDockId[dockId] = dock; dockForDockId[dockId] = dock;
q->addDockWidget(op.area, dock);
QAction *toggleViewAction = dock->toggleViewAction(); QAction *toggleViewAction = dock->toggleViewAction();
toggleViewAction->setText(dock->windowTitle()); toggleViewAction->setText(dock->windowTitle());
@@ -519,16 +540,19 @@ void DebuggerMainWindowPrivate::loadPerspectiveHelper(Perspective *perspective,
Id("Dock.").withSuffix(dock->objectName()), Id("Dock.").withSuffix(dock->objectName()),
m_currentPerspective->context()); m_currentPerspective->context());
cmd->setAttribute(Command::CA_Hide); cmd->setAttribute(Command::CA_Hide);
ActionManager::actionContainer(Core::Constants::M_WINDOW_VIEWS)->addAction(cmd); ActionManager::actionContainer(Core::Constants::M_WINDOW_VIEWS)->addAction(cmd);
} }
// Restore parent/child relation, so that the widget hierarchy is clear.
dock->setParent(q); // Pre-arrange dock widgets.
for (const DockOperation &op : m_currentPerspective->d->m_dockOperations) {
QTC_ASSERT(op.widget, continue);
const QString dockId = op.widget->objectName();
QDockWidget *dock = dockForDockId.value(dockId);
QTC_ASSERT(dock, continue);
if (op.operationType == Perspective::Raise) { if (op.operationType == Perspective::Raise) {
dock->raise(); dock->raise();
continue; continue;
} }
q->addDockWidget(op.area, dock);
QDockWidget *anchor = dockForDockId.value(op.anchorDockId); QDockWidget *anchor = dockForDockId.value(op.anchorDockId);
if (!anchor && op.area == Qt::BottomDockWidgetArea) { if (!anchor && op.area == Qt::BottomDockWidgetArea) {
ensureToolBarDockExists(); ensureToolBarDockExists();
@@ -555,22 +579,13 @@ void DebuggerMainWindowPrivate::loadPerspectiveHelper(Perspective *perspective,
m_currentPerspective->d->showToolBar(); m_currentPerspective->d->showToolBar();
if (fromStoredSettings) {
QSettings *settings = ICore::settings();
settings->beginGroup(m_currentPerspective->d->m_id);
if (settings->value(QLatin1String("ToolSettingsSaved"), false).toBool())
q->restoreSettings(settings);
settings->endGroup();
} else {
// By default, show the central widget
q->showCentralWidgetAction()->setChecked(true);
}
QWidget *central = m_currentPerspective->centralWidget(); QWidget *central = m_currentPerspective->centralWidget();
m_centralWidgetStack->addWidget(central ? central : m_editorPlaceHolder); m_centralWidgetStack->addWidget(central ? central : m_editorPlaceHolder);
q->showCentralWidgetAction()->setText(central ? central->windowTitle() : tr("Editor")); q->showCentralWidgetAction()->setText(central ? central->windowTitle() : tr("Editor"));
m_statusLabel->clear(); m_statusLabel->clear();
ICore::addAdditionalContext(m_currentPerspective->context());
} }
void DebuggerMainWindowPrivate::savePerspectiveHelper(const Perspective *perspective) void DebuggerMainWindowPrivate::savePerspectiveHelper(const Perspective *perspective)
@@ -587,11 +602,12 @@ void DebuggerMainWindowPrivate::savePerspectiveHelper(const Perspective *perspec
// Perspective // Perspective
Perspective::Perspective(const QString &id, const QString &name) Perspective::Perspective(const QString &id, const QString &name, const QString &parentPerspectiveId)
: d(new PerspectivePrivate) : d(new PerspectivePrivate)
{ {
d->m_id = id; d->m_id = id;
d->m_name = name; d->m_name = name;
d->m_parentPerspectiveId = parentPerspectiveId;
DebuggerMainWindow::ensureMainWindowExists(); DebuggerMainWindow::ensureMainWindowExists();
theMainWindow->d->registerPerspective(this); theMainWindow->d->registerPerspective(this);
@@ -599,8 +615,9 @@ Perspective::Perspective(const QString &id, const QString &name)
Perspective::~Perspective() Perspective::~Perspective()
{ {
if (theMainWindow) if (theMainWindow) {
theMainWindow->d->destroyPerspective(this); theMainWindow->d->destroyPerspective(this);
}
delete d; delete d;
} }
@@ -631,11 +648,6 @@ void Perspective::aboutToActivate() const
d->m_aboutToActivateCallback(); d->m_aboutToActivateCallback();
} }
void Perspective::setParentPerspective(const QString &parentPerspectiveId)
{
d->m_parentPerspective = parentPerspectiveId;
}
void Perspective::setEnabled(bool enabled) void Perspective::setEnabled(bool enabled)
{ {
QTC_ASSERT(theMainWindow, return); QTC_ASSERT(theMainWindow, return);
@@ -749,13 +761,12 @@ void Perspective::addWindow(QWidget *widget,
void Perspective::select() void Perspective::select()
{ {
if (ModeManager::currentModeId() == Debugger::Constants::MODE_DEBUG && currentPerspective() == this) {
// Prevents additional show events triggering modules and register updates.
return;
}
ModeManager::activateMode(Debugger::Constants::MODE_DEBUG); ModeManager::activateMode(Debugger::Constants::MODE_DEBUG);
theMainWindow->d->restorePerspective(this); theMainWindow->d->selectPerspective(this);
if (Perspective *parent = Perspective::findPerspective(d->m_parentPerspectiveId))
parent->d->m_lastActiveSubPerspectiveId = d->m_id;
else
d->m_lastActiveSubPerspectiveId.clear();
} }
// ToolbarAction // ToolbarAction

View File

@@ -63,7 +63,8 @@ public:
class DEBUGGER_EXPORT Perspective class DEBUGGER_EXPORT Perspective
{ {
public: public:
explicit Perspective(const QString &id, const QString &name); Perspective(const QString &id, const QString &name,
const QString &parentPerspectiveId = QString());
~Perspective(); ~Perspective();
enum OperationType { SplitVertical, SplitHorizontal, AddToTab, Raise }; enum OperationType { SplitVertical, SplitHorizontal, AddToTab, Raise };
@@ -89,7 +90,6 @@ public:
void setAboutToActivateCallback(const Callback &cb); void setAboutToActivateCallback(const Callback &cb);
void aboutToActivate() const; void aboutToActivate() const;
void setParentPerspective(const QString &parentPerspectiveId);
void setEnabled(bool enabled); void setEnabled(bool enabled);
void select(); void select();

View File

@@ -615,8 +615,8 @@ void DebuggerRunTool::start()
return; return;
} }
m_engine->setRunTool(this);
m_engine->setRunParameters(m_runParameters); m_engine->setRunParameters(m_runParameters);
m_engine->setRunTool(this);
m_engine->setCompanionEngine(m_engine2); m_engine->setCompanionEngine(m_engine2);
connect(m_engine, &DebuggerEngine::requestRunControlFinish, connect(m_engine, &DebuggerEngine::requestRunControlFinish,
runControl(), &RunControl::initiateFinish); runControl(), &RunControl::initiateFinish);
@@ -644,8 +644,8 @@ void DebuggerRunTool::start()
}); });
if (m_engine2) { if (m_engine2) {
m_engine2->setRunTool(this);
m_engine2->setRunParameters(m_runParameters); m_engine2->setRunParameters(m_runParameters);
m_engine2->setRunTool(this);
m_engine2->setCompanionEngine(m_engine); m_engine2->setCompanionEngine(m_engine);
m_engine2->setSecondaryEngine(); m_engine2->setSecondaryEngine();
connect(m_engine2, &DebuggerEngine::requestRunControlFinish, connect(m_engine2, &DebuggerEngine::requestRunControlFinish,