Skip to content

Commit 32e5d59

Browse files
Improved handling of sizes when dropping or removing content
1 parent 48382cc commit 32e5d59

File tree

2 files changed

+76
-32
lines changed

2 files changed

+76
-32
lines changed

src/DockContainerWidget.cpp

Lines changed: 76 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

src/DockWidgetTab.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,6 @@ void CDockWidgetTab::mouseMoveEvent(QMouseEvent* ev)
346346
void CDockWidgetTab::contextMenuEvent(QContextMenuEvent* ev)
347347
{
348348
ev->accept();
349-
std::cout << "CDockAreaTabBar::onTabContextMenuRequested" << std::endl;
350349

351350
d->DragStartMousePosition = ev->pos();
352351
QMenu Menu(this);

0 commit comments

Comments
 (0)