From 2f63389b8b530a23d9f692b7efde38270748ce6e Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 29 Sep 2016 16:32:27 +0200 Subject: [PATCH] Only look at valid suggestions of docks, not docks in other managers --- .../toolwindowmanager/ToolWindowManager.cpp | 39 ++++++++++++++++++- .../toolwindowmanager/ToolWindowManagerArea.h | 2 + .../ToolWindowManagerWrapper.h | 2 + 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.cpp b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.cpp index d2a8ec1f1..22588480e 100644 --- a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.cpp +++ b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.cpp @@ -548,7 +548,44 @@ void ToolWindowManager::findSuggestions(ToolWindowManagerWrapper* wrapper) { QPoint globalPos = QCursor::pos(); QList candidates; foreach(QSplitter* splitter, wrapper->findChildren()) { - candidates << splitter; + // make sure this is one of our layout splitters, not a proper widget or a splitter + // from another manager. We walk the parents, expecting either a QSplitter or QTabWidget + // at each time until we reach an area. + + QWidget *w = splitter; + + bool valid = false; + + while(w) + { + QWidget *parent = w->parentWidget(); + + QSplitter *parentSplitter = qobject_cast(parent); + QTabWidget *parentTab = qobject_cast(parent); + + // keep recursing up what looks like our hierarchy + if(parentSplitter || parentTab) + { + w = parent; + continue; + } + + ToolWindowManagerArea* area = qobject_cast(parent); + ToolWindowManagerWrapper* wrapper = qobject_cast(parent); + + // if it's an area or wrapper, check if it's ours + if(area) + valid = area->manager() == this; + else if(wrapper) + valid = wrapper->manager() == this; + + // we're done now, whether we checked for validity, or if we + // found something that's none of the above + break; + } + + if(valid) + candidates << splitter; } foreach(ToolWindowManagerArea* area, m_areas) { if (area->topLevelWidget() == wrapper->topLevelWidget()) { diff --git a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManagerArea.h b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManagerArea.h index 354ebe2dd..d87789a5e 100644 --- a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManagerArea.h +++ b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManagerArea.h @@ -57,6 +57,8 @@ public: */ QList toolWindows(); + ToolWindowManager* manager() { return m_manager; } + /*! * Updates the \a toolWindow to its current properties and title. */ diff --git a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManagerWrapper.h b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManagerWrapper.h index 4227d98ee..1f9cc0c01 100644 --- a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManagerWrapper.h +++ b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManagerWrapper.h @@ -44,6 +44,8 @@ public: //! Removes the wrapper. virtual ~ToolWindowManagerWrapper(); + ToolWindowManager* manager() { return m_manager; } + protected: //! Reimplemented to register hiding of contained tool windows when user closes the floating window. virtual void closeEvent(QCloseEvent *);