Only look at valid suggestions of docks, not docks in other managers

This commit is contained in:
baldurk
2016-09-29 16:32:27 +02:00
parent a356aef23f
commit 2f63389b8b
3 changed files with 42 additions and 1 deletions
+38 -1
View File
@@ -548,7 +548,44 @@ void ToolWindowManager::findSuggestions(ToolWindowManagerWrapper* wrapper) {
QPoint globalPos = QCursor::pos();
QList<QWidget*> candidates;
foreach(QSplitter* splitter, wrapper->findChildren<QSplitter*>()) {
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<QSplitter*>(parent);
QTabWidget *parentTab = qobject_cast<QTabWidget*>(parent);
// keep recursing up what looks like our hierarchy
if(parentSplitter || parentTab)
{
w = parent;
continue;
}
ToolWindowManagerArea* area = qobject_cast<ToolWindowManagerArea*>(parent);
ToolWindowManagerWrapper* wrapper = qobject_cast<ToolWindowManagerWrapper*>(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()) {
@@ -57,6 +57,8 @@ public:
*/
QList<QWidget*> toolWindows();
ToolWindowManager* manager() { return m_manager; }
/*!
* Updates the \a toolWindow to its current properties and title.
*/
@@ -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 *);