Skip to content

Commit 541db8e

Browse files
Fixed wrong hiding/showing of dock area title bar buttons when DockAreaHideDisabledButtons flag is enabled
1 parent 644c828 commit 541db8e

File tree

3 files changed

+111
-19
lines changed

3 files changed

+111
-19
lines changed

src/DockAreaTitleBar.cpp

Lines changed: 63 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,8 @@ void DockAreaTitleBarPrivate::createButtons()
179179
QSizePolicy ButtonSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
180180

181181
// Tabs menu button
182-
TabsMenuButton = new CTitleBarButton(testConfigFlag(CDockManager::DockAreaHasTabsMenuButton));
182+
TabsMenuButton = new CTitleBarButton(testConfigFlag(CDockManager::DockAreaHasTabsMenuButton),
183+
false, TitleBarButtonTabsMenu);
183184
TabsMenuButton->setObjectName("tabsMenuButton");
184185
TabsMenuButton->setAutoRaise(true);
185186
TabsMenuButton->setPopupMode(QToolButton::InstantPopup);
@@ -197,7 +198,8 @@ void DockAreaTitleBarPrivate::createButtons()
197198
SLOT(onTabsMenuActionTriggered(QAction*)));
198199

199200
// Undock button
200-
UndockButton = new CTitleBarButton(testConfigFlag(CDockManager::DockAreaHasUndockButton));
201+
UndockButton = new CTitleBarButton(testConfigFlag(CDockManager::DockAreaHasUndockButton),
202+
true, TitleBarButtonUndock);
201203
UndockButton->setObjectName("detachGroupButton");
202204
UndockButton->setAutoRaise(true);
203205
internal::setToolTip(UndockButton, QObject::tr("Detach Group"));
@@ -208,7 +210,8 @@ void DockAreaTitleBarPrivate::createButtons()
208210

209211
// AutoHide Button
210212
const auto autoHideEnabled = testAutoHideConfigFlag(CDockManager::AutoHideFeatureEnabled);
211-
AutoHideButton = new CTitleBarButton(testAutoHideConfigFlag(CDockManager::DockAreaHasAutoHideButton) && autoHideEnabled);
213+
AutoHideButton = new CTitleBarButton(testAutoHideConfigFlag(CDockManager::DockAreaHasAutoHideButton) && autoHideEnabled,
214+
true, TitleBarButtonAutoHide);
212215
AutoHideButton->setObjectName("dockAreaAutoHideButton");
213216
AutoHideButton->setAutoRaise(true);
214217
internal::setToolTip(AutoHideButton, _this->titleBarButtonToolTip(TitleBarButtonAutoHide));
@@ -220,7 +223,8 @@ void DockAreaTitleBarPrivate::createButtons()
220223
_this->connect(AutoHideButton, SIGNAL(clicked()), SLOT(onAutoHideButtonClicked()));
221224

222225
// Minimize button
223-
MinimizeButton = new CTitleBarButton(testAutoHideConfigFlag(CDockManager::AutoHideHasMinimizeButton));
226+
MinimizeButton = new CTitleBarButton(testAutoHideConfigFlag(CDockManager::AutoHideHasMinimizeButton),
227+
false, TitleBarButtonMinimize);
224228
MinimizeButton->setObjectName("dockAreaMinimizeButton");
225229
MinimizeButton->setAutoRaise(true);
226230
MinimizeButton->setVisible(false);
@@ -231,7 +235,8 @@ void DockAreaTitleBarPrivate::createButtons()
231235
_this->connect(MinimizeButton, SIGNAL(clicked()), SLOT(minimizeAutoHideContainer()));
232236

