From 665c287679935d99b60e7502dacef0220fce30ad Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 29 Apr 2021 15:31:51 +0100 Subject: [PATCH] Update toolwindowmanager to 23572b51 --- .../toolwindowmanager/ToolWindowManager.cpp | 28 +++++++++++++++---- .../toolwindowmanager/ToolWindowManager.h | 6 ++-- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.cpp b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.cpp index 701980a83..511c6368f 100644 --- a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.cpp +++ b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.cpp @@ -822,7 +822,9 @@ void ToolWindowManager::startDrag(const QList &toolWindows, } m_draggedWrapper = wrapper; - m_draggedToolWindows = toolWindows; + m_draggedToolWindows.clear(); + for(QWidget *w : toolWindows) + m_draggedToolWindows.push_back(w); qApp->installEventFilter(this); } @@ -1194,8 +1196,9 @@ void ToolWindowManager::updateDragPosition() { bool allowFloat = m_allowFloatingWindow; - for(QWidget *w : m_draggedToolWindows) - allowFloat &= !(toolWindowProperties(w) & DisallowFloatWindow); + for(QPointer w : m_draggedToolWindows) + if(w) + allowFloat &= !(toolWindowProperties(w) & DisallowFloatWindow); // no hotspot highlighted, draw geometry for a float window if previewing a tear-off, or draw // nothing if we're dragging a float window as it moves itself. @@ -1207,9 +1210,9 @@ void ToolWindowManager::updateDragPosition() else { QRect r; - for(QWidget *w : m_draggedToolWindows) + for(QPointer w : m_draggedToolWindows) { - if(w->isVisible()) + if(w && w->isVisible()) r = r.united(w->rect()); } m_previewOverlay->setGeometry(pos.x(), pos.y(), r.width(), r.height()); @@ -1249,9 +1252,22 @@ void ToolWindowManager::finishDrag() qApp->removeEventFilter(this); // move these locally to prevent re-entrancy - QList draggedToolWindows = m_draggedToolWindows; + QList draggedToolWindows; ToolWindowManagerWrapper *draggedWrapper = m_draggedWrapper; + for(QPointer w : m_draggedToolWindows) + if(w) + draggedToolWindows.push_back(w); + + if(m_draggedToolWindows.size() != draggedToolWindows.size()) + { + qWarning("Some dragged windows were all deleted before finishDrag: %d -> %d", + (int)m_draggedToolWindows.size(), (int)draggedToolWindows.size()); + + if(draggedToolWindows.empty()) + return; + } + m_draggedToolWindows.clear(); m_draggedWrapper = NULL; diff --git a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.h b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.h index 918efe964..9616269d3 100644 --- a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.h +++ b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.h @@ -287,9 +287,9 @@ private: QList m_areas; // all areas for this manager QList m_wrappers; // all wrappers for this manager // list of tool windows that are currently dragged, or empty list if there is no current drag - QList m_draggedToolWindows; - ToolWindowManagerWrapper - *m_draggedWrapper; // the wrapper if a whole float window is being dragged + QList> m_draggedToolWindows; + // the wrapper if a whole float window is being dragged + QPointer m_draggedWrapper; QPointer m_hoverArea; // the area currently being hovered over in a drag // a semi-transparent preview of where the dragged toolwindow(s) will be docked QWidget *m_previewOverlay;