@@ -55,28 +55,6 @@ namespace ads
5555{
5656using 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// ============================================================================
159186DockAreaTitleBarPrivate::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
0 commit comments