Skip to content

Commit dcf1ee3

Browse files
Added support for CSS styling of custom widget titlebar close button
1 parent 04aecb3 commit dcf1ee3

File tree

6 files changed

+107
-20
lines changed

6 files changed

+107
-20
lines changed

src/FloatingDockContainer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,7 @@ CFloatingDockContainer::CFloatingDockContainer(CDockManager *DockManager) :
635635
{
636636
// KDE doesn't seem to fire MoveEvents while moving windows, so for now no native titlebar for everything using KWin.
637637
QString window_manager = internal::windowManager().toUpper().split(" ")[0];
638-
bool native_window = window_manager != "KWIN";
638+
native_window = window_manager != "KWIN";
639639
}
640640

641641
if (native_window)

src/ads.qrc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,9 @@
1010
<file>images/tabs-menu-button.svg</file>
1111
<file>images/detach-button.svg</file>
1212
<file>images/detach-button-disabled.svg</file>
13+
<file>images/maximize-button.svg</file>
14+
<file>images/maximize-button-focused.svg</file>
15+
<file>images/restore-button.svg</file>
16+
<file>images/restore-button-focused.svg</file>
1317
</qresource>
1418
</RCC>

src/linux/FloatingWidgetTitleBar.cpp

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ struct FloatingWidgetTitleBarPrivate
6060
tMaximizeButton* MaximizeButton = nullptr;
6161
CFloatingDockContainer *FloatingWidget = nullptr;
6262
eDragState DragState = DraggingInactive;
63+
QIcon MaximizeIcon;
64+
QIcon NormalIcon;
65+
bool Maximized = false;
6366

6467
FloatingWidgetTitleBarPrivate(CFloatingWidgetTitleBar *_public) :
6568
_this(_public)
@@ -133,6 +136,15 @@ CFloatingWidgetTitleBar::CFloatingWidgetTitleBar(CFloatingDockContainer *parent)
133136
{
134137
d->FloatingWidget = parent;
135138
d->createLayout();
139+
140+
auto normalPixmap = this->style()->standardPixmap(QStyle::SP_TitleBarNormalButton, 0, d->MaximizeButton);
141+
d->NormalIcon.addPixmap(normalPixmap, QIcon::Normal);
142+
d->NormalIcon.addPixmap(internal::createTransparentPixmap(normalPixmap, 0.25), QIcon::Disabled);
143+
144+
auto maxPixmap = this->style()->standardPixmap(QStyle::SP_TitleBarMaxButton, 0, d->MaximizeButton);
145+
d->MaximizeIcon.addPixmap(maxPixmap, QIcon::Normal);
146+
d->MaximizeIcon.addPixmap(internal::createTransparentPixmap(maxPixmap, 0.25), QIcon::Disabled);
147+
setMaximizedIcon(d->Maximized);
136148
}
137149

138150
//============================================================================
@@ -230,22 +242,52 @@ void CFloatingWidgetTitleBar::mouseDoubleClickEvent(QMouseEvent *event)
230242
//============================================================================
231243
void CFloatingWidgetTitleBar::setMaximizedIcon(bool maximized)
232244
{
245+
d->Maximized = maximized;
233246
if (maximized)
234247
{
235-
QIcon normalIcon;
236-
auto normalPixmap = this->style()->standardPixmap(QStyle::SP_TitleBarNormalButton, 0, d->MaximizeButton);
237-
normalIcon.addPixmap(normalPixmap, QIcon::Normal);
238-
normalIcon.addPixmap(internal::createTransparentPixmap(normalPixmap, 0.25), QIcon::Disabled);
239-
d->MaximizeButton->setIcon(normalIcon);
248+
d->MaximizeButton->setIcon(d->NormalIcon);
240249
}
241250
else
242251
{
243-
QIcon MaxIcon;
244-
auto maxPixmap = this->style()->standardPixmap(QStyle::SP_TitleBarMaxButton, 0, d->MaximizeButton);
245-
MaxIcon.addPixmap(maxPixmap, QIcon::Normal);
246-
MaxIcon.addPixmap(internal::createTransparentPixmap(maxPixmap, 0.25), QIcon::Disabled);
247-
d->MaximizeButton->setIcon(MaxIcon);
252+
d->MaximizeButton->setIcon(d->MaximizeIcon);
253+
}
254+
}
255+
256+
257+
//============================================================================
258+
void CFloatingWidgetTitleBar::setMaximizeIcon(const QIcon& Icon)
259+
{
260+
d->MaximizeIcon = Icon;
261+
if (d->Maximized)
262+
{
263+
setMaximizedIcon(d->Maximized);
248264
}
249265
}
250266

267+
268+
//============================================================================
269+
void CFloatingWidgetTitleBar::setNormalIcon(const QIcon& Icon)
270+
{
271+
d->NormalIcon = Icon;
272+
if (!d->Maximized)
273+
{
274+
setMaximizedIcon(d->Maximized);
275+
}
276+
}
277+
278+
279+
//============================================================================
280+
QIcon CFloatingWidgetTitleBar::maximizeIcon() const
281+
{
282+
return d->MaximizeIcon;
283+
}
284+
285+
286+
//============================================================================
287+
QIcon CFloatingWidgetTitleBar::normalIcon() const
288+
{
289+
return d->NormalIcon;
290+
}
291+
292+
251293
} // namespace ads

