@@ -139,6 +139,14 @@ class DockContainerWidgetPrivate
139139 void dropIntoSection (CFloatingDockContainer* FloatingWidget,
140140 CDockAreaWidget* TargetArea, DockWidgetArea area);
141141
142+ /* *
143+ * Creates a new tab for a widget dropped into the center of a section
144+ */
145+ void dropIntoCenterOfSection (CFloatingDockContainer* FloatingWidget,
146+ CDockAreaWidget* TargetArea);
147+
148+ void dropIntoSectionWithSameOrientation ();
149+
142150 /* *
143151 * Adds new dock areas to the internal dock area list
144152 */
@@ -344,44 +352,54 @@ void DockContainerWidgetPrivate::dropIntoContainer(CFloatingDockContainer* Float
344352
345353
346354// ============================================================================
347- void DockContainerWidgetPrivate::dropIntoSection (CFloatingDockContainer* FloatingWidget,
348- CDockAreaWidget* TargetArea, DockWidgetArea area )
355+ void DockContainerWidgetPrivate::dropIntoCenterOfSection (
356+ CFloatingDockContainer* FloatingWidget, CDockAreaWidget* TargetArea )
349357{
350358 CDockContainerWidget* FloatingContainer = FloatingWidget->dockContainer ();
351- // Dropping into center means all dock widgets in the dropped floating
352- // widget will become tabs of the drop area
353- if (CenterDockWidgetArea == area)
359+ auto NewDockWidgets = FloatingContainer->dockWidgets ();
360+ auto TopLevelDockArea = FloatingContainer->topLevelDockArea ();
361+ int NewCurrentIndex = -1 ;
362+
363+ // If the floating widget contains only one single dock are, then the
364+ // current dock widget of the dock area will also be the future current
365+ // dock widget in the drop area.
366+ if (TopLevelDockArea)
354367 {
355- auto NewDockWidgets = FloatingContainer->dockWidgets ();
356- auto TopLevelDockArea = FloatingContainer->topLevelDockArea ();
357- int NewCurrentIndex = -1 ;
368+ NewCurrentIndex = TopLevelDockArea->currentIndex ();
369+ }
358370
359- // If the floating widget contains only one single dock are, then the
360- // current dock widget of the dock area will also be the future current
361- // dock widget in the drop area.
362- if (TopLevelDockArea)
371+ for (int i = 0 ; i < NewDockWidgets.count (); ++i)
372+ {
373+ CDockWidget* DockWidget = NewDockWidgets[i];
374+ TargetArea->insertDockWidget (i, DockWidget, false );
375+ // If the floating widget contains multiple visible dock areas, then we
376+ // simply pick the first visible open dock widget and make it
377+ // the current one.
378+ if (NewCurrentIndex < 0 && !DockWidget->isClosed ())
363379 {
364- NewCurrentIndex = TopLevelDockArea-> currentIndex () ;
380+ NewCurrentIndex = i ;
365381 }
382+ }
383+ TargetArea->setCurrentIndex (NewCurrentIndex);
384+ FloatingWidget->deleteLater ();
385+ TargetArea->updateTitleBarVisibility ();
386+ return ;
387+ }
366388
367- for (int i = 0 ; i < NewDockWidgets.count (); ++i)
368- {
369- CDockWidget* DockWidget = NewDockWidgets[i];
370- TargetArea->insertDockWidget (i, DockWidget, false );
371- // If the floating widget contains multiple visible dock areas, then we
372- // simply pick the first visible open dock widget and make it
373- // the current one.
374- if (NewCurrentIndex < 0 && !DockWidget->isClosed ())
375- {
376- NewCurrentIndex = i;
377- }
378- }
379- TargetArea->setCurrentIndex (NewCurrentIndex);
380- FloatingWidget->deleteLater ();
381- TargetArea->updateTitleBarVisibility ();
389+
390+ // ============================================================================
391+ void DockContainerWidgetPrivate::dropIntoSection (CFloatingDockContainer* FloatingWidget,
392+ CDockAreaWidget* TargetArea, DockWidgetArea area)
393+ {
394+ // Dropping into center means all dock widgets in the dropped floating
395+ // widget will become tabs of the drop area
396+ if (CenterDockWidgetArea == area)
397+ {
398+ dropIntoCenterOfSection (FloatingWidget, TargetArea);
382399 return ;
383400 }
384401
402+ CDockContainerWidget* FloatingContainer = FloatingWidget->dockContainer ();
385403 auto InsertParam = internal::dockAreaInsertParameters (area);
386404 auto NewDockAreas = FloatingWidget->dockContainer ()->findChildren <CDockAreaWidget*>(
387405 QString (), Qt::FindChildrenRecursively);
@@ -396,40 +414,65 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
396414 }
397415 int AreaIndex = TargetAreaSplitter->indexOf (TargetArea);
398416 auto Widget = FloatingWidget->dockContainer ()->findChild <QWidget*>(QString (), Qt::FindDirectChildrenOnly);
399- auto FloatingSplitter = dynamic_cast <QSplitter*>(Widget);
417+ auto FloatingSplitter = qobject_cast <QSplitter*>(Widget);
400418
401419 if (TargetAreaSplitter->orientation () == InsertParam.orientation ())
402420 {
421+ auto Sizes = TargetAreaSplitter->sizes ();
422+ int TargetAreaSize = (InsertParam.orientation () == Qt::Horizontal) ? TargetArea->width () : TargetArea->height ();
423+ bool AdjustSplitterSizes = true ;
403424 if ((FloatingSplitter->orientation () != InsertParam.orientation ()) && FloatingSplitter->count () > 1 )
404425 {
405426 TargetAreaSplitter->insertWidget (AreaIndex + InsertParam.insertOffset (), Widget);
406427 }
407428 else
408429 {
430+ AdjustSplitterSizes = (FloatingSplitter->count () == 1 );
409431 int InsertIndex = AreaIndex + InsertParam.insertOffset ();
410432 while (FloatingSplitter->count ())
411433 {
412434 TargetAreaSplitter->insertWidget (InsertIndex++, FloatingSplitter->widget (0 ));
413435 }
414436 }
437+
438+ if (AdjustSplitterSizes)
439+ {
440+ int Size = (TargetAreaSize - TargetAreaSplitter->handleWidth ()) / 2 ;
441+ Sizes[AreaIndex] = Size;
442+ Sizes.insert (AreaIndex, Size);
443+ TargetAreaSplitter->setSizes (Sizes);
444+ }
415445 }
416446 else
417447 {
448+ QList<int > NewSplitterSizes;
418449 QSplitter* NewSplitter = newSplitter (InsertParam.orientation ());
450+ int TargetAreaSize = (InsertParam.orientation () == Qt::Horizontal) ? TargetArea->width () : TargetArea->height ();
451+ bool AdjustSplitterSizes = true ;
419452 if ((FloatingSplitter->orientation () != InsertParam.orientation ()) && FloatingSplitter->count () > 1 )
420453 {
421454 NewSplitter->addWidget (Widget);
422455 }
423456 else
424457 {
458+ AdjustSplitterSizes = (FloatingSplitter->count () == 1 );
425459 while (FloatingSplitter->count ())
426460 {
427461 NewSplitter->addWidget (FloatingSplitter->widget (0 ));
428462 }
429463 }
430464
431- TargetAreaSplitter->insertWidget (AreaIndex, NewSplitter);
465+ // Save the sizes before insertion and restore it later to prevent
466+ // shrinking of existing area
467+ auto Sizes = TargetAreaSplitter->sizes ();
432468 insertWidgetIntoSplitter (NewSplitter, TargetArea, !InsertParam.append ());
469+ if (AdjustSplitterSizes)
470+ {
471+ int Size = TargetAreaSize / 2 ;
472+ NewSplitter->setSizes ({Size, Size});
473+ }
474+ TargetAreaSplitter->insertWidget (AreaIndex, NewSplitter);
475+ TargetAreaSplitter->setSizes (Sizes);
433476 }
434477
435478 FloatingWidget->deleteLater ();
@@ -1026,10 +1069,12 @@ void CDockContainerWidget::removeDockArea(CDockAreaWidget* area)
10261069 else if (Splitter->count () == 1 )
10271070 {
10281071 qDebug () << " Replacing splitter with content" ;
1072+ QSplitter* ParentSplitter = internal::findParent<QSplitter*>(Splitter);
1073+ auto Sizes = ParentSplitter->sizes ();
10291074 QWidget* widget = Splitter->widget (0 );
10301075 widget->setParent (this );
1031- QSplitter* ParentSplitter = internal::findParent<QSplitter*>(Splitter);
10321076 internal::replaceSplitterWidget (ParentSplitter, Splitter, widget);
1077+ ParentSplitter->setSizes (Sizes);
10331078 }
10341079
10351080 delete Splitter;
0 commit comments