diff --git a/src/plugins/coreplugin/editmode.cpp b/src/plugins/coreplugin/editmode.cpp index 9f32c10fe88..cb785f3a5fc 100644 --- a/src/plugins/coreplugin/editmode.cpp +++ b/src/plugins/coreplugin/editmode.cpp @@ -74,14 +74,11 @@ EditMode::EditMode() connect(ModeManager::instance(), &ModeManager::currentModeChanged, this, &EditMode::grabEditorManager); - setWidget(new EditModeWidget); + setWidgetCreator([] { return new EditModeWidget; }); setContext(Context(Constants::C_EDIT_MODE, Constants::C_NAVIGATION_PANE)); } -EditMode::~EditMode() -{ - delete widget(); -} +EditMode::~EditMode() = default; void EditMode::grabEditorManager(Utils::Id mode) { diff --git a/src/plugins/coreplugin/imode.cpp b/src/plugins/coreplugin/imode.cpp index dca3a602ea8..b5ac416b996 100644 --- a/src/plugins/coreplugin/imode.cpp +++ b/src/plugins/coreplugin/imode.cpp @@ -7,6 +7,7 @@ #include #include +#include #include @@ -27,6 +28,7 @@ public: Utils::Id m_id; Context m_context; QPointer m_widget; + std::function m_widgetCreator; bool m_isEnabled = true; BoolAspect m_isVisible; }; @@ -127,7 +129,11 @@ IMode::IMode(QObject *parent) ModeManager::addMode(this); } -IMode::~IMode() = default; +IMode::~IMode() +{ + if (m_d->m_widgetCreator) + delete m_d->m_widget; +} QString IMode::displayName() const { @@ -203,9 +209,18 @@ void IMode::setContext(const Context &context) void IMode::setWidget(QWidget *widget) { + QTC_ASSERT(!m_d->m_widgetCreator, + qWarning("A mode widget should not be set if there is already a widget creator")); m_d->m_widget = widget; } +void IMode::setWidgetCreator(const std::function &widgetCreator) +{ + QTC_ASSERT(!m_d->m_widget, + qWarning("A mode widget widgetCreator should not be set if there is already a widget")); + m_d->m_widgetCreator = widgetCreator; +} + Utils::FancyMainWindow *IMode::mainWindow() { if (m_d->m_mainWindow) @@ -257,6 +272,8 @@ Context IMode::context() const QWidget *IMode::widget() const { + if (!m_d->m_widget && m_d->m_widgetCreator) + m_d->m_widget = m_d->m_widgetCreator(); return m_d->m_widget; } diff --git a/src/plugins/coreplugin/imode.h b/src/plugins/coreplugin/imode.h index ccd00d85558..4a13e858fcd 100644 --- a/src/plugins/coreplugin/imode.h +++ b/src/plugins/coreplugin/imode.h @@ -56,6 +56,7 @@ public: void setMenu(std::function menuFunction); void setContext(const Context &context); void setWidget(QWidget *widget); + void setWidgetCreator(const std::function &widgetCreator); Utils::FancyMainWindow *mainWindow(); void setMainWindow(Utils::FancyMainWindow *mw); diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index d6fe2f6cf22..7747484ab1b 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -500,13 +500,11 @@ public: setPriority(85); setId(MODE_DEBUG); - setWidget(new DebugModeWidget); + setWidgetCreator([] { return new DebugModeWidget; }); setMainWindow(DebuggerMainWindow::instance()); setMenu(&DebuggerMainWindow::addPerspectiveMenu); } - - ~DebugMode() { delete widget(); } }; ///////////////////////////////////////////////////////////////////////