Skip to content

Commit 9adc524

Browse files
author
Uwe Kindler
committed
Fixed creation of superfluous splitter when docking into container
1 parent 549646d commit 9adc524

File tree

5 files changed

+69
-13
lines changed

5 files changed

+69
-13
lines changed

src/DockAreaWidget.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,15 +475,17 @@ void CDockAreaWidget::removeDockWidget(CDockWidget* DockWidget)
475475
setCurrentIndex(d->ContentsLayout->currentIndex());
476476
d->updateTabsMenu();
477477

478+
CDockContainerWidget* DockContainer = dockContainer();
478479
if (d->ContentsLayout->isEmpty())
479480
{
480481
std::cout << "Dock Area empty" << std::endl;
481482
dockContainer()->removeDockArea(this);
482-
this->deleteLater();
483+
this->deleteLater();;
483484
}
484485

485486
d->updateTabBar();
486487
DockWidget->setDockArea(nullptr);
488+
DockContainer->dumpLayout();
487489
}
488490

489491

src/DockContainerWidget.cpp

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,11 @@ struct DockContainerWidgetPrivate
145145
*/
146146
bool restoreDockArea(QDataStream& Stream, QWidget*& CreatedWidget,
147147
bool Testing);
148+
149+
/**
150+
* Helper function for recursive dumping of layout
151+
*/
152+
void dumpRecursive(int level, QWidget* widget);
148153
}; // struct DockContainerWidgetPrivate
149154

150155

@@ -169,7 +174,7 @@ void DockContainerWidgetPrivate::dropIntoContainer(CFloatingDockContainer* Float
169174
{
170175
Splitter->setOrientation(InsertParam.orientation());
171176
}
172-
else
177+
else if (Splitter->orientation() != InsertParam.orientation())
173178
{
174179
QSplitter* NewSplitter = internal::newSplitter(InsertParam.orientation());
175180
QLayoutItem* li = Layout->replaceWidget(Splitter, NewSplitter);
@@ -178,13 +183,8 @@ void DockContainerWidgetPrivate::dropIntoContainer(CFloatingDockContainer* Float
178183
}
179184

180185
// Now we can insert the floating widget content into this container
181-
auto Widget = FloatingWidget->dockContainer()->findChild<QWidget*>(QString(), Qt::FindDirectChildrenOnly);
182-
auto FloatingSplitter = dynamic_cast<QSplitter*>(Widget);
183-
if (DockAreas.isEmpty())
184-
{
185-
Splitter->addWidget(Widget);
186-
}
187-
else if (FloatingSplitter->count() == 1)
186+
auto FloatingSplitter = FloatingWidget->dockContainer()->rootSplitter();
187+
if (FloatingSplitter->count() == 1)
188188
{
189189
insertWidgetIntoSplitter(Splitter, FloatingSplitter->widget(0), InsertParam.append());
190190
}
@@ -203,6 +203,7 @@ void DockContainerWidgetPrivate::dropIntoContainer(CFloatingDockContainer* Float
203203
RootSplitter = Splitter;
204204
addDockAreasToList(NewDockAreas);
205205
FloatingWidget->deleteLater();
206+
_this->dumpLayout();
206207
}
207208

208209

@@ -278,6 +279,7 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
278279

279280
FloatingWidget->deleteLater();
280281
addDockAreasToList(NewDockAreas);
282+
_this->dumpLayout();
281283
}
282284

283285

@@ -523,6 +525,33 @@ void DockContainerWidgetPrivate::addDockArea(CDockAreaWidget* NewDockArea, DockW
523525
}
524526

525527

528+
//============================================================================
529+
void DockContainerWidgetPrivate::dumpRecursive(int level, QWidget* widget)
530+
{
531+
QSplitter* Splitter = dynamic_cast<QSplitter*>(widget);
532+
QByteArray buf;
533+
buf.fill(' ', level * 4);
534+
if (Splitter)
535+
{
536+
std::cout << buf.toStdString() << "Splitter " << ((Splitter->orientation() == Qt::Vertical)
537+
? "-" : "|") << std::endl;
538+
for (int i = 0; i < Splitter->count(); ++i)
539+
{
540+
dumpRecursive(level + 1, Splitter->widget(i));
541+
}
542+
}
543+
else
544+
{
545+
CDockAreaWidget* DockArea = dynamic_cast<CDockAreaWidget*>(widget);
546+
if (!DockArea)
547+
{
548+
return;
549+
}
550+
std::cout << buf.toStdString() << "DockArea" << std::endl;
551+
}
552+
}
553+
554+
526555
//============================================================================
527556
CDockAreaWidget* DockContainerWidgetPrivate::dockWidgetIntoDockArea(DockWidgetArea area,
528557
CDockWidget* Dockwidget, CDockAreaWidget* TargetDockArea)
@@ -681,6 +710,7 @@ void CDockContainerWidget::removeDockArea(CDockAreaWidget* area)
681710
QSplitter* ParentSplitter = internal::findParent<QSplitter*>(Splitter);
682711
internal::replaceSplitterWidget(ParentSplitter, Splitter, widget);
683712
delete Splitter;
713+
dumpLayout();
684714
emit dockAreasRemoved();
685715
}
686716

