This commit is contained in:
Uwe Kindler 2020-08-24 09:47:34 +02:00
commit 6d9c4cee02
5 changed files with 61 additions and 6 deletions

View File

@ -86,6 +86,18 @@ public:
} }
/**
* Delete widgets without parents in this layout
*/
~CDockAreaLayout()
{
for(auto Widget : m_Widgets)
{
if(!Widget->parent())
delete Widget;
}
}
/** /**
* Returns the number of widgets in this layout * Returns the number of widgets in this layout
*/ */
@ -466,6 +478,14 @@ void CDockAreaWidget::removeDockWidget(CDockWidget* DockWidget)
ADS_PRINT("Dock Area empty"); ADS_PRINT("Dock Area empty");
DockContainer->removeDockArea(this); DockContainer->removeDockArea(this);
this->deleteLater(); this->deleteLater();
if(DockContainer->dockAreaCount() == 0)
{
if(CFloatingDockContainer* FloatingDockContainer = DockContainer->floatingWidget())
{
FloatingDockContainer->hide();
FloatingDockContainer->deleteLater();
}
}
} }
else if (DockWidget == CurrentDockWidget) else if (DockWidget == CurrentDockWidget)
{ {
@ -951,6 +971,16 @@ QSize CDockAreaWidget::minimumSizeHint() const
{ {
return d->MinSizeHint.isValid() ? d->MinSizeHint : Super::minimumSizeHint(); return d->MinSizeHint.isValid() ? d->MinSizeHint : Super::minimumSizeHint();
} }
//============================================================================
void CDockAreaWidget::onDockWidgetFeaturesChanged()
{
if (d->TitleBar)
d->updateTitleBarButtonStates();
}
} // namespace ads } // namespace ads
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@ -65,6 +65,7 @@ private:
friend class CDockWidget; friend class CDockWidget;
friend struct DockManagerPrivate; friend struct DockManagerPrivate;
friend class CDockManager; friend class CDockManager;
void onDockWidgetFeaturesChanged();
private slots: private slots:
void onTabCloseRequested(int Index); void onTabCloseRequested(int Index);

View File

@ -484,6 +484,12 @@ CDockManager::~CDockManager()
{ {
delete FloatingWidget; delete FloatingWidget;
} }
auto DockWidgetsMap = d->DockWidgetsMap;
for(auto DockWidget : d->DockWidgetsMap)
{
if(!DockWidget->parent())
delete DockWidget;
}
delete d; delete d;
} }
@ -652,8 +658,15 @@ void CDockManager::showEvent(QShowEvent *event)
} }
for (auto FloatingWidget : d->UninitializedFloatingWidgets) for (auto FloatingWidget : d->UninitializedFloatingWidgets)
{
for(CDockWidget* DockWidget : FloatingWidget->dockWidgets())
{
if(!DockWidget->isClosed())
{ {
FloatingWidget->show(); FloatingWidget->show();
break;
}
}
} }
d->UninitializedFloatingWidgets.clear(); d->UninitializedFloatingWidgets.clear();
} }

View File

@ -340,6 +340,8 @@ void CDockWidget::setFeatures(DockWidgetFeatures features)
d->Features = features; d->Features = features;
emit featuresChanged(d->Features); emit featuresChanged(d->Features);
d->TabWidget->onDockWidgetFeaturesChanged(); d->TabWidget->onDockWidgetFeaturesChanged();
if(CDockAreaWidget* DockArea = dockAreaWidget())
DockArea->onDockWidgetFeaturesChanged();
} }

View File

@ -134,6 +134,18 @@ struct DockWidgetTabPrivate
} }
} }
/**
* Update the close button visibility from current feature/config
*/
void updateCloseButtonVisibility(bool active)
{
bool DockWidgetClosable = DockWidget->features().testFlag(CDockWidget::DockWidgetClosable);
bool ActiveTabHasCloseButton = testConfigFlag(CDockManager::ActiveTabHasCloseButton);
bool AllTabsHaveCloseButton = testConfigFlag(CDockManager::AllTabsHaveCloseButton);
bool TabHasCloseButton = (ActiveTabHasCloseButton && active) | AllTabsHaveCloseButton;
CloseButton->setVisible(DockWidgetClosable && TabHasCloseButton);
}
template <typename T> template <typename T>
IFloatingWidget* createFloatingWidget(T* Widget, bool OpaqueUndocking) IFloatingWidget* createFloatingWidget(T* Widget, bool OpaqueUndocking)
{ {
@ -461,11 +473,7 @@ bool CDockWidgetTab::isActiveTab() const
//============================================================================ //============================================================================
void CDockWidgetTab::setActiveTab(bool active) void CDockWidgetTab::setActiveTab(bool active)
{ {
bool DockWidgetClosable = d->DockWidget->features().testFlag(CDockWidget::DockWidgetClosable); d->updateCloseButtonVisibility(active);
bool ActiveTabHasCloseButton = d->testConfigFlag(CDockManager::ActiveTabHasCloseButton);
bool AllTabsHaveCloseButton = d->testConfigFlag(CDockManager::AllTabsHaveCloseButton);
bool TabHasCloseButton = (ActiveTabHasCloseButton && active) | AllTabsHaveCloseButton;
d->CloseButton->setVisible(DockWidgetClosable && TabHasCloseButton);
// Focus related stuff // Focus related stuff
if (CDockManager::testConfigFlag(CDockManager::FocusHighlighting) && !d->DockWidget->dockManager()->isRestoringState()) if (CDockManager::testConfigFlag(CDockManager::FocusHighlighting) && !d->DockWidget->dockManager()->isRestoringState())
@ -653,6 +661,7 @@ void CDockWidgetTab::onDockWidgetFeaturesChanged()
SizePolicy.setRetainSizeWhenHidden(Features.testFlag(CDockWidget::DockWidgetClosable) SizePolicy.setRetainSizeWhenHidden(Features.testFlag(CDockWidget::DockWidgetClosable)
&& d->testConfigFlag(CDockManager::RetainTabSizeWhenCloseButtonHidden)); && d->testConfigFlag(CDockManager::RetainTabSizeWhenCloseButtonHidden));
d->CloseButton->setSizePolicy(SizePolicy); d->CloseButton->setSizePolicy(SizePolicy);
d->updateCloseButtonVisibility(isActiveTab());
} }