From 21ce4e59a45333b8b4d1f03d47dd862bc7b75245 Mon Sep 17 00:00:00 2001 From: Eike Ziller <eike.ziller@digia.com> Date: Thu, 25 Apr 2013 19:19:22 +0200 Subject: [PATCH] EditorManager: Replace another root-to-leaf search by leaf-to-root. For finding the "parent" SplitterOrView it's much easier to go up the parent hierarchy than doing a depth-first search from the root. Change-Id: I4c8e195dae2d1f834fb89ab3c213bad5a0fa7d2a Reviewed-by: David Schulz <david.schulz@digia.com> --- .../coreplugin/editormanager/editormanager.cpp | 2 +- .../coreplugin/editormanager/editorview.cpp | 16 +++++++--------- .../coreplugin/editormanager/editorview.h | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 92cd6348273..bbde9d6414f 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -644,7 +644,7 @@ void EditorManager::closeView(Core::Internal::EditorView *view) SplitterOrView *splitterOrView = view->parentSplitterOrView(); Q_ASSERT(splitterOrView); Q_ASSERT(splitterOrView->view() == view); - SplitterOrView *splitter = d->m_splitter->findSplitter(splitterOrView); + SplitterOrView *splitter = splitterOrView->findParentSplitter(); Q_ASSERT(splitterOrView->hasEditors() == false); splitterOrView->hide(); delete splitterOrView; diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index 04f3fd91c85..bbaff3a5ab9 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -514,17 +514,15 @@ EditorView *SplitterOrView::findFirstView() return m_view; } -SplitterOrView *SplitterOrView::findSplitter(SplitterOrView *child) +SplitterOrView *SplitterOrView::findParentSplitter() const { - if (m_splitter) { - for (int i = 0; i < m_splitter->count(); ++i) { - if (SplitterOrView *splitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(i))) { - if (splitterOrView == child) - return this; - if (SplitterOrView *result = splitterOrView->findSplitter(child)) - return result; - } + QWidget *w = parentWidget(); + while (w) { + if (SplitterOrView *splitter = qobject_cast<SplitterOrView *>(w)) { + QTC_CHECK(splitter->splitter()); + return splitter; } + w = w->parentWidget(); } return 0; } diff --git a/src/plugins/coreplugin/editormanager/editorview.h b/src/plugins/coreplugin/editormanager/editorview.h index 74009d04f05..cb90be3482a 100644 --- a/src/plugins/coreplugin/editormanager/editorview.h +++ b/src/plugins/coreplugin/editormanager/editorview.h @@ -182,7 +182,7 @@ public: void restoreState(const QByteArray &); EditorView *findFirstView(); - SplitterOrView *findSplitter(SplitterOrView *child); + SplitterOrView *findParentSplitter() const; EditorView *findNextView(EditorView *view); -- GitLab