@@ -845,6 +875,20 @@ bool CDockContainerWidget::restoreState(QDataStream& stream, bool Testing)
845875
}
846876

847877

878+
//============================================================================
879+
QSplitter* CDockContainerWidget::rootSplitter() const
880+
{
881+
return d->RootSplitter;
882+
}
883+
884+
885+
//============================================================================
886+
void CDockContainerWidget::dumpLayout()
887+
{
888+
d->dumpRecursive(0, d->RootSplitter);
889+
}
890+
891+
848892
} // namespace ads
849893

850894
//---------------------------------------------------------------------------

src/DockContainerWidget.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ class CDockContainerWidget : public QFrame
5959
*/
6060
virtual bool event(QEvent *e) override;
6161

62+
/**
63+
* Access function for the internal root splitter
64+
*/
65+
QSplitter* rootSplitter() const;
66+
6267
public:
6368
/**
6469
* Default Constructor
@@ -147,6 +152,11 @@ class CDockContainerWidget : public QFrame
147152
*/
148153
bool restoreState(QDataStream& Stream, bool Testing);
149154

155+
/**
156+
* Dumps the layout for debugging purposes
157+
*/
158+
void dumpLayout();
159+
150160
signals:
151161
/**
152162
* This signal is emitted if one or multiple dock areas has been added to

src/DockOverlay.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ static QPixmap createDropIndicatorPixmap(const QPalette& pal, const QSizeF& size
136136
if (CDockOverlay::ModeContainerOverlay == Mode && DockWidgetArea != CenterDockWidgetArea)
137137
{
138138
QRectF ArrowRect;
139-
ArrowRect.setSize(ShadowRect.size() * 0.7);
139+
ArrowRect.setSize(baseSize);
140140
ArrowRect.setWidth(ArrowRect.width() / 4.6);
141141
ArrowRect.setHeight(ArrowRect.height() / 2);
142142
ArrowRect.moveCenter(QPointF(0, 0));

src/DockWidgetTitleBar.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,8 @@ void CDockWidgetTitleBar::mouseReleaseEvent(QMouseEvent* ev)
267267
//============================================================================
268268
void CDockWidgetTitleBar::mouseMoveEvent(QMouseEvent* ev)
269269
{
270-
std::cout << "CDockWidgetTitleBar::mouseMoveEventmouseMoveEvent DragState "
271-
<< d->DragState << std::endl;
270+
/*std::cout << "CDockWidgetTitleBar::mouseMoveEventmouseMoveEvent DragState "
271+
<< d->DragState << std::endl;*/
272272
if (!(ev->buttons() & Qt::LeftButton) || d->isDraggingState(DraggingInactive))
273273
{
274274
d->DragState = DraggingInactive;
@@ -278,7 +278,7 @@ void CDockWidgetTitleBar::mouseMoveEvent(QMouseEvent* ev)
278278

279279
if (d->isDraggingState(DraggingFloatingWidget))
280280
{
281-
std::cout << "DraggingFloatingWidget" << std::endl;
281+
//std::cout << "DraggingFloatingWidget" << std::endl;
282282
d->FloatingWidget->moveFloating();
283283
QFrame::mouseMoveEvent(ev);
284284
return;

0 commit comments

Comments
 (0)