@@ -139,6 +139,14 @@ class DockContainerWidgetPrivate
139
139
void dropIntoSection (CFloatingDockContainer* FloatingWidget,
140
140
CDockAreaWidget* TargetArea, DockWidgetArea area);
141
141
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
+
142
150
/* *
143
151
* Adds new dock areas to the internal dock area list
144
152
*/
@@ -344,44 +352,54 @@ void DockContainerWidgetPrivate::dropIntoContainer(CFloatingDockContainer* Float
344
352
345
353
346
354
// ============================================================================
347
- void DockContainerWidgetPrivate::dropIntoSection (CFloatingDockContainer* FloatingWidget,
348
- CDockAreaWidget* TargetArea, DockWidgetArea area )
355
+ void DockContainerWidgetPrivate::dropIntoCenterOfSection (
356
+ CFloatingDockContainer* FloatingWidget, CDockAreaWidget* TargetArea )
349
357
{
350
358
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)
354
367
{
355
- auto NewDockWidgets = FloatingContainer->dockWidgets ();
356
- auto TopLevelDockArea = FloatingContainer->topLevelDockArea ();
357
- int NewCurrentIndex = -1 ;
368
+ NewCurrentIndex = TopLevelDockArea->currentIndex ();
369
+ }
358
370
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 ())
363
379
{
364
- NewCurrentIndex = TopLevelDockArea-> currentIndex () ;
380
+ NewCurrentIndex = i ;
365
381
}
382
+ }
383
+ TargetArea->setCurrentIndex (NewCurrentIndex);
384
+ FloatingWidget->deleteLater ();
385
+ TargetArea->updateTitleBarVisibility ();
386
+ return ;
387
+ }
366
388
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);
382
399
return ;
383
400
}
384
401
402
+ CDockContainerWidget* FloatingContainer = FloatingWidget->dockContainer ();
385
403
auto InsertParam = internal::dockAreaInsertParameters (area);
386
404
auto NewDockAreas = FloatingWidget->dockContainer ()->findChildren <CDockAreaWidget*>(
387
405
QString (), Qt::FindChildrenRecursively);
@@ -396,40 +414,65 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
396
414
}
397
415
int AreaIndex = TargetAreaSplitter->indexOf (TargetArea);
398
416
auto Widget = FloatingWidget->dockContainer ()->findChild <QWidget*>(QString (), Qt::FindDirectChildrenOnly);
399
- auto FloatingSplitter = dynamic_cast <QSplitter*>(Widget);
417
+ auto FloatingSplitter = qobject_cast <QSplitter*>(Widget);
400
418
401
419
if (TargetAreaSplitter->orientation () == InsertParam.orientation ())
402
420
{
421
+ auto Sizes = TargetAreaSplitter->sizes ();
422
+ int TargetAreaSize = (InsertParam.orientation () == Qt::Horizontal) ? TargetArea->width () : TargetArea->height ();
423
+ bool AdjustSplitterSizes = true ;
403
424
if ((FloatingSplitter->orientation () != InsertParam.orientation ()) && FloatingSplitter->count () > 1 )
404
425
{
405
426
TargetAreaSplitter->insertWidget (AreaIndex + InsertParam.insertOffset (), Widget);
406
427
}
407
428
else
408
429
{
430
+ AdjustSplitterSizes = (FloatingSplitter->count () == 1 );
409
431
int InsertIndex = AreaIndex + InsertParam.insertOffset ();
410
432
while (FloatingSplitter->count ())
411
433
{
412
434
TargetAreaSplitter->insertWidget (InsertIndex++, FloatingSplitter->widget (0 ));
413
435
}
414
436
}
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
+ }
415
445
}
416
446
else
417
447
{
448
+ QList<int > NewSplitterSizes;
418
449
QSplitter* NewSplitter = newSplitter (InsertParam.orientation ());
450
+ int TargetAreaSize = (InsertParam.orientation () == Qt::Horizontal) ? TargetArea->width () : TargetArea->height ();
451
+ bool AdjustSplitterSizes = true ;
419
452
if ((FloatingSplitter->orientation () != InsertParam.orientation ()) && FloatingSplitter->count () > 1 )
420
453
{
421
454
NewSplitter->addWidget (Widget);
422
455
}
423
456
else
424
457
{
458
+ AdjustSplitterSizes = (FloatingSplitter->count () == 1 );
425
459
while (FloatingSplitter->count ())
426
460
{
427
461
NewSplitter->addWidget (FloatingSplitter->widget (0 ));
428
462
}
429
463
}
430
464
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 ();
432
468
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);
433
476
}
434
477
435
478
FloatingWidget->deleteLater ();
@@ -1026,10 +1069,12 @@ void CDockContainerWidget::removeDockArea(CDockAreaWidget* area)
1026
1069
else if (Splitter->count () == 1 )
1027
1070
{
1028
1071
qDebug () << " Replacing splitter with content" ;
1072
+ QSplitter* ParentSplitter = internal::findParent<QSplitter*>(Splitter);
1073
+ auto Sizes = ParentSplitter->sizes ();
1029
1074
QWidget* widget = Splitter->widget (0 );
1030
1075
widget->setParent (this );
1031
- QSplitter* ParentSplitter = internal::findParent<QSplitter*>(Splitter);
1032
1076
internal::replaceSplitterWidget (ParentSplitter, Splitter, widget);
1077
+ ParentSplitter->setSizes (Sizes);
1033
1078
}
1034
1079
1035
1080
delete Splitter;
0 commit comments