From fb056b1a731b3a3c5137ee10797a0feaa0dc8598 Mon Sep 17 00:00:00 2001 From: con <qtc-committer@nokia.com> Date: Wed, 8 Apr 2009 15:58:08 +0200 Subject: [PATCH] Don't crash when unsplitting more complicated editor splits. Whenever we want to re-use widgets from the former child SplitterOrView, we must make sure that this doesn't delete it later on. --- .../coreplugin/editormanager/editorview.cpp | 24 +++++++++++++++---- .../coreplugin/editormanager/editorview.h | 2 ++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index 930a20c2dfd..48edfc1a009 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -835,6 +835,24 @@ QSize SplitterOrView::minimumSizeHint() const return QSize(64, 64); } +QSplitter *SplitterOrView::takeSplitter() +{ + QSplitter *oldSplitter = m_splitter; + if (m_splitter) + m_layout->removeWidget(m_splitter); + m_splitter = 0; + return oldSplitter; +} + +EditorView *SplitterOrView::takeView() +{ + EditorView *oldView = m_view; + if (m_view) + m_layout->removeWidget(m_view); + m_view = 0; + return oldView; +} + void SplitterOrView::split(Qt::Orientation orientation) { Q_ASSERT(m_view && m_splitter == 0); @@ -903,13 +921,12 @@ void SplitterOrView::unsplit() Q_ASSERT(m_splitter->count() == 1); EditorManager *em = CoreImpl::instance()->editorManager(); SplitterOrView *childSplitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(0)); - QSplitter *oldSplitter = m_splitter; m_splitter = 0; if (childSplitterOrView->isSplitter()) { Q_ASSERT(childSplitterOrView->view() == 0); - m_splitter = childSplitterOrView->splitter(); + m_splitter = childSplitterOrView->takeSplitter(); m_layout->addWidget(m_splitter); m_layout->setCurrentWidget(m_splitter); } else { @@ -923,8 +940,7 @@ void SplitterOrView::unsplit() } em->emptyView(childView); } else { - m_view = childView; - childSplitterOrView->m_layout->removeWidget(m_view); + m_view = childSplitterOrView->takeView(); m_layout->addWidget(m_view); } m_layout->setCurrentWidget(m_view); diff --git a/src/plugins/coreplugin/editormanager/editorview.h b/src/plugins/coreplugin/editormanager/editorview.h index d198155ca3d..13eb957b299 100644 --- a/src/plugins/coreplugin/editormanager/editorview.h +++ b/src/plugins/coreplugin/editormanager/editorview.h @@ -197,6 +197,8 @@ public: inline bool hasEditors() const { return m_view && m_view->editorCount() != 0; } inline EditorView *view() const { return m_view; } inline QSplitter *splitter() const { return m_splitter; } + QSplitter *takeSplitter(); + EditorView *takeView(); SplitterOrView *findView(Core::IEditor *editor); -- GitLab