@@ -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
0 commit comments