From 703a9b3e1293b5ff89d810cb00fd00f987f38aeb Mon Sep 17 00:00:00 2001 From: shelomentsev Date: Fri, 21 Aug 2020 11:09:13 +0500 Subject: [PATCH] Update the state of close button on titlebar and tabbar when CDockWidget::DockWidgetClosable changed. (#240) --- src/DockAreaWidget.cpp | 10 ++++++++++ src/DockAreaWidget.h | 1 + src/DockWidget.cpp | 2 ++ src/DockWidgetTab.cpp | 19 ++++++++++++++----- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/DockAreaWidget.cpp b/src/DockAreaWidget.cpp index a12bcb0..78c4e5e 100644 --- a/src/DockAreaWidget.cpp +++ b/src/DockAreaWidget.cpp @@ -971,6 +971,16 @@ QSize CDockAreaWidget::minimumSizeHint() const { return d->MinSizeHint.isValid() ? d->MinSizeHint : Super::minimumSizeHint(); } + + +//============================================================================ +void CDockAreaWidget::onDockWidgetFeaturesChanged() +{ + if (d->TitleBar) + d->updateTitleBarButtonStates(); +} + + } // namespace ads //--------------------------------------------------------------------------- diff --git a/src/DockAreaWidget.h b/src/DockAreaWidget.h index 337eac2..55b1a39 100644 --- a/src/DockAreaWidget.h +++ b/src/DockAreaWidget.h @@ -65,6 +65,7 @@ private: friend class CDockWidget; friend struct DockManagerPrivate; friend class CDockManager; + void onDockWidgetFeaturesChanged(); private slots: void onTabCloseRequested(int Index); diff --git a/src/DockWidget.cpp b/src/DockWidget.cpp index 56c697e..83cb613 100644 --- a/src/DockWidget.cpp +++ b/src/DockWidget.cpp @@ -340,6 +340,8 @@ void CDockWidget::setFeatures(DockWidgetFeatures features) d->Features = features; emit featuresChanged(d->Features); d->TabWidget->onDockWidgetFeaturesChanged(); + if(CDockAreaWidget* DockArea = dockAreaWidget()) + DockArea->onDockWidgetFeaturesChanged(); } diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index d8b9a84..6d80b1f 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -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 IFloatingWidget* createFloatingWidget(T* Widget, bool OpaqueUndocking) { @@ -461,11 +473,7 @@ bool CDockWidgetTab::isActiveTab() const //============================================================================ void CDockWidgetTab::setActiveTab(bool active) { - bool DockWidgetClosable = d->DockWidget->features().testFlag(CDockWidget::DockWidgetClosable); - bool ActiveTabHasCloseButton = d->testConfigFlag(CDockManager::ActiveTabHasCloseButton); - bool AllTabsHaveCloseButton = d->testConfigFlag(CDockManager::AllTabsHaveCloseButton); - bool TabHasCloseButton = (ActiveTabHasCloseButton && active) | AllTabsHaveCloseButton; - d->CloseButton->setVisible(DockWidgetClosable && TabHasCloseButton); + d->updateCloseButtonVisibility(active); // Focus related stuff if (CDockManager::testConfigFlag(CDockManager::FocusHighlighting) && !d->DockWidget->dockManager()->isRestoringState()) @@ -653,6 +661,7 @@ void CDockWidgetTab::onDockWidgetFeaturesChanged() SizePolicy.setRetainSizeWhenHidden(Features.testFlag(CDockWidget::DockWidgetClosable) && d->testConfigFlag(CDockManager::RetainTabSizeWhenCloseButtonHidden)); d->CloseButton->setSizePolicy(SizePolicy); + d->updateCloseButtonVisibility(isActiveTab()); }