From 2bc8effd3dcf8add7dfd235ddec6e202a19fcaa6 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 29 Sep 2016 15:23:18 +0200 Subject: [PATCH] Add ability to specify an area percentage in ToolWindowManager --- .../toolwindowmanager/ToolWindowManager.cpp | 38 ++++++++++++++++++- .../toolwindowmanager/ToolWindowManager.h | 4 +- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.cpp b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.cpp index baf2251f5..d2a8ec1f1 100644 --- a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.cpp +++ b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.cpp @@ -163,8 +163,12 @@ void ToolWindowManager::moveToolWindows(QList toolWindows, } bool useParentSplitter = false; int indexInParentSplitter = 0; + QList parentSplitterGeometries; if (parentSplitter) { indexInParentSplitter = parentSplitter->indexOf(area.widget()); + for(int i = 0; i < parentSplitter->count(); i++) { + parentSplitterGeometries.push_back(parentSplitter->widget(i)->geometry()); + } if (parentSplitter->orientation() == Qt::Vertical) { useParentSplitter = area.type() == TopOf || area.type() == BottomOf; } else { @@ -187,20 +191,49 @@ void ToolWindowManager::moveToolWindows(QList toolWindows, } else { splitter->setOrientation(Qt::Horizontal); } + + ToolWindowManagerArea* newArea = createArea(); + + // inherit the size policy from the widget we are wrapping + splitter->setSizePolicy(area.widget()->sizePolicy()); + + // store old geometries so we can restore them + QRect areaGeometry = area.widget()->geometry(); + QRect newGeometry = newArea->geometry(); + splitter->addWidget(area.widget()); area.widget()->show(); - ToolWindowManagerArea* newArea = createArea(); + + int indexInSplitter = 0; + if (area.type() == TopOf || area.type() == LeftOf) { splitter->insertWidget(0, newArea); + indexInSplitter = 0; } else { splitter->addWidget(newArea); + indexInSplitter = 1; } + + // Convert area percentage desired to a stretch factor. + const int totalStretch = 100; + int pct = int(totalStretch*area.percentage()); + splitter->setStretchFactor(indexInSplitter, pct); + splitter->setStretchFactor(1-indexInSplitter, totalStretch-pct); + if (parentSplitter) { parentSplitter->insertWidget(indexInParentSplitter, splitter); + + for(int i = 0; i < qMin(parentSplitter->count(), parentSplitterGeometries.count()); i++) { + parentSplitter->widget(i)->setGeometry(parentSplitterGeometries[i]); + } } else { wrapper->layout()->addWidget(splitter); } + newArea->addToolWindows(toolWindows); + + area.widget()->setGeometry(areaGeometry); + newArea->setGeometry(newGeometry); } } else if (area.type() == EmptySpace) { ToolWindowManagerArea* newArea = createArea(); @@ -709,8 +742,9 @@ QSplitter *ToolWindowManager::createSplitter() { return splitter; } -ToolWindowManager::AreaReference::AreaReference(ToolWindowManager::AreaReferenceType type, ToolWindowManagerArea *area) { +ToolWindowManager::AreaReference::AreaReference(ToolWindowManager::AreaReferenceType type, ToolWindowManagerArea *area, float percentage) { m_type = type; + m_percentage = percentage; setWidget(area); } diff --git a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.h b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.h index 5bb274a7b..3aa1fc052 100644 --- a/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.h +++ b/qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.h @@ -144,7 +144,7 @@ public: * Creates an area reference of the given \a type. If \a type requires specifying * area, it should be given in \a area argument. Otherwise \a area should have default value (0). */ - AreaReference(AreaReferenceType type = NoArea, ToolWindowManagerArea* area = 0); + AreaReference(AreaReferenceType type = NoArea, ToolWindowManagerArea* area = 0, float percentage = 0.5f); //! Returns type of the reference. AreaReferenceType type() const { return m_type; } //! Returns area of the reference, or 0 if it was not specified. @@ -153,7 +153,9 @@ public: private: AreaReferenceType m_type; QWidget* m_widget; + float m_percentage; QWidget* widget() const { return m_widget; } + float percentage() const { return m_percentage; } AreaReference(AreaReferenceType type, QWidget* widget); void setWidget(QWidget* widget);