Skip to content

Commit b8ed70f

Browse files
authored
Added DockAreaHideDisabledButtons configuration flag (#110)
* CInvisibleButton generalized to CTitleBarButton to serve more purposes * Disabled buttons are hidden if CDockManager::DockAreaHideDisabledButtons set to true
1 parent 50652b0 commit b8ed70f

File tree

4 files changed

+106
-83
lines changed

4 files changed

+106
-83
lines changed

demo/MainWindow.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,8 @@ void MainWindowPrivate::createContent()
276276
QMenu* ViewMenu = ui.menuView;
277277
auto DockWidget = createCalendarDockWidget(ViewMenu);
278278
DockWidget->setFeature(ads::CDockWidget::DockWidgetClosable, false);
279+
DockWidget->setFeature(ads::CDockWidget::DockWidgetMovable, false);
280+
DockWidget->setFeature(ads::CDockWidget::DockWidgetFloatable, false);
279281
auto SpecialDockArea = DockManager->addDockWidget(ads::LeftDockWidgetArea, DockWidget);
280282

281283
// For this Special Dock Area we want to avoid dropping on the center of it (i.e. we don't want this widget to be ever tabbified):
@@ -432,6 +434,9 @@ CMainWindow::CMainWindow(QWidget *parent) :
432434
// uncomment the following line if you don't want tabs menu button on DockArea's title bar
433435
//CDockManager::setConfigFlag(CDockManager::DockAreaHasTabsMenuButton, false);
434436

437+
// uncomment the following line if you don't want disabled buttons to appear on DockArea's title bar
438+
//CDockManager::setConfigFlag(CDockManager::DockAreaHideDisabledButtons, true);
439+
435440
// Now create the dock manager and its content
436441
d->DockManager = new CDockManager(this);
437442

src/DockAreaTitleBar.cpp

Lines changed: 89 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -55,28 +55,6 @@ namespace ads
5555
{
5656
using tTitleBarButton = QToolButton;
5757

58-
/**
59-
* Some kind of dummy button that is used if certain buttons are hidden
60-
* by dock manager config flags (i.e CDockManager::DockAreaHasCloseButton is
61-
* disabled)
62-
*/
63-
class CInvisibleButton : public tTitleBarButton
64-
{
65-
public:
66-
CInvisibleButton(QWidget* parent = nullptr)
67-
: tTitleBarButton(parent)
68-
{
69-
this->hide();
70-
}
71-
72-
73-
virtual void setVisible(bool visible) override
74-
{
75-
Q_UNUSED(visible);
76-
tTitleBarButton::setVisible(false);
77-
}
78-
};
79-
8058

8159
/**
8260
* Private data class of CDockAreaTitleBar class (pimpl)
@@ -119,7 +97,7 @@ struct DockAreaTitleBarPrivate
11997
/**
12098
* Returns true if the given config flag is set
12199
*/
122-
bool testConfigFlag(CDockManager::eConfigFlag Flag) const
100+
static bool testConfigFlag(CDockManager::eConfigFlag Flag)
123101
{
124102
return CDockManager::configFlags().testFlag(Flag);
125103
}
@@ -154,6 +132,55 @@ struct DockAreaTitleBarPrivate
154132
};// struct DockAreaTitleBarPrivate
155133

156134

135+
/**
136+
* Title bar button of a dock area that customizes tTitleBarButton appearance/behaviour
137+
* according to various config flags such as:
138+
* CDockManager::DockAreaHas_xxx_Button - if set to 'false' keeps the button always invisible
139+
* CDockManager::DockAreaHideDisabledButtons - if set to 'true' hides button when it is disabled
140+
*/
141+
class CTitleBarButton : public tTitleBarButton
142+
{
143+
bool Visible = true;
144+
bool HideWhenDisabled = false;
145+
public:
146+
CTitleBarButton(bool visible = true, QWidget* parent = nullptr)
147+
: tTitleBarButton(parent)
148+
, Visible(visible)
149+
, HideWhenDisabled(DockAreaTitleBarPrivate::testConfigFlag(CDockManager::DockAreaHideDisabledButtons))
150+
{
151+
//this->setVisible(Visible); // this causes flickering and seems not to be needed TODO: investigate further and in case it IS needed fix flickering
152+
}
153+
154+
155+
virtual void setVisible(bool visible) override
156+
{
157+
// Adjust this visibility change request with our internal settings:
158+
159+
// 'visible' can stay 'true' if and only if this button is configured to generaly visible:
160+
visible = visible && this->Visible;
161+
162+
// 'visible' can stay 'true' unless: this button is configured to be invisible when it is disabled and it is currently disabled:
163+
if(visible && HideWhenDisabled)
164+
{
165+
visible = isEnabled();
166+
}
167+
168+
tTitleBarButton::setVisible(visible);
169+
}
170+
171+
protected:
172+
bool event(QEvent *ev) override
173+
{
174+
if(QEvent::EnabledChange == ev->type() && HideWhenDisabled)
175+
{
176+
// force setVisible() call
177+
setVisible(isEnabled());
178+
}
179+
180+
return tTitleBarButton::event(ev);;
181+
}
182+
};
183+
157184

158185
//============================================================================
159186
DockAreaTitleBarPrivate::DockAreaTitleBarPrivate(CDockAreaTitleBar* _public) :
@@ -168,79 +195,58 @@ void DockAreaTitleBarPrivate::createButtons()
168195
{
169196
QSizePolicy ButtonSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
170197

171-
if (testConfigFlag(CDockManager::DockAreaHasTabsMenuButton))
172-
{
173-
// Tabs menu button
174-
TabsMenuButton = new tTitleBarButton();
175-
TabsMenuButton->setObjectName("tabsMenuButton");
176-
TabsMenuButton->setAutoRaise(true);
177-
TabsMenuButton->setPopupMode(QToolButton::InstantPopup);
178-
setTitleBarButtonIcon(TabsMenuButton, QStyle::SP_TitleBarUnshadeButton, ads::DockAreaMenuIcon);
179-
QMenu* TabsMenu = new QMenu(TabsMenuButton);
198+
// Tabs menu button
199+
TabsMenuButton = new CTitleBarButton(testConfigFlag(CDockManager::DockAreaHasTabsMenuButton));
200+
TabsMenuButton->setObjectName("tabsMenuButton");
201+
TabsMenuButton->setAutoRaise(true);
202+
TabsMenuButton->setPopupMode(QToolButton::InstantPopup);
203+
setTitleBarButtonIcon(TabsMenuButton, QStyle::SP_TitleBarUnshadeButton, ads::DockAreaMenuIcon);
204+
QMenu* TabsMenu = new QMenu(TabsMenuButton);
180205
#ifndef QT_NO_TOOLTIP
181-
TabsMenu->setToolTipsVisible(true);
206+
TabsMenu->setToolTipsVisible(true);
182207
#endif
183-
_this->connect(TabsMenu, SIGNAL(aboutToShow()), SLOT(onTabsMenuAboutToShow()));
184-
TabsMenuButton->setMenu(TabsMenu);
208+
_this->connect(TabsMenu, SIGNAL(aboutToShow()), SLOT(onTabsMenuAboutToShow()));
209+
TabsMenuButton->setMenu(TabsMenu);
185210
#ifndef QT_NO_TOOLTIP
186-
TabsMenuButton->setToolTip(QObject::tr("List all tabs"));
211+
TabsMenuButton->setToolTip(QObject::tr("List all tabs"));
187212
#endif
188-
TabsMenuButton->setSizePolicy(ButtonSizePolicy);
189-
TopLayout->addWidget(TabsMenuButton, 0);
190-
_this->connect(TabsMenuButton->menu(), SIGNAL(triggered(QAction*)),
191-
SLOT(onTabsMenuActionTriggered(QAction*)));
192-
}
193-
else
194-
{
195-
TabsMenuButton = new CInvisibleButton();
196-
}
213+
TabsMenuButton->setSizePolicy(ButtonSizePolicy);
214+
TopLayout->addWidget(TabsMenuButton, 0);
215+
_this->connect(TabsMenuButton->menu(), SIGNAL(triggered(QAction*)),
216+
SLOT(onTabsMenuActionTriggered(QAction*)));
197217

198218

199-
if (testConfigFlag(CDockManager::DockAreaHasUndockButton))
200-
{
201-
// Undock button
202-
UndockButton = new tTitleBarButton();
203-
UndockButton->setObjectName("undockButton");
204-
UndockButton->setAutoRaise(true);
219+
// Undock button
220+
UndockButton = new CTitleBarButton(testConfigFlag(CDockManager::DockAreaHasUndockButton));
221+
UndockButton->setObjectName("undockButton");
222+
UndockButton->setAutoRaise(true);
205223
#ifndef QT_NO_TOOLTIP
206-
UndockButton->setToolTip(QObject::tr("Detach Group"));
224+
UndockButton->setToolTip(QObject::tr("Detach Group"));
207225
#endif
208-
setTitleBarButtonIcon(UndockButton, QStyle::SP_TitleBarNormalButton, ads::DockAreaUndockIcon);
209-
UndockButton->setSizePolicy(ButtonSizePolicy);
210-
TopLayout->addWidget(UndockButton, 0);
211-
_this->connect(UndockButton, SIGNAL(clicked()), SLOT(onUndockButtonClicked()));
212-
}
213-
else
214-
{
215-
UndockButton = new CInvisibleButton();
216-
}
217-
218-
if (testConfigFlag(CDockManager::DockAreaHasCloseButton))
219-
{
220-
// Close button
221-
CloseButton = new tTitleBarButton();
222-
CloseButton->setObjectName("closeButton");
223-
CloseButton->setAutoRaise(true);
224-
setTitleBarButtonIcon(CloseButton, QStyle::SP_TitleBarCloseButton, ads::DockAreaCloseIcon);
226+
setTitleBarButtonIcon(UndockButton, QStyle::SP_TitleBarNormalButton, ads::DockAreaUndockIcon);
227+
UndockButton->setSizePolicy(ButtonSizePolicy);
228+
TopLayout->addWidget(UndockButton, 0);
229+
_this->connect(UndockButton, SIGNAL(clicked()), SLOT(onUndockButtonClicked()));
230+
231+
// Close button
232+
CloseButton = new CTitleBarButton(testConfigFlag(CDockManager::DockAreaHasCloseButton));
233+
CloseButton->setObjectName("closeButton");
234+
CloseButton->setAutoRaise(true);
235+
setTitleBarButtonIcon(CloseButton, QStyle::SP_TitleBarCloseButton, ads::DockAreaCloseIcon);
225236
#ifndef QT_NO_TOOLTIP
226-
if (testConfigFlag(CDockManager::DockAreaCloseButtonClosesTab))
227-
{
228-
CloseButton->setToolTip(QObject::tr("Close Active Tab"));
229-
}
230-
else
231-
{
232-
CloseButton->setToolTip(QObject::tr("Close Group"));
233-
}
234-
#endif
235-
CloseButton->setSizePolicy(ButtonSizePolicy);
236-
CloseButton->setIconSize(QSize(16, 16));
237-
TopLayout->addWidget(CloseButton, 0);
238-
_this->connect(CloseButton, SIGNAL(clicked()), SLOT(onCloseButtonClicked()));
237+
if (testConfigFlag(CDockManager::DockAreaCloseButtonClosesTab))
238+
{
239+
CloseButton->setToolTip(QObject::tr("Close Active Tab"));
239240
}
240241
else
241242
{
242-
CloseButton = new CInvisibleButton();
243+
CloseButton->setToolTip(QObject::tr("Close Group"));
243244
}
245+
#endif
246+
CloseButton->setSizePolicy(ButtonSizePolicy);
247+
CloseButton->setIconSize(QSize(16, 16));
248+
TopLayout->addWidget(CloseButton, 0);
249+
_this->connect(CloseButton, SIGNAL(clicked()), SLOT(onCloseButtonClicked()));
244250
}
245251

246252

src/DockManager.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -837,6 +837,12 @@ void CDockManager::setConfigFlag(eConfigFlag Flag, bool On)
837837
internal::setFlag(StaticConfigFlags, Flag, On);
838838
}
839839

840+
//===========================================================================
841+
bool CDockManager::testConfigFlag(eConfigFlag Flag)
842+
{
843+
return configFlags().testFlag(Flag);
844+
}
845+
840846

841847
//===========================================================================
842848
CIconProvider& CDockManager::iconProvider()

src/DockManager.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ class ADS_EXPORT CDockManager : public CDockContainerWidget
159159
AlwaysShowTabs = 0x2000,///< If this option is enabled, the tab of a dock widget is always displayed - even if it is the only visible dock widget in a floating widget.
160160
DockAreaHasUndockButton = 0x4000, //!< If the flag is set each dock area has an undock button
161161
DockAreaHasTabsMenuButton = 0x8000, //!< If the flag is set each dock area has a tabs menu button
162+
DockAreaHideDisabledButtons = 0x10000, //!< If the flag is set disabled dock area buttons will not appear on the tollbar at all (enabling them will bring them back)
162163
DefaultConfig = ActiveTabHasCloseButton
163164
| DockAreaHasCloseButton
164165
| DockAreaHasUndockButton
@@ -212,6 +213,11 @@ class ADS_EXPORT CDockManager : public CDockContainerWidget
212213
*/
213214
static void setConfigFlag(eConfigFlag Flag, bool On = true);
214215

216+
/**
217+
* Returns true if the given config flag is set
218+
*/
219+
static bool testConfigFlag(eConfigFlag Flag);
220+
215221
/**
216222
* Returns the global icon provider.
217223
* The icon provider enables the use of custom icons in case using

0 commit comments

Comments
 (0)