forked from qt-creator/qt-creator
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.
This commit is contained in:
@@ -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);
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user