Skip to content

Commit 2bc8eff

Browse files
committed
Add ability to specify an area percentage in ToolWindowManager
1 parent 35a30be commit 2bc8eff

2 files changed

Lines changed: 39 additions & 3 deletions

File tree

qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.cpp

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,12 @@ void ToolWindowManager::moveToolWindows(QList<QWidget *> toolWindows,
163163
}
164164
bool useParentSplitter = false;
165165
int indexInParentSplitter = 0;
166+
QList<QRect> parentSplitterGeometries;
166167
if (parentSplitter) {
167168
indexInParentSplitter = parentSplitter->indexOf(area.widget());
169+
for(int i = 0; i < parentSplitter->count(); i++) {
170+
parentSplitterGeometries.push_back(parentSplitter->widget(i)->geometry());
171+
}
168172
if (parentSplitter->orientation() == Qt::Vertical) {
169173
useParentSplitter = area.type() == TopOf || area.type() == BottomOf;
170174
} else {
@@ -187,20 +191,49 @@ void ToolWindowManager::moveToolWindows(QList<QWidget *> toolWindows,
187191
} else {
188192
splitter->setOrientation(Qt::Horizontal);
189193
}
194+
195+
ToolWindowManagerArea* newArea = createArea();
196+
197+
// inherit the size policy from the widget we are wrapping
198+
splitter->setSizePolicy(area.widget()->sizePolicy());
199+
200+
// store old geometries so we can restore them
201+
QRect areaGeometry = area.widget()->geometry();
202+
QRect newGeometry = newArea->geometry();
203+
190204
splitter->addWidget(area.widget());
191205
area.widget()->show();
192-
ToolWindowManagerArea* newArea = createArea();
206+
207+
int indexInSplitter = 0;
208+
193209
if (area.type() == TopOf || area.type() == LeftOf) {
194210
splitter->insertWidget(0, newArea);
211+
indexInSplitter = 0;
195212
} else {
196213
splitter->addWidget(newArea);
214+
indexInSplitter = 1;
197215
}
216+
217+
// Convert area percentage desired to a stretch factor.
218+
const int totalStretch = 100;
219+
int pct = int(totalStretch*area.percentage());
220+
splitter->setStretchFactor(indexInSplitter, pct);
221+
splitter->setStretchFactor(1-indexInSplitter, totalStretch-pct);
222+
198223
if (parentSplitter) {
199224
parentSplitter->insertWidget(indexInParentSplitter, splitter);
225+
226+
for(int i = 0; i < qMin(parentSplitter->count(), parentSplitterGeometries.count()); i++) {
227+
parentSplitter->widget(i)->setGeometry(parentSplitterGeometries[i]);
228+
}
200229
} else {
201230
wrapper->layout()->addWidget(splitter);
202231
}
232+
203233
newArea->addToolWindows(toolWindows);
234+
235+
area.widget()->setGeometry(areaGeometry);
236+
newArea->setGeometry(newGeometry);
204237
}
205238
} else if (area.type() == EmptySpace) {
206239
ToolWindowManagerArea* newArea = createArea();
@@ -709,8 +742,9 @@ QSplitter *ToolWindowManager::createSplitter() {
709742
return splitter;
710743
}
711744

712-
ToolWindowManager::AreaReference::AreaReference(ToolWindowManager::AreaReferenceType type, ToolWindowManagerArea *area) {
745+
ToolWindowManager::AreaReference::AreaReference(ToolWindowManager::AreaReferenceType type, ToolWindowManagerArea *area, float percentage) {
713746
m_type = type;
747+
m_percentage = percentage;
714748
setWidget(area);
715749
}
716750

qrenderdoc/3rdparty/toolwindowmanager/ToolWindowManager.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ class ToolWindowManager : public QWidget {
144144
* Creates an area reference of the given \a type. If \a type requires specifying
145145
* area, it should be given in \a area argument. Otherwise \a area should have default value (0).
146146
*/
147-
AreaReference(AreaReferenceType type = NoArea, ToolWindowManagerArea* area = 0);
147+
AreaReference(AreaReferenceType type = NoArea, ToolWindowManagerArea* area = 0, float percentage = 0.5f);
148148
//! Returns type of the reference.
149149
AreaReferenceType type() const { return m_type; }
150150
//! Returns area of the reference, or 0 if it was not specified.
@@ -153,7 +153,9 @@ class ToolWindowManager : public QWidget {
153153
private:
154154
AreaReferenceType m_type;
155155
QWidget* m_widget;
156+
float m_percentage;
156157
QWidget* widget() const { return m_widget; }
158+
float percentage() const { return m_percentage; }
157159
AreaReference(AreaReferenceType type, QWidget* widget);
158160
void setWidget(QWidget* widget);
159161

0 commit comments

Comments
 (0)