Skip to content

Commit 9fe8f29

Browse files
Fixed CDockManager::DockAreaHasCloseButton == false issue
1 parent 102e65a commit 9fe8f29

File tree

2 files changed

+70
-27
lines changed

2 files changed

+70
-27
lines changed

demo/MainWindow.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,7 @@ CMainWindow::CMainWindow(QWidget *parent) :
411411
// comment the following line if you want to use opaque undocking and
412412
// opaque splitter resizing
413413
CDockManager::setConfigFlags(CDockManager::DefaultNonOpaqueConfig);
414+
//CDockManager::setConfigFlag(CDockManager::DockAreaHasCloseButton, false);
414415

415416
// uncomment the following line if you want a fixed tab width that does
416417
// not change if the visibility of the close button changes

src/DockAreaTitleBar.cpp

Lines changed: 69 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include <QScrollArea>
3838
#include <QMouseEvent>
3939
#include <QDebug>
40+
#include <QPointer>
4041

4142
#include "ads_globals.h"
4243
#include "FloatingDockContainer.h"
@@ -52,16 +53,40 @@
5253

5354
namespace ads
5455
{
55-
using tTileBarButton = QToolButton;
56+
using tTitleBarButton = QToolButton;
57+
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+
80+
5681
/**
5782
* Private data class of CDockAreaTitleBar class (pimpl)
5883
*/
5984
struct DockAreaTitleBarPrivate
6085
{
6186
CDockAreaTitleBar* _this;
62-
tTileBarButton* TabsMenuButton;
63-
tTileBarButton* UndockButton;
64-
tTileBarButton* CloseButton;
87+
QPointer<tTitleBarButton> TabsMenuButton;
88+
QPointer<tTitleBarButton> UndockButton;
89+
QPointer<tTitleBarButton> CloseButton;
6590
QBoxLayout* TopLayout;
6691
CDockAreaWidget* DockArea;
6792
CDockAreaTabBar* TabBar;
@@ -106,7 +131,7 @@ struct DockAreaTitleBarPrivate
106131
* If the global IconPovider of the dockmanager provides a custom
107132
* Icon for the given CustomIconId, the this icon will be used.
108133
*/
109-
void setTitleBarButtonIcon(tTileBarButton* Button, QStyle::StandardPixmap StandarPixmap,
134+
void setTitleBarButtonIcon(tTitleBarButton* Button, QStyle::StandardPixmap StandarPixmap,
110135
ads::eIcon CustomIconId)
111136
{
112137
// First we try to use custom icons if available
@@ -143,7 +168,7 @@ void DockAreaTitleBarPrivate::createButtons()
143168
{
144169
QSizePolicy ButtonSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
145170
// Tabs menu button
146-
TabsMenuButton = new tTileBarButton();
171+
TabsMenuButton = new tTitleBarButton();
147172
TabsMenuButton->setObjectName("tabsMenuButton");
148173
TabsMenuButton->setAutoRaise(true);
149174
TabsMenuButton->setPopupMode(QToolButton::InstantPopup);
@@ -164,40 +189,43 @@ void DockAreaTitleBarPrivate::createButtons()
164189

165190

166191
// Undock button
167-
UndockButton = new tTileBarButton();
192+
UndockButton = new tTitleBarButton();
168193
UndockButton->setObjectName("undockButton");
169194
UndockButton->setAutoRaise(true);
170195
#ifndef QT_NO_TOOLTIP
171196
UndockButton->setToolTip(QObject::tr("Detach Group"));
172197
#endif
173-
setTitleBarButtonIcon(UndockButton, QStyle::SP_TitleBarNormalButton, ads::DockAreaUndockIcon);
174-
UndockButton->setSizePolicy(ButtonSizePolicy);
198+
setTitleBarButtonIcon(UndockButton, QStyle::SP_TitleBarNormalButton, ads::DockAreaUndockIcon);
199+
UndockButton->setSizePolicy(ButtonSizePolicy);
175200
TopLayout->addWidget(UndockButton, 0);
176201
_this->connect(UndockButton, SIGNAL(clicked()), SLOT(onUndockButtonClicked()));
177202

178-
179-
// Close button
180-
CloseButton = new tTileBarButton();
181-
CloseButton->setObjectName("closeButton");
182-
CloseButton->setAutoRaise(true);
183-
setTitleBarButtonIcon(CloseButton, QStyle::SP_TitleBarCloseButton, ads::DockAreaCloseIcon);
184-
#ifndef QT_NO_TOOLTIP
185-
if (testConfigFlag(CDockManager::DockAreaCloseButtonClosesTab))
203+
if (testConfigFlag(CDockManager::DockAreaHasCloseButton))
186204
{
187-
CloseButton->setToolTip(QObject::tr("Close Active Tab"));
205+
// Close button
206+
CloseButton = new tTitleBarButton();
207+
CloseButton->setObjectName("closeButton");
208+
CloseButton->setAutoRaise(true);
209+
setTitleBarButtonIcon(CloseButton, QStyle::SP_TitleBarCloseButton, ads::DockAreaCloseIcon);
210+
#ifndef QT_NO_TOOLTIP
211+
if (testConfigFlag(CDockManager::DockAreaCloseButtonClosesTab))
212+
{
213+
CloseButton->setToolTip(QObject::tr("Close Active Tab"));
214+
}
215+
else
216+
{
217+
CloseButton->setToolTip(QObject::tr("Close Group"));
218+
}
219+
#endif
220+
CloseButton->setSizePolicy(ButtonSizePolicy);
221+
CloseButton->setIconSize(QSize(16, 16));
222+
TopLayout->addWidget(CloseButton, 0);
223+
_this->connect(CloseButton, SIGNAL(clicked()), SLOT(onCloseButtonClicked()));
188224
}
189225
else
190226
{
191-
CloseButton->setToolTip(QObject::tr("Close Group"));
192-
}
193-
#endif
194-
CloseButton->setSizePolicy(ButtonSizePolicy);
195-
CloseButton->setIconSize(QSize(16, 16));
196-
if (testConfigFlag(CDockManager::DockAreaHasCloseButton))
197-
{
198-
TopLayout->addWidget(CloseButton, 0);
227+
CloseButton = new CInvisibleButton();
199228
}
200-
_this->connect(CloseButton, SIGNAL(clicked()), SLOT(onCloseButtonClicked()));
201229
}
202230

203231

@@ -243,6 +271,20 @@ CDockAreaTitleBar::CDockAreaTitleBar(CDockAreaWidget* parent) :
243271
//============================================================================
244272
CDockAreaTitleBar::~CDockAreaTitleBar()
245273
{
274+
if (!d->CloseButton.isNull())
275+
{
276+
delete d->CloseButton;
277+
}
278+
279+
if (!d->TabsMenuButton.isNull())
280+
{
281+
delete d->TabsMenuButton;
282+
}
283+
284+
if (!d->UndockButton.isNull())
285+
{
286+
delete d->UndockButton;
287+
}
246288
delete d;
247289
}
248290

0 commit comments

Comments
 (0)