From 6c4eb5cf71c98edfbc60e241ecbb3dbd4948464a Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 22 Jun 2017 10:10:44 +0100 Subject: [PATCH] Update toolwindowmanager to 6f1c258 --- .../toolwindowmanager/ToolWindowManager.cpp | 40 ++++++++++++++----- .../toolwindowmanager/ToolWindowManager.h | 2 + .../ToolWindowManagerWrapper.cpp | 9 ++++- 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.cpp b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.cpp index e031bbe80..7b52d1786 100644 --- a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.cpp +++ b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.cpp @@ -368,6 +368,18 @@ void ToolWindowManager::removeToolWindow(QWidget *toolWindow) { qWarning("unknown tool window"); return; } + + // search up to find the first parent manager + ToolWindowManager *manager = findClosestParent(toolWindow); + + if (!manager) { + qWarning("unknown tool window"); + return; + } + + if (!manager->allowClose(toolWindow)) + return; + moveToolWindow(toolWindow, NoArea); m_toolWindows.removeOne(toolWindow); m_toolWindowProperties.remove(toolWindow); @@ -1128,6 +1140,23 @@ bool ToolWindowManager::eventFilter(QObject *object, QEvent *event) { return QWidget::eventFilter(object, event); } +bool ToolWindowManager::allowClose(QWidget *toolWindow) { + if (!m_toolWindows.contains(toolWindow)) { + qWarning("unknown tool window"); + return true; + } + int methodIndex = toolWindow->metaObject()->indexOfMethod(QMetaObject::normalizedSignature("checkAllowClose()")); + + if(methodIndex >= 0) { + bool ret = true; + toolWindow->metaObject()->method(methodIndex).invoke(toolWindow, Qt::DirectConnection, Q_RETURN_ARG(bool, ret)); + + return ret; + } + + return true; +} + void ToolWindowManager::tabCloseRequested(int index) { ToolWindowManagerArea* tabWidget = qobject_cast(sender()); if (!tabWidget) { @@ -1140,15 +1169,8 @@ void ToolWindowManager::tabCloseRequested(int index) { return; } - int methodIndex = toolWindow->metaObject()->indexOfMethod(QMetaObject::normalizedSignature("checkAllowClose()")); - - if(methodIndex >= 0) { - bool ret = true; - toolWindow->metaObject()->method(methodIndex).invoke(toolWindow, Qt::DirectConnection, Q_RETURN_ARG(bool, ret)); - - if(!ret) - return; - } + if (!allowClose(toolWindow)) + return; if(toolWindowProperties(toolWindow) & ToolWindowManager::HideOnClose) hideToolWindow(toolWindow); diff --git a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.h b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.h index a1dffa515..76522f7c5 100644 --- a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.h +++ b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.h @@ -300,6 +300,8 @@ private: void drawHotspotPixmaps(); + bool allowClose(QWidget *toolWindow); + // last widget used for adding tool windows, or 0 if there isn't one // (warning: may contain pointer to deleted object) ToolWindowManagerArea* m_lastUsedArea; diff --git a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManagerWrapper.cpp b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManagerWrapper.cpp index 0f28b3aab..2eb8fbd77 100644 --- a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManagerWrapper.cpp +++ b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManagerWrapper.cpp @@ -148,7 +148,7 @@ void ToolWindowManagerWrapper::updateTitle() { setWindowTitle(QStringLiteral("Tool Window")); } -void ToolWindowManagerWrapper::closeEvent(QCloseEvent *) { +void ToolWindowManagerWrapper::closeEvent(QCloseEvent *event) { QList toolWindows; foreach(ToolWindowManagerArea* tabWidget, findChildren()) { if (ToolWindowManager::managerOf(tabWidget) == m_manager) { @@ -156,6 +156,13 @@ void ToolWindowManagerWrapper::closeEvent(QCloseEvent *) { } } + foreach(QWidget* toolWindow, toolWindows) { + if (!m_manager->allowClose(toolWindow)) { + event->ignore(); + return; + } + } + foreach(QWidget* toolWindow, toolWindows) { if(m_manager->toolWindowProperties(toolWindow) & ToolWindowManager::HideOnClose) m_manager->hideToolWindow(toolWindow);