Skip to content

Commit 5dcd15e

Browse files
author
Uwe Kindler
committed
Implemented RootSplitter
1 parent a652deb commit 5dcd15e

File tree

1 file changed

+53
-89
lines changed

1 file changed

+53
-89
lines changed

src/DockContainerWidget.cpp

Lines changed: 53 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ struct DockContainerWidgetPrivate
7575
unsigned int zOrderIndex = 0;
7676
QList<CDockAreaWidget*> DockAreas;
7777
QGridLayout* Layout = nullptr;
78-
CDockSplitter* RootSplitter;
78+
QSplitter* RootSplitter;
7979
bool isFloating = false;
8080

8181
/**
@@ -143,56 +143,44 @@ void DockContainerWidgetPrivate::dropIntoContainer(CFloatingDockContainer* Float
143143
auto InsertParam = internal::dockAreaInsertParameters(area);
144144
auto NewDockAreas = FloatingWidget->dockContainer()->findChildren<CDockAreaWidget*>(
145145
QString(), Qt::FindChildrenRecursively);
146-
QSplitter* OldSplitter = nullptr;
146+
QSplitter* Splitter = RootSplitter;
147147

148-
// If the container already contains dock areas, then we need to ensure that
149-
// we have a splitter with an orientation that matches the orientation of
150-
// the current drop action
151-
if (!DockAreas.isEmpty())
148+
if (DockAreas.count() <= 1)
152149
{
153-
OldSplitter = _this->findChild<QSplitter*>(QString(), Qt::FindDirectChildrenOnly);
154-
// First replace the dock widget with a splitter
155-
if (DockAreas.count() == 1)
156-
{
157-
auto DockArea = dynamic_cast<CDockAreaWidget*>(Layout->itemAtPosition(0, 0)->widget());
158-
QSplitter* NewSplitter = internal::newSplitter(InsertParam.orientation());
159-
Layout->replaceWidget(DockArea, NewSplitter);
160-
NewSplitter->addWidget(DockArea);
161-
OldSplitter = NewSplitter;
162-
}
163-
else if (OldSplitter->orientation() != InsertParam.orientation())
164-
{
165-
QSplitter* NewSplitter = internal::newSplitter(InsertParam.orientation());
166-
QLayoutItem* li = Layout->replaceWidget(OldSplitter, NewSplitter);
167-
NewSplitter->addWidget(OldSplitter);
168-
OldSplitter = NewSplitter;
169-
}
150+
Splitter->setOrientation(InsertParam.orientation());
151+
}
152+
else
153+
{
154+
QSplitter* NewSplitter = internal::newSplitter(InsertParam.orientation());
155+
QLayoutItem* li = Layout->replaceWidget(Splitter, NewSplitter);
156+
NewSplitter->addWidget(Splitter);
157+
Splitter = NewSplitter;
170158
}
171159

172160
// Now we can insert the floating widget content into this container
173161
auto Widget = FloatingWidget->dockContainer()->findChild<QWidget*>(QString(), Qt::FindDirectChildrenOnly);
174162
auto FloatingSplitter = dynamic_cast<QSplitter*>(Widget);
175163
if (DockAreas.isEmpty())
176164
{
177-
auto Widget = FloatingWidget->dockContainer()->findChild<QWidget*>(QString(), Qt::FindDirectChildrenOnly);
178-
Layout->addWidget(Widget, 0, 0);
165+
Splitter->addWidget(Widget);
179166
}
180-
else if (!FloatingSplitter)
167+
else if (FloatingSplitter->count() == 1)
181168
{
182-
insertWidgetIntoSplitter(OldSplitter, Widget, InsertParam.append());
169+
insertWidgetIntoSplitter(Splitter, FloatingSplitter->widget(0), InsertParam.append());
183170
}
184171
else if (FloatingSplitter->orientation() == InsertParam.orientation())
185172
{
186173
while (FloatingSplitter->count())
187174
{
188-
insertWidgetIntoSplitter(OldSplitter, FloatingSplitter->widget(0), InsertParam.append());
175+
insertWidgetIntoSplitter(Splitter, FloatingSplitter->widget(0), InsertParam.append());
189176
}
190177
}
191178
else
192179
{
193-
insertWidgetIntoSplitter(OldSplitter, FloatingSplitter, InsertParam.append());
180+
insertWidgetIntoSplitter(Splitter, FloatingSplitter, InsertParam.append());
194181
}
195182

183+
RootSplitter = Splitter;
196184
addDockAreasToList(NewDockAreas);
197185
FloatingWidget->deleteLater();
198186
}
@@ -236,7 +224,7 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
236224

237225
if (TargetAreaSplitter->orientation() == InsertParam.orientation())
238226
{
239-
if (!FloatingSplitter || FloatingSplitter->orientation() != InsertParam.orientation())
227+
if ((FloatingSplitter->orientation() != InsertParam.orientation()) && FloatingSplitter->count() > 1)
240228
{
241229
TargetAreaSplitter->insertWidget(AreaIndex + InsertParam.insertOffset(), Widget);
242230
}
@@ -252,7 +240,7 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
252240
else
253241
{
254242
QSplitter* NewSplitter = internal::newSplitter(InsertParam.orientation());
255-
if (!FloatingSplitter || FloatingSplitter->orientation() != InsertParam.orientation())
243+
if ((FloatingSplitter->orientation() != InsertParam.orientation()) && FloatingSplitter->count() > 1)
256244
{
257245
NewSplitter->addWidget(Widget);
258246
}
@@ -405,46 +393,36 @@ CDockAreaWidget* DockContainerWidgetPrivate::dockWidgetIntoContainer(DockWidgetA
405393
void DockContainerWidgetPrivate::addDockArea(CDockAreaWidget* NewDockArea, DockWidgetArea area)
406394
{
407395
auto InsertParam = internal::dockAreaInsertParameters(area);
408-
if (DockAreas.isEmpty())
396+
// As long as we have only one dock area in the splitter we can adjust
397+
// its orientation
398+
if (DockAreas.count() <= 1)
409399
{
410-
QSplitter* Splitter = internal::newSplitter(Qt::Horizontal);
411-
Splitter->addWidget(NewDockArea);
412-
insertWidgetIntoSplitter(Splitter, NewDockArea, InsertParam.append());
413-
_this->layout()->addWidget(Splitter);
400+
RootSplitter->setOrientation(InsertParam.orientation());
414401
}
415-
else if (DockAreas.count() == 1)
402+
403+
QSplitter* Splitter = RootSplitter;
404+
if (Splitter->orientation() == InsertParam.orientation())
416405
{
417-
QSplitter* Splitter = internal::newSplitter(InsertParam.orientation());
418-
auto DockArea = dynamic_cast<CDockAreaWidget*>(Layout->itemAtPosition(0, 0)->widget());
419-
Layout->replaceWidget(DockArea, Splitter);
420-
Splitter->addWidget(DockArea);
421406
insertWidgetIntoSplitter(Splitter, NewDockArea, InsertParam.append());
422407
}
423408
else
424409
{
425-
QSplitter* Splitter = _this->findChild<QSplitter*>(QString(), Qt::FindDirectChildrenOnly);
426-
if (Splitter->orientation() == InsertParam.orientation())
410+
QSplitter* NewSplitter = internal::newSplitter(InsertParam.orientation());
411+
if (InsertParam.append())
427412
{
428-
insertWidgetIntoSplitter(Splitter, NewDockArea, InsertParam.append());
413+
QLayoutItem* li = Layout->replaceWidget(Splitter, NewSplitter);
414+
NewSplitter->addWidget(Splitter);
415+
NewSplitter->addWidget(NewDockArea);
416+
delete li;
429417
}
430418
else
431419
{
432-
QSplitter* NewSplitter = internal::newSplitter(InsertParam.orientation());
433-
if (InsertParam.append())
434-
{
435-
QLayoutItem* li = Layout->replaceWidget(Splitter, NewSplitter);
436-
NewSplitter->addWidget(Splitter);
437-
NewSplitter->addWidget(NewDockArea);
438-
delete li;
439-
}
440-
else
441-
{
442-
NewSplitter->addWidget(NewDockArea);
443-
QLayoutItem* li = Layout->replaceWidget(Splitter, NewSplitter);
444-
NewSplitter->addWidget(Splitter);
445-
delete li;
446-
}
420+
NewSplitter->addWidget(NewDockArea);
421+
QLayoutItem* li = Layout->replaceWidget(Splitter, NewSplitter);
422+
NewSplitter->addWidget(Splitter);
423+
delete li;
447424
}
425+
RootSplitter = NewSplitter;
448426
}
449427

450428
DockAreas.append(NewDockArea);
@@ -466,31 +444,21 @@ CDockAreaWidget* DockContainerWidgetPrivate::dockWidgetIntoDockArea(DockWidgetAr
466444
CDockAreaWidget* NewDockArea = new CDockAreaWidget(DockManager, _this);
467445
NewDockArea->addDockWidget(Dockwidget);
468446
auto InsertParam = internal::dockAreaInsertParameters(area);
469-
if (DockAreas.count() == 1)
447+
448+
QSplitter* TargetAreaSplitter = internal::findParent<QSplitter*>(TargetDockArea);
449+
int index = TargetAreaSplitter ->indexOf(TargetDockArea);
450+
if (TargetAreaSplitter->orientation() == InsertParam.orientation())
470451
{
471-
QSplitter* Splitter = internal::newSplitter(InsertParam.orientation());
472-
auto DockArea = dynamic_cast<CDockAreaWidget*>(Layout->itemAtPosition(0, 0)->widget());
473-
Layout->replaceWidget(DockArea, Splitter);
474-
Splitter->addWidget(DockArea);
475-
insertWidgetIntoSplitter(Splitter, NewDockArea, InsertParam.append());
452+
std::cout << "TargetAreaSplitter->orientation() == InsertParam.orientation()" << std::endl;
453+
TargetAreaSplitter->insertWidget(index + InsertParam.insertOffset(), NewDockArea);
476454
}
477455
else
478456
{
479-
QSplitter* TargetAreaSplitter = internal::findParent<QSplitter*>(TargetDockArea);
480-
int index = TargetAreaSplitter ->indexOf(TargetDockArea);
481-
if (TargetAreaSplitter->orientation() == InsertParam.orientation())
482-
{
483-
std::cout << "TargetAreaSplitter->orientation() == InsertParam.orientation()" << std::endl;
484-
TargetAreaSplitter->insertWidget(index + InsertParam.insertOffset(), NewDockArea);
485-
}
486-
else
487-
{
488-
std::cout << "TargetAreaSplitter->orientation() != InsertParam.orientation()" << std::endl;
489-
QSplitter* NewSplitter = internal::newSplitter(InsertParam.orientation());
490-
NewSplitter->addWidget(TargetDockArea);
491-
insertWidgetIntoSplitter(NewSplitter, NewDockArea, InsertParam.append());
492-
TargetAreaSplitter->insertWidget(index, NewSplitter);
493-
}
457+
std::cout << "TargetAreaSplitter->orientation() != InsertParam.orientation()" << std::endl;
458+
QSplitter* NewSplitter = internal::newSplitter(InsertParam.orientation());
459+
NewSplitter->addWidget(TargetDockArea);
460+
insertWidgetIntoSplitter(NewSplitter, NewDockArea, InsertParam.append());
461+
TargetAreaSplitter->insertWidget(index, NewSplitter);
494462
}
495463

496464
DockAreas.append(NewDockArea);
@@ -517,6 +485,9 @@ CDockContainerWidget::CDockContainerWidget(CDockManager* DockManager, QWidget *p
517485
d->Layout->setContentsMargins(0, 1, 0, 1);
518486
d->Layout->setSpacing(0);
519487
setLayout(d->Layout);
488+
489+
d->RootSplitter = internal::newSplitter(Qt::Horizontal);
490+
d->Layout->addWidget(d->RootSplitter);
520491
}
521492

522493
//============================================================================
@@ -604,7 +575,7 @@ void CDockContainerWidget::removeDockArea(CDockAreaWidget* area)
604575
d->DockAreas.removeAll(area);
605576
QSplitter* Splitter = internal::findParent<QSplitter*>(area);
606577
area->setParent(0);
607-
if (!(Splitter && Splitter->count() == 1))
578+
if (Splitter == d->RootSplitter || Splitter->count() != 1)
608579
{
609580
emit dockAreasRemoved();
610581
return;
@@ -616,14 +587,7 @@ void CDockContainerWidget::removeDockArea(CDockAreaWidget* area)
616587
QWidget* widget = Splitter->widget(0);
617588
widget->setParent(this);
618589
QSplitter* ParentSplitter = internal::findParent<QSplitter*>(Splitter);
619-
if (ParentSplitter)
620-
{
621-
internal::replaceSplitterWidget(ParentSplitter, Splitter, widget);
622-
}
623-
else
624-
{
625-
d->Layout->replaceWidget(Splitter, widget);
626-
}
590+
internal::replaceSplitterWidget(ParentSplitter, Splitter, widget);
627591
delete Splitter;
628592
emit dockAreasRemoved();
629593
}

0 commit comments

Comments
 (0)