233237
// Close button
234-
CloseButton = new CTitleBarButton(testConfigFlag(CDockManager::DockAreaHasCloseButton));
238+
CloseButton = new CTitleBarButton(testConfigFlag(CDockManager::DockAreaHasCloseButton),
239+
true, TitleBarButtonClose);
235240
CloseButton->setObjectName("dockAreaCloseButton");
236241
CloseButton->setAutoRaise(true);
237242
internal::setButtonIcon(CloseButton, QStyle::SP_TitleBarCloseButton, ads::DockAreaCloseIcon);
@@ -510,7 +515,7 @@ void CDockAreaTitleBar::updateDockWidgetActionsButtons()
510515
int InsertIndex = indexOf(d->TabsMenuButton);
511516
for (auto Action : Actions)
512517
{
513-
auto Button = new CTitleBarButton(true, this);
518+
auto Button = new CTitleBarButton(true, false, TitleBarButtonTabsMenu, this);
514519
Button->setDefaultAction(Action);
515520
Button->setAutoRaise(true);
516521
Button->setPopupMode(QToolButton::InstantPopup);
@@ -856,10 +861,25 @@ void CDockAreaTitleBar::showAutoHideControls(bool Show)
856861

857862

858863
//============================================================================
859-
CTitleBarButton::CTitleBarButton(bool showInTitleBar, QWidget* parent)
864+
bool CDockAreaTitleBar::isAutoHide() const
865+
{
866+
return d->DockArea && d->DockArea->isAutoHide();
867+
}
868+
869+
870+
//============================================================================
871+
CDockAreaWidget* CDockAreaTitleBar::dockAreaWidget() const
872+
{
873+
return d->DockArea;
874+
}
875+
876+
877+
//============================================================================
878+
CTitleBarButton::CTitleBarButton(bool showInTitleBar, bool hideWhenDisabled, TitleBarButton ButtonId, QWidget* parent)
860879
: tTitleBarButton(parent),
861880
ShowInTitleBar(showInTitleBar),
862-
HideWhenDisabled(CDockManager::testConfigFlag(CDockManager::DockAreaHideDisabledButtons))
881+
HideWhenDisabled(CDockManager::testConfigFlag(CDockManager::DockAreaHideDisabledButtons) && hideWhenDisabled),
882+
TitleBarButtonId(ButtonId)
863883
{
864884
setFocusPolicy(Qt::NoFocus);
865885
}
@@ -894,16 +914,47 @@ void CTitleBarButton::setShowInTitleBar(bool Show)
894914
//============================================================================
895915
bool CTitleBarButton::event(QEvent *ev)
896916
{
897-
if (QEvent::EnabledChange == ev->type() && HideWhenDisabled)
917+
if (QEvent::EnabledChange != ev->type() || !HideWhenDisabled || !ShowInTitleBar)
898918
{
899-
// force setVisible() call
900-
// Calling setVisible() directly here doesn't work well when button is expected to be shown first time
901-
QMetaObject::invokeMethod(this, "setVisible", Qt::QueuedConnection, Q_ARG(bool, isEnabled()));
919+
return Super::event(ev);
902920
}
903921

922+
bool Show = true;
923+
if (isInAutoHideArea())
924+
{
925+
switch (TitleBarButtonId)
926+
{
927+
case TitleBarButtonClose: Show = CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideHasCloseButton); break;
928+
case TitleBarButtonUndock: Show = false; break;
929+
default:
930+
break;
931+
}
932+
}
933+
934+
// force setVisible() call - Calling setVisible() directly here doesn't
935+
// work well when button is expected to be shown first time
936+
QMetaObject::invokeMethod(this, "setVisible", Qt::QueuedConnection,
937+
Q_ARG(bool, isEnabledTo(this->parentWidget()) & Show));
938+
904939
return Super::event(ev);
905940
}
906941

942+
943+
//============================================================================
944+
CDockAreaTitleBar* CTitleBarButton::titleBar() const
945+
{
946+
return qobject_cast<CDockAreaTitleBar*>(parentWidget());
947+
}
948+
949+
950+
//============================================================================
951+
bool CTitleBarButton::isInAutoHideArea() const
952+
{
953+
auto TitleBar = titleBar();
954+
return TitleBar && TitleBar->isAutoHide();
955+
}
956+
957+
907958
//============================================================================
908959
CSpacerWidget::CSpacerWidget(QWidget* Parent /*= 0*/) : Super(Parent)
909960
{

src/DockAreaTitleBar.h

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class CDockAreaTabBar;
4343
class CDockAreaWidget;
4444
struct DockAreaTitleBarPrivate;
4545
class CElidingLabel;
46+
class CDockAreaTitleBar;
4647

4748
using tTitleBarButton = QToolButton;
4849

@@ -59,10 +60,12 @@ class CTitleBarButton : public tTitleBarButton
5960
private:
6061
bool ShowInTitleBar = true;
6162
bool HideWhenDisabled = false;
63+
TitleBarButton TitleBarButtonId;
6264

6365
public:
6466
using Super = tTitleBarButton;
65-
CTitleBarButton(bool ShowInTitleBar = true, QWidget* parent = nullptr);
67+
CTitleBarButton(bool ShowInTitleBar, bool HideWhenDisabled, TitleBarButton ButtonId,
68+
QWidget* parent = nullptr);
6669

6770
/**
6871
* Adjust this visibility change request with our internal settings:
@@ -74,6 +77,22 @@ class CTitleBarButton : public tTitleBarButton
7477
*/
7578
void setShowInTitleBar(bool Show);
7679

80+
/**
81+
* Identifier for the title bar button
82+
*/
83+
TitleBarButton buttonId() const {return TitleBarButtonId;}
84+
85+
/**
86+
* Return the title bar that contains this button
87+
*/
88+
CDockAreaTitleBar* titleBar() const;
89+
90+
/**
91+
* Returns true, if the button is in a title bar in an auto hide area
92+
*/
93+
bool isInAutoHideArea() const;
94+
95+
7796
protected:
7897
/**
7998
* Handle EnabledChanged signal to set button invisible if the configured
@@ -169,6 +188,11 @@ public Q_SLOTS:
169188
*/
170189
CElidingLabel* autoHideTitleLabel() const;
171190

191+
/**
192+
* Returns the dock area widget that contains this title bar
193+
*/
194+
CDockAreaWidget* dockAreaWidget() const;
195+
172196
/**
173197
* Updates the visibility of the dock widget actions in the title bar
174198
*/
@@ -215,6 +239,11 @@ public Q_SLOTS:
215239
*/
216240
void showAutoHideControls(bool Show);
217241

242+
/**
243+
* Returns true, if the auto hide controls are visible
244+
*/
245+
bool isAutoHide() const;
246+
218247
Q_SIGNALS:
219248
/**
220249
* This signal is emitted if a tab in the tab bar is clicked by the user

src/DockAreaWidget.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -370,10 +370,21 @@ void DockAreaWidgetPrivate::updateTitleBarButtonStates()
370370
return;
371371
}
372372

373-
TitleBar->button(TitleBarButtonClose)->setEnabled(
374-
_this->features().testFlag(CDockWidget::DockWidgetClosable));
375-
TitleBar->button(TitleBarButtonUndock)->setEnabled(
376-
_this->features().testFlag(CDockWidget::DockWidgetFloatable));
373+
if (_this->isAutoHide())
374+
{
375+
if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideHasCloseButton))
376+
{
377+
TitleBar->button(TitleBarButtonClose)->setEnabled(
378+
_this->features().testFlag(CDockWidget::DockWidgetClosable));
379+
}
380+
}
381+
else
382+
{
383+
TitleBar->button(TitleBarButtonUndock)->setEnabled(
384+
_this->features().testFlag(CDockWidget::DockWidgetFloatable));
385+
TitleBar->button(TitleBarButtonClose)->setEnabled(
386+
_this->features().testFlag(CDockWidget::DockWidgetClosable));
387+
}
377388
TitleBar->button(TitleBarButtonAutoHide)->setEnabled(
378389
_this->features().testFlag(CDockWidget::DockWidgetPinnable));
379390
TitleBar->updateDockWidgetActionsButtons();
@@ -393,7 +404,7 @@ void DockAreaWidgetPrivate::updateTitleBarButtonVisibility(bool IsTopLevel)
393404
bool IsAutoHide = _this->isAutoHide();
394405
if (IsAutoHide)
395406
{
396-
bool ShowCloseButton = CDockManager::autoHideConfigFlags().testFlag(CDockManager::AutoHideHasCloseButton);
407+
bool ShowCloseButton = CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideHasCloseButton);
397408
TitleBar->button(TitleBarButtonClose)->setVisible(ShowCloseButton);
398409
TitleBar->button(TitleBarButtonAutoHide)->setVisible(true);
399410
TitleBar->button(TitleBarButtonUndock)->setVisible(false);
@@ -410,7 +421,8 @@ void DockAreaWidgetPrivate::updateTitleBarButtonVisibility(bool IsTopLevel)
410421
else
411422
{
412423
TitleBar->button(TitleBarButtonClose)->setVisible(true);
413-
TitleBar->button(TitleBarButtonAutoHide)->setVisible(true);
424+
bool ShowAutoHideButton = CDockManager::testAutoHideConfigFlag(CDockManager::DockAreaHasAutoHideButton);
425+
TitleBar->button(TitleBarButtonAutoHide)->setVisible(ShowAutoHideButton);
414426
TitleBar->button(TitleBarButtonUndock)->setVisible(true);
415427
TitleBar->button(TitleBarButtonTabsMenu)->setVisible(true);
416428
}

0 commit comments

Comments
 (0)