Skip to content

Commit 9676eeb

Browse files
author
Uwe Kindler
committed
Fixed removeDockArea function, fixed bug when docking into empty container, fix several small bugs, improved code documentation
1 parent 412f13e commit 9676eeb

File tree

2 files changed

+64
-16
lines changed

2 files changed

+64
-16
lines changed

src/DockContainerWidget.cpp

Lines changed: 63 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ void DockContainerWidgetPrivate::dropIntoContainer(CFloatingDockContainer* Float
169169
auto InsertParam = internal::dockAreaInsertParameters(area);
170170
auto NewDockAreas = FloatingWidget->dockContainer()->findChildren<CDockAreaWidget*>(
171171
QString(), Qt::FindChildrenRecursively);
172+
CDockWidget* DockWidget = FloatingWidget->dockContainer()->findChild<CDockWidget*>();
172173
QSplitter* Splitter = RootSplitter;
173174

174175
if (DockAreas.count() <= 1)
@@ -205,6 +206,10 @@ void DockContainerWidgetPrivate::dropIntoContainer(CFloatingDockContainer* Float
205206
RootSplitter = Splitter;
206207
addDockAreasToList(NewDockAreas);
207208
FloatingWidget->deleteLater();
209+
if (DockWidget)
210+
{
211+
DockWidget->toggleView(true);
212+
}
208213
_this->dumpLayout();
209214
}
210215

@@ -541,8 +546,11 @@ void DockContainerWidgetPrivate::dumpRecursive(int level, QWidget* widget)
541546
buf.fill(' ', level * 4);
542547
if (Splitter)
543548
{
544-
qDebug("%sSplitter %s", (const char*)buf, (Splitter->orientation() == Qt::Vertical)
545-
? "-" : "|");
549+
qDebug("%sSplitter %s v: %s c: %s",
550+
(const char*)buf,
551+
(Splitter->orientation() == Qt::Vertical) ? "-" : "|",
552+
Splitter->isVisibleTo(Splitter->parentWidget()) ? "1" : "0",
553+
QString::number(Splitter->count()).toStdString().c_str());
546554
for (int i = 0; i < Splitter->count(); ++i)
547555
{
548556
dumpRecursive(level + 1, Splitter->widget(i));
@@ -706,22 +714,59 @@ void CDockContainerWidget::removeDockArea(CDockAreaWidget* area)
706714
{
707715
qDebug() << "CDockContainerWidget::removeDockArea";
708716
d->DockAreas.removeAll(area);
709-
QSplitter* Splitter = internal::findParent<QSplitter*>(area);
717+
CDockSplitter* Splitter = internal::findParent<CDockSplitter*>(area);
718+
719+
// Remove are from parent splitter and hide splitter if it has no visible
720+
// content
710721
area->setParent(0);
711-
if (Splitter == d->RootSplitter || Splitter->count() != 1)
722+
Splitter->setVisible(Splitter->hasVisibleContent());
723+
724+
// If splitter has more than 1 widgets, we are finished and can leave
725+
if (Splitter->count() > 1)
712726
{
713-
emit dockAreasRemoved();
714-
return;
727+
goto emitAndExit;
728+
}
729+
730+
// If this is the RootSplitter we need to remove empty splitters to
731+
// avoid too many empty splitters
732+
if (Splitter == d->RootSplitter)
733+
{
734+
qDebug() << "Removed from RootSplitter";
735+
// If splitter is empty, we are finished
736+
if (!Splitter->count())
737+
{
738+
Splitter->hide();
739+
goto emitAndExit;
740+
}
741+
742+
QWidget* widget = Splitter->widget(0);
743+
QSplitter* ChildSplitter = dynamic_cast<QSplitter*>(widget);
744+
// If the one and only content widget of the splitter is not a splitter
745+
// then we are finished
746+
if (!ChildSplitter)
747+
{
748+
goto emitAndExit;
749+
}
750+
751+
// We replace the superfluous RootSplitter with the ChildSplitter
752+
ChildSplitter->setParent(0);
753+
QLayoutItem* li = d->Layout->replaceWidget(Splitter, ChildSplitter);
754+
d->RootSplitter = ChildSplitter;
755+
delete li;
756+
qDebug() << "RootSplitter replaced by child splitter";
757+
}
758+
else if (Splitter->count() == 1)
759+
{
760+
qDebug() << "Replacing splitter with content";
761+
QWidget* widget = Splitter->widget(0);
762+
widget->setParent(this);
763+
QSplitter* ParentSplitter = internal::findParent<QSplitter*>(Splitter);
764+
internal::replaceSplitterWidget(ParentSplitter, Splitter, widget);
715765
}
716766

717-
// It the splitter contains only one single widget, then we do not need
718-
// it anymore and can replace it with its content
719-
qDebug() << "Replacing splitter with content";
720-
QWidget* widget = Splitter->widget(0);
721-
widget->setParent(this);
722-
QSplitter* ParentSplitter = internal::findParent<QSplitter*>(Splitter);
723-
internal::replaceSplitterWidget(ParentSplitter, Splitter, widget);
724767
delete Splitter;
768+
769+
emitAndExit:
725770
dumpLayout();
726771
emit dockAreasRemoved();
727772
}
@@ -732,7 +777,7 @@ CDockAreaWidget* CDockContainerWidget::dockAreaAt(const QPoint& GlobalPos) const
732777
{
733778
for (const auto& DockArea : d->DockAreas)
734779
{
735-
if (DockArea->rect().contains(DockArea->mapFromGlobal(GlobalPos)))
780+
if (DockArea->isVisible() && DockArea->rect().contains(DockArea->mapFromGlobal(GlobalPos)))
736781
{
737782
return DockArea;
738783
}
@@ -791,7 +836,8 @@ void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWi
791836
auto dropOverlay = d->DockManager->dockAreaOverlay();
792837
dropOverlay->setAllowedAreas(AllDockAreas);
793838
dropArea = dropOverlay->showOverlay(DockArea);
794-
if ((ContainerDropArea != InvalidDockWidgetArea) && (dropArea == CenterDockWidgetArea))
839+
if (ContainerDropArea != InvalidDockWidgetArea &&
840+
ContainerDropArea != dropArea)
795841
{
796842
dropArea = InvalidDockWidgetArea;
797843
}
@@ -918,7 +964,9 @@ QSplitter* CDockContainerWidget::rootSplitter() const
918964
//============================================================================
919965
void CDockContainerWidget::dumpLayout()
920966
{
967+
qDebug("\n\nDumping layout --------------------------");
921968
d->dumpRecursive(0, d->RootSplitter);
969+
qDebug("--------------------------\n\n");
922970
}
923971

924972

src/DockWidgetTitleBar.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ bool DockWidgetTitleBarPrivate::startFloating()
164164
qDebug() << "areaCount " << DockWidget->dockContainer()->dockAreaCount();
165165
qDebug() << "widgetCount " << DockWidget->dockAreaWidget()->count();
166166
// if this is the last dock widget inside of this floating widget,
167-
// then it does not make any sense, to make if floating because
167+
// then it does not make any sense, to make it floating because
168168
// it is already floating
169169
if (DockWidget->dockContainer()->isFloating()
170170
&& (DockWidget->dockContainer()->visibleDockAreaCount() == 1)

0 commit comments

Comments
 (0)