diff --git a/src/plugins/debugger/analyzer/analyzermanager.h b/src/plugins/debugger/analyzer/analyzermanager.h index cafcbf76613..2f69bcab2ae 100644 --- a/src/plugins/debugger/analyzer/analyzermanager.h +++ b/src/plugins/debugger/analyzer/analyzermanager.h @@ -63,8 +63,10 @@ DEBUGGER_EXPORT void showCannotStartDialog(const QString &toolName); // Register a tool for a given start mode. DEBUGGER_EXPORT void registerPerspective(const QByteArray &perspectiveId, const Utils::Perspective *perspective); +DEBUGGER_EXPORT void destroyDynamicPerspective(const QByteArray &perspectiveId); DEBUGGER_EXPORT void setPerspectiveEnabled(const QByteArray &perspectiveId, bool enable); DEBUGGER_EXPORT void registerToolbar(const QByteArray &perspectiveId, const Utils::ToolbarDescription &desc); +DEBUGGER_EXPORT void destroyDynamicToolbar(const QByteArray &perspectiveId); DEBUGGER_EXPORT void enableMainWindow(bool on); DEBUGGER_EXPORT QWidget *mainWindow(); diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp index a482d3762bd..8f67819c0c2 100644 --- a/src/plugins/debugger/debuggermainwindow.cpp +++ b/src/plugins/debugger/debuggermainwindow.cpp @@ -103,10 +103,18 @@ DebuggerMainWindow::~DebuggerMainWindow() void DebuggerMainWindow::registerPerspective(const QByteArray &perspectiveId, const Perspective *perspective) { m_perspectiveForPerspectiveId.insert(perspectiveId, perspective); - m_perspectiveChooser->addItem(perspective->name(), perspectiveId); - // adjust width if necessary + QByteArray parentPerspective = perspective->parentPerspective(); + // Add "main" perspectives to the chooser. + if (parentPerspective.isEmpty()) { + m_perspectiveChooser->addItem(perspective->name(), perspectiveId); + increaseChooserWidthIfNecessary(perspective->name()); + } +} + +void DebuggerMainWindow::increaseChooserWidthIfNecessary(const QString &visibleName) +{ const int oldWidth = m_perspectiveChooser->width(); - const int contentWidth = m_perspectiveChooser->fontMetrics().width(perspective->name()); + const int contentWidth = m_perspectiveChooser->fontMetrics().width(visibleName); QStyleOptionComboBox option; option.initFrom(m_perspectiveChooser); const QSize sz(contentWidth, 1); @@ -116,12 +124,35 @@ void DebuggerMainWindow::registerPerspective(const QByteArray &perspectiveId, co m_perspectiveChooser->setFixedWidth(width); } +void DebuggerMainWindow::destroyDynamicPerspective(const QByteArray &perspectiveId) +{ + savePerspectiveHelper(perspectiveId); + + const Perspective *perspective = m_perspectiveForPerspectiveId.take(perspectiveId); + QTC_ASSERT(perspective, return); + // Dynamic perspectives are currently not visible in the chooser. + // This might change in the future, make sure we notice. + const int idx = m_perspectiveChooser->findData(perspectiveId); + QTC_ASSERT(idx == -1, m_perspectiveChooser->removeItem(idx)); + QByteArray parentPerspective = perspective->parentPerspective(); + delete perspective; + // All dynamic perspectives currently have a static parent perspective. + // This might change in the future, make sure we notice. + QTC_CHECK(!parentPerspective.isEmpty()); + restorePerspective(parentPerspective); +} + void DebuggerMainWindow::registerToolbar(const QByteArray &perspectiveId, QWidget *widget) { m_toolbarForPerspectiveId.insert(perspectiveId, widget); m_controlsStackWidget->addWidget(widget); } +void DebuggerMainWindow::destroyDynamicToolbar(const QByteArray &perspectiveId) +{ + delete m_toolbarForPerspectiveId.take(perspectiveId); +} + void DebuggerMainWindow::showStatusMessage(const QString &message, int timeoutMS) { m_statusLabel->showStatusMessage(message, timeoutMS); @@ -456,6 +487,16 @@ void Perspective::aboutToActivate() const m_aboutToActivateCallback(); } +QByteArray Perspective::parentPerspective() const +{ + return m_parentPerspective; +} + +void Perspective::setParentPerspective(const QByteArray &parentPerspective) +{ + m_parentPerspective = parentPerspective; +} + QList ToolbarDescription::widgets() const { return m_widgets; diff --git a/src/plugins/debugger/debuggermainwindow.h b/src/plugins/debugger/debuggermainwindow.h index 382646daad2..c68cb437e54 100644 --- a/src/plugins/debugger/debuggermainwindow.h +++ b/src/plugins/debugger/debuggermainwindow.h @@ -92,11 +92,15 @@ public: void setAboutToActivateCallback(const Callback &cb); void aboutToActivate() const; + QByteArray parentPerspective() const; + void setParentPerspective(const QByteArray &parentPerspective); + private: Perspective(const Perspective &) = delete; void operator=(const Perspective &) = delete; QString m_name; + QByteArray m_parentPerspective; QVector m_docks; QVector m_operations; QPointer m_centralWidget; @@ -127,7 +131,9 @@ public: ~DebuggerMainWindow() override; void registerPerspective(const QByteArray &perspectiveId, const Perspective *perspective); + void destroyDynamicPerspective(const QByteArray &perspectiveId); void registerToolbar(const QByteArray &perspectiveId, QWidget *widget); + void destroyDynamicToolbar(const QByteArray &perspectiveId); void resetCurrentPerspective(); void restorePerspective(const QByteArray &perspectiveId); @@ -150,6 +156,7 @@ private: QDockWidget *registerDockWidget(const QByteArray &dockId, QWidget *widget); void loadPerspectiveHelper(const QByteArray &perspectiveId, bool fromStoredSettings = true); void savePerspectiveHelper(const QByteArray &perspectiveId); + void increaseChooserWidthIfNecessary(const QString &visibleName); QByteArray m_currentPerspectiveId; QComboBox *m_perspectiveChooser; diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index bf392f16be4..1e2c6d02326 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -3494,6 +3494,11 @@ void registerToolbar(const QByteArray &perspectiveId, const ToolbarDescription & dd->m_mainWindow->registerToolbar(perspectiveId, toolbar); } +void destroyDynamicToolbar(const QByteArray &perspectiveId) +{ + dd->m_mainWindow->destroyDynamicToolbar(perspectiveId); +} + QAction *createStartAction() { auto action = new QAction(DebuggerMainWindow::tr("Start"), DebuggerPlugin::instance()); @@ -3515,6 +3520,11 @@ void registerPerspective(const QByteArray &perspectiveId, const Perspective *per dd->m_mainWindow->registerPerspective(perspectiveId, perspective); } +void destroyDynamicPerspective(const QByteArray &perspectiveId) +{ + dd->m_mainWindow->destroyDynamicPerspective(perspectiveId); +} + void setPerspectiveEnabled(const QByteArray &perspectiveId, bool enabled) { dd->m_mainWindow->setPerspectiveEnabled(perspectiveId, enabled);