Skip to content

Commit ca5683f

Browse files
authored
Merge pull request #1 from simulton/feature/remove_docks
Feature/remove docks
2 parents 27dd7a1 + c630a59 commit ca5683f

File tree

7 files changed

+56
-5
lines changed

7 files changed

+56
-5
lines changed

src/DockAreaWidget.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -414,14 +414,15 @@ void CDockAreaWidget::removeDockWidget(CDockWidget* DockWidget)
414414
auto TabWidget = DockWidget->tabWidget();
415415
TabWidget->hide();
416416
d->tabBar()->removeTab(TabWidget);
417+
CDockContainerWidget* DockContainer = dockContainer();
417418
if (NextOpenDockWidget)
418419
{
419420
setCurrentDockWidget(NextOpenDockWidget);
420421
}
421-
else if (d->ContentsLayout->isEmpty())
422+
else if (d->ContentsLayout->isEmpty() && DockContainer->dockAreaCount() > 1)
422423
{
423424
qDebug() << "Dock Area empty";
424-
dockContainer()->removeDockArea(this);
425+
DockContainer->removeDockArea(this);
425426
this->deleteLater();
426427
}
427428
else
@@ -434,14 +435,13 @@ void CDockAreaWidget::removeDockWidget(CDockWidget* DockWidget)
434435

435436
d->updateCloseButtonState();
436437
updateTitleBarVisibility();
437-
auto TopLevelDockWidget = dockContainer()->topLevelDockWidget();
438+
auto TopLevelDockWidget = DockContainer->topLevelDockWidget();
438439
if (TopLevelDockWidget)
439440
{
440441
TopLevelDockWidget->emitTopLevelChanged(true);
441442
}
442443

443444
#if (ADS_DEBUG_LEVEL > 0)
444-
CDockContainerWidget* DockContainer = dockContainer();
445445
DockContainer->dumpLayout();
446446
#endif
447447
}

src/DockContainerWidget.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -998,6 +998,15 @@ CDockAreaWidget* CDockContainerWidget::addDockWidget(DockWidgetArea area, CDockW
998998
}
999999
}
10001000

1001+
//============================================================================
1002+
void CDockContainerWidget::removeDockWidget(CDockWidget* Dockwidget)
1003+
{
1004+
CDockAreaWidget* Area = Dockwidget->dockAreaWidget();
1005+
if (Area)
1006+
{
1007+
Area->removeDockWidget(Dockwidget);
1008+
}
1009+
}
10011010

10021011
//============================================================================
10031012
unsigned int CDockContainerWidget::zOrderIndex() const
@@ -1057,6 +1066,12 @@ void CDockContainerWidget::removeDockArea(CDockAreaWidget* area)
10571066
area->setParent(nullptr);
10581067
internal::hideEmptyParentSplitters(Splitter);
10591068

1069+
// Remove this area from cached areas
1070+
const auto& cache = d->LastAddedAreaCache;
1071+
if (auto p = std::find(cache, cache+sizeof(cache)/sizeof(cache[0]), area)) {
1072+
d->LastAddedAreaCache[std::distance(cache, p)] = nullptr;
1073+
}
1074+
10601075
// If splitter has more than 1 widgets, we are finished and can leave
10611076
if (Splitter->count() > 1)
10621077
{
@@ -1274,6 +1289,7 @@ bool CDockContainerWidget::restoreState(QXmlStreamReader& s, bool Testing)
12741289
{
12751290
d->VisibleDockAreaCount = -1;// invalidate the dock area count
12761291
d->DockAreas.clear();
1292+
std::fill(std::begin(d->LastAddedAreaCache),std::end(d->LastAddedAreaCache), nullptr);
12771293
}
12781294

12791295
if (IsFloating)

src/DockContainerWidget.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,11 @@ class ADS_EXPORT CDockContainerWidget : public QFrame
166166
CDockAreaWidget* addDockWidget(DockWidgetArea area, CDockWidget* Dockwidget,
167167
CDockAreaWidget* DockAreaWidget = nullptr);
168168

169+
/**
170+
* Removes dockwidget
171+
*/
172+
void removeDockWidget(CDockWidget* Dockwidget);
173+
169174
/**
170175
* Returns the current zOrderIndex
171176
*/

src/DockManager.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -565,9 +565,13 @@ CDockAreaWidget* CDockManager::addDockWidgetTab(DockWidgetArea area,
565565
{
566566
return addDockWidget(ads::CenterDockWidgetArea, Dockwidget, AreaWidget);
567567
}
568+
else if (!openedDockAreas().isEmpty())
569+
{
570+
return addDockWidget(area, Dockwidget, openedDockAreas().last());
571+
}
568572
else
569573
{
570-
return addDockWidget(area, Dockwidget, AreaWidget);
574+
return addDockWidget(area, Dockwidget, nullptr);
571575
}
572576
}
573577

@@ -586,6 +590,12 @@ CDockWidget* CDockManager::findDockWidget(const QString& ObjectName) const
586590
return d->DockWidgetsMap.value(ObjectName, nullptr);
587591
}
588592

593+
//============================================================================
594+
void CDockManager::removeDockWidget(CDockWidget* Dockwidget)
595+
{
596+
d->DockWidgetsMap.remove(Dockwidget->objectName());
597+
CDockContainerWidget::removeDockWidget(Dockwidget);
598+
}
589599

590600
//============================================================================
591601
QMap<QString, CDockWidget*> CDockManager::dockWidgetsMap() const

src/DockManager.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,11 @@ class ADS_EXPORT CDockManager : public CDockContainerWidget
192192
*/
193193
CDockWidget* findDockWidget(const QString& ObjectName) const;
194194

195+
/**
196+
* Remove the given Dock from the dock manager
197+
*/
198+
void removeDockWidget(CDockWidget* Dockwidget);
199+
195200
/**
196201
* This function returns a readable reference to the internal dock
197202
* widgets map so that it is possible to iterate over all dock widgets

src/DockWidget.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,16 @@ void CDockWidget::setWidget(QWidget* widget, eInsertMode InsertMode)
262262
}
263263

264264

265+
//============================================================================
266+
QWidget* CDockWidget::takeWidget()
267+
{
268+
d->ScrollArea->takeWidget();
269+
d->Layout->removeWidget(d->Widget);
270+
d->Widget->setParent(nullptr);
271+
return d->Widget;
272+
}
273+
274+
265275
//============================================================================
266276
QWidget* CDockWidget::widget() const
267277
{

src/DockWidget.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,11 @@ private slots:
238238
*/
239239
void setWidget(QWidget* widget, eInsertMode InsertMode = AutoScrollArea);
240240

241+
/**
242+
* Remove the widget from the dock and give ownership back to the caller
243+
*/
244+
QWidget* takeWidget();
245+
241246
/**
242247
* Returns the widget for the dock widget. This function returns zero if
243248
* the widget has not been set.

0 commit comments

Comments
 (0)