Skip to content

Commit 6d9c4ce

Browse files
2 parents 04b4ff8 + 703a9b3 commit 6d9c4ce

File tree

5 files changed

+61
-6
lines changed

5 files changed

+61
-6
lines changed

src/DockAreaWidget.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,18 @@ class CDockAreaLayout
8686

8787
}
8888

89+
/**
90+
* Delete widgets without parents in this layout
91+
*/
92+
~CDockAreaLayout()
93+
{
94+
for(auto Widget : m_Widgets)
95+
{
96+
if(!Widget->parent())
97+
delete Widget;
98+
}
99+
}
100+
89101
/**
90102
* Returns the number of widgets in this layout
91103
*/
@@ -466,6 +478,14 @@ void CDockAreaWidget::removeDockWidget(CDockWidget* DockWidget)
466478
ADS_PRINT("Dock Area empty");
467479
DockContainer->removeDockArea(this);
468480
this->deleteLater();
481+
if(DockContainer->dockAreaCount() == 0)
482+
{
483+
if(CFloatingDockContainer* FloatingDockContainer = DockContainer->floatingWidget())
484+
{
485+
FloatingDockContainer->hide();
486+
FloatingDockContainer->deleteLater();
487+
}
488+
}
469489
}
470490
else if (DockWidget == CurrentDockWidget)
471491
{
@@ -951,6 +971,16 @@ QSize CDockAreaWidget::minimumSizeHint() const
951971
{
952972
return d->MinSizeHint.isValid() ? d->MinSizeHint : Super::minimumSizeHint();
953973
}
974+
975+
976+
//============================================================================
977+
void CDockAreaWidget::onDockWidgetFeaturesChanged()
978+
{
979+
if (d->TitleBar)
980+
d->updateTitleBarButtonStates();
981+
}
982+
983+
954984
} // namespace ads
955985

956986
//---------------------------------------------------------------------------

src/DockAreaWidget.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ class ADS_EXPORT CDockAreaWidget : public QFrame
6565
friend class CDockWidget;
6666
friend struct DockManagerPrivate;
6767
friend class CDockManager;
68+
void onDockWidgetFeaturesChanged();
6869

6970
private slots:
7071
void onTabCloseRequested(int Index);

src/DockManager.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,12 @@ CDockManager::~CDockManager()
484484
{
485485
delete FloatingWidget;
486486
}
487+
auto DockWidgetsMap = d->DockWidgetsMap;
488+
for(auto DockWidget : d->DockWidgetsMap)
489+
{
490+
if(!DockWidget->parent())
491+
delete DockWidget;
492+
}
487493
delete d;
488494
}
489495

@@ -653,7 +659,14 @@ void CDockManager::showEvent(QShowEvent *event)
653659

654660
for (auto FloatingWidget : d->UninitializedFloatingWidgets)
655661
{
656-
FloatingWidget->show();
662+
for(CDockWidget* DockWidget : FloatingWidget->dockWidgets())
663+
{
664+
if(!DockWidget->isClosed())
665+
{
666+
FloatingWidget->show();
667+
break;
668+
}
669+
}
657670
}
658671
d->UninitializedFloatingWidgets.clear();
659672
}

src/DockWidget.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,8 @@ void CDockWidget::setFeatures(DockWidgetFeatures features)
340340
d->Features = features;
341341
emit featuresChanged(d->Features);
342342
d->TabWidget->onDockWidgetFeaturesChanged();
343+
if(CDockAreaWidget* DockArea = dockAreaWidget())
344+
DockArea->onDockWidgetFeaturesChanged();
343345
}
344346

345347

src/DockWidgetTab.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,18 @@ struct DockWidgetTabPrivate
134134
}
135135
}
136136

137+
/**
138+
* Update the close button visibility from current feature/config
139+
*/
140+
void updateCloseButtonVisibility(bool active)
141+
{
142+
bool DockWidgetClosable = DockWidget->features().testFlag(CDockWidget::DockWidgetClosable);
143+
bool ActiveTabHasCloseButton = testConfigFlag(CDockManager::ActiveTabHasCloseButton);
144+
bool AllTabsHaveCloseButton = testConfigFlag(CDockManager::AllTabsHaveCloseButton);
145+
bool TabHasCloseButton = (ActiveTabHasCloseButton && active) | AllTabsHaveCloseButton;
146+
CloseButton->setVisible(DockWidgetClosable && TabHasCloseButton);
147+
}
148+
137149
template <typename T>
138150
IFloatingWidget* createFloatingWidget(T* Widget, bool OpaqueUndocking)
139151
{
@@ -461,11 +473,7 @@ bool CDockWidgetTab::isActiveTab() const
461473
//============================================================================
462474
void CDockWidgetTab::setActiveTab(bool active)
463475
{
464-
bool DockWidgetClosable = d->DockWidget->features().testFlag(CDockWidget::DockWidgetClosable);
465-
bool ActiveTabHasCloseButton = d->testConfigFlag(CDockManager::ActiveTabHasCloseButton);
466-
bool AllTabsHaveCloseButton = d->testConfigFlag(CDockManager::AllTabsHaveCloseButton);
467-
bool TabHasCloseButton = (ActiveTabHasCloseButton && active) | AllTabsHaveCloseButton;
468-
d->CloseButton->setVisible(DockWidgetClosable && TabHasCloseButton);
476+
d->updateCloseButtonVisibility(active);
469477

470478
// Focus related stuff
471479
if (CDockManager::testConfigFlag(CDockManager::FocusHighlighting) && !d->DockWidget->dockManager()->isRestoringState())
@@ -653,6 +661,7 @@ void CDockWidgetTab::onDockWidgetFeaturesChanged()
653661
SizePolicy.setRetainSizeWhenHidden(Features.testFlag(CDockWidget::DockWidgetClosable)
654662
&& d->testConfigFlag(CDockManager::RetainTabSizeWhenCloseButtonHidden));
655663
d->CloseButton->setSizePolicy(SizePolicy);
664+
d->updateCloseButtonVisibility(isActiveTab());
656665
}
657666

658667

0 commit comments

Comments
 (0)