src/linux/FloatingWidgetTitleBar.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
// INCLUDES
3131
//============================================================================
3232
#include <QFrame>
33+
#include <QIcon>
3334

3435
namespace ads
3536
{
@@ -48,6 +49,8 @@ struct FloatingWidgetTitleBarPrivate;
4849
class CFloatingWidgetTitleBar : public QFrame
4950
{
5051
Q_OBJECT
52+
Q_PROPERTY(QIcon maximizeIcon READ maximizeIcon WRITE setMaximizeIcon)
53+
Q_PROPERTY(QIcon normalIcon READ normalIcon WRITE setNormalIcon)
5154
private:
5255
FloatingWidgetTitleBarPrivate *d; ///< private data (pimpl)
5356

@@ -57,6 +60,11 @@ class CFloatingWidgetTitleBar : public QFrame
5760
virtual void mouseMoveEvent(QMouseEvent *ev) override;
5861
virtual void mouseDoubleClickEvent(QMouseEvent *event) override;
5962

63+
void setMaximizeIcon(const QIcon& Icon);
64+
QIcon maximizeIcon() const;
65+
void setNormalIcon(const QIcon& Icon);
66+
QIcon normalIcon() const;
67+
6068
public:
6169
using Super = QWidget;
6270
explicit CFloatingWidgetTitleBar(CFloatingDockContainer *parent = nullptr);

src/stylesheets/default_linux.css

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,25 @@ QScrollArea#dockWidgetScrollArea {
9292
qproperty-iconSize: 16px;
9393
}
9494

95-
#floatingTitleCloseButton {
96-
qproperty-icon: url(:/ads/images/close-button.svg);
95+
96+
ads--CFloatingWidgetTitleBar {
97+
background: palette(midlight);
98+
qproperty-maximizeIcon: url(:/ads/images/maximize-button.svg);
99+
qproperty-normalIcon: url(:/ads/images/restore-button.svg);
100+
}
101+
102+
103+
#floatingTitleCloseButton, #floatingTitleMaximizeButton {
97104
qproperty-iconSize: 16px;
98105
border: none;
99106
margin: 3px;
100107
}
101108

109+
110+
#floatingTitleCloseButton {
111+
qproperty-icon: url(:/ads/images/close-button.svg);
112+
}
113+
102114
#floatingTitleCloseButton:hover {
103115
background: rgba(0, 0, 0, 24);
104116
border: none;

src/stylesheets/focus_highlighting_linux.css

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -129,42 +129,63 @@ ads--CDockAreaWidget[focused="true"] ads--CDockAreaTitleBar {
129129
}
130130

131131

132+
ads--CFloatingWidgetTitleBar {
133+
background: palette(midlight);
134+
qproperty-maximizeIcon: url(:/ads/images/maximize-button.svg);
135+
qproperty-normalIcon: url(:/ads/images/restore-button.svg);
136+
}
137+
132138

133139
ads--CFloatingDockContainer[isActiveWindow="true"] ads--CFloatingWidgetTitleBar {
134140
background: palette(highlight);
141+
qproperty-maximizeIcon: url(:/ads/images/maximize-button-focused.svg);
142+
qproperty-normalIcon: url(:/ads/images/restore-button-focused.svg);
135143
}
136144

137145
ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleLabel {
138-
color: palette(light);
146+
color: palette(light);
139147
}
140148

141-
#floatingTitleCloseButton {
142-
qproperty-icon: url(:/ads/images/close-button.svg);
149+
#floatingTitleCloseButton, #floatingTitleMaximizeButton {
143150
qproperty-iconSize: 16px;
144151
border: none;
145152
margin: 3px;
146153
}
147154

148-
#floatingTitleCloseButton:hover {
155+
156+
#floatingTitleCloseButton {
157+
qproperty-icon: url(:/ads/images/close-button.svg);
158+
}
159+
160+
161+
#floatingTitleCloseButton:hover, #floatingTitleMaximizeButton:hover {
149162
background: rgba(0, 0, 0, 24);
150163
border: none;
151164
}
152165

153-
#floatingTitleCloseButton:pressed {
166+
167+
#floatingTitleCloseButton:pressed, #floatingTitleMaximizeButton:pressed {
154168
background: rgba(0, 0, 0, 48);
155169
}
156170

157171

172+
ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleMaximizeButton {
173+
qproperty-iconSize: 16px;
174+
}
175+
176+
158177
ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleCloseButton {
159178
qproperty-icon: url(:/ads/images/close-button-focused.svg);
160179
qproperty-iconSize: 16px;
161180
}
162181

163-
ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleCloseButton:hover {
182+
ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleCloseButton:hover,
183+
ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleMaximizeButton:hover {
164184
background: rgba(255, 255, 255, 48);
165185
}
166186

167187

168-
ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleCloseButton:pressed {
188+
ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleCloseButton:pressed,
189+
ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleMaximizeButton:pressed {
169190
background: rgba(255, 255, 255, 92);
170191
}

0 commit comments

Comments
 (0)