Added support for CSS styling of custom widget titlebar close button

This commit is contained in:
Uwe Kindler 2020-08-31 09:38:18 +02:00
parent 04aecb3693
commit dcf1ee393e
6 changed files with 107 additions and 20 deletions

View File

@ -635,7 +635,7 @@ CFloatingDockContainer::CFloatingDockContainer(CDockManager *DockManager) :
{ {
// KDE doesn't seem to fire MoveEvents while moving windows, so for now no native titlebar for everything using KWin. // KDE doesn't seem to fire MoveEvents while moving windows, so for now no native titlebar for everything using KWin.
QString window_manager = internal::windowManager().toUpper().split(" ")[0]; QString window_manager = internal::windowManager().toUpper().split(" ")[0];
bool native_window = window_manager != "KWIN"; native_window = window_manager != "KWIN";
} }
if (native_window) if (native_window)

View File

@ -10,5 +10,9 @@
<file>images/tabs-menu-button.svg</file> <file>images/tabs-menu-button.svg</file>
<file>images/detach-button.svg</file> <file>images/detach-button.svg</file>
<file>images/detach-button-disabled.svg</file> <file>images/detach-button-disabled.svg</file>
<file>images/maximize-button.svg</file>
<file>images/maximize-button-focused.svg</file>
<file>images/restore-button.svg</file>
<file>images/restore-button-focused.svg</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -60,6 +60,9 @@ struct FloatingWidgetTitleBarPrivate
tMaximizeButton* MaximizeButton = nullptr; tMaximizeButton* MaximizeButton = nullptr;
CFloatingDockContainer *FloatingWidget = nullptr; CFloatingDockContainer *FloatingWidget = nullptr;
eDragState DragState = DraggingInactive; eDragState DragState = DraggingInactive;
QIcon MaximizeIcon;
QIcon NormalIcon;
bool Maximized = false;
FloatingWidgetTitleBarPrivate(CFloatingWidgetTitleBar *_public) : FloatingWidgetTitleBarPrivate(CFloatingWidgetTitleBar *_public) :
_this(_public) _this(_public)
@ -133,6 +136,15 @@ CFloatingWidgetTitleBar::CFloatingWidgetTitleBar(CFloatingDockContainer *parent)
{ {
d->FloatingWidget = parent; d->FloatingWidget = parent;
d->createLayout(); d->createLayout();
auto normalPixmap = this->style()->standardPixmap(QStyle::SP_TitleBarNormalButton, 0, d->MaximizeButton);
d->NormalIcon.addPixmap(normalPixmap, QIcon::Normal);
d->NormalIcon.addPixmap(internal::createTransparentPixmap(normalPixmap, 0.25), QIcon::Disabled);
auto maxPixmap = this->style()->standardPixmap(QStyle::SP_TitleBarMaxButton, 0, d->MaximizeButton);
d->MaximizeIcon.addPixmap(maxPixmap, QIcon::Normal);
d->MaximizeIcon.addPixmap(internal::createTransparentPixmap(maxPixmap, 0.25), QIcon::Disabled);
setMaximizedIcon(d->Maximized);
} }
//============================================================================ //============================================================================
@ -230,22 +242,52 @@ void CFloatingWidgetTitleBar::mouseDoubleClickEvent(QMouseEvent *event)
//============================================================================ //============================================================================
void CFloatingWidgetTitleBar::setMaximizedIcon(bool maximized) void CFloatingWidgetTitleBar::setMaximizedIcon(bool maximized)
{ {
d->Maximized = maximized;
if (maximized) if (maximized)
{ {
QIcon normalIcon; d->MaximizeButton->setIcon(d->NormalIcon);
auto normalPixmap = this->style()->standardPixmap(QStyle::SP_TitleBarNormalButton, 0, d->MaximizeButton);
normalIcon.addPixmap(normalPixmap, QIcon::Normal);
normalIcon.addPixmap(internal::createTransparentPixmap(normalPixmap, 0.25), QIcon::Disabled);
d->MaximizeButton->setIcon(normalIcon);
} }
else else
{ {
QIcon MaxIcon; d->MaximizeButton->setIcon(d->MaximizeIcon);
auto maxPixmap = this->style()->standardPixmap(QStyle::SP_TitleBarMaxButton, 0, d->MaximizeButton);
MaxIcon.addPixmap(maxPixmap, QIcon::Normal);
MaxIcon.addPixmap(internal::createTransparentPixmap(maxPixmap, 0.25), QIcon::Disabled);
d->MaximizeButton->setIcon(MaxIcon);
} }
} }
//============================================================================
void CFloatingWidgetTitleBar::setMaximizeIcon(const QIcon& Icon)
{
d->MaximizeIcon = Icon;
if (d->Maximized)
{
setMaximizedIcon(d->Maximized);
}
}
//============================================================================
void CFloatingWidgetTitleBar::setNormalIcon(const QIcon& Icon)
{
d->NormalIcon = Icon;
if (!d->Maximized)
{
setMaximizedIcon(d->Maximized);
}
}
//============================================================================
QIcon CFloatingWidgetTitleBar::maximizeIcon() const
{
return d->MaximizeIcon;
}
//============================================================================
QIcon CFloatingWidgetTitleBar::normalIcon() const
{
return d->NormalIcon;
}
} // namespace ads } // namespace ads

View File

@ -30,6 +30,7 @@
// INCLUDES // INCLUDES
//============================================================================ //============================================================================
#include <QFrame> #include <QFrame>
#include <QIcon>
namespace ads namespace ads
{ {
@ -48,6 +49,8 @@ struct FloatingWidgetTitleBarPrivate;
class CFloatingWidgetTitleBar : public QFrame class CFloatingWidgetTitleBar : public QFrame
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QIcon maximizeIcon READ maximizeIcon WRITE setMaximizeIcon)
Q_PROPERTY(QIcon normalIcon READ normalIcon WRITE setNormalIcon)
private: private:
FloatingWidgetTitleBarPrivate *d; ///< private data (pimpl) FloatingWidgetTitleBarPrivate *d; ///< private data (pimpl)
@ -57,6 +60,11 @@ protected:
virtual void mouseMoveEvent(QMouseEvent *ev) override; virtual void mouseMoveEvent(QMouseEvent *ev) override;
virtual void mouseDoubleClickEvent(QMouseEvent *event) override; virtual void mouseDoubleClickEvent(QMouseEvent *event) override;
void setMaximizeIcon(const QIcon& Icon);
QIcon maximizeIcon() const;
void setNormalIcon(const QIcon& Icon);
QIcon normalIcon() const;
public: public:
using Super = QWidget; using Super = QWidget;
explicit CFloatingWidgetTitleBar(CFloatingDockContainer *parent = nullptr); explicit CFloatingWidgetTitleBar(CFloatingDockContainer *parent = nullptr);

View File

@ -92,13 +92,25 @@ QScrollArea#dockWidgetScrollArea {
qproperty-iconSize: 16px; qproperty-iconSize: 16px;
} }
#floatingTitleCloseButton {
qproperty-icon: url(:/ads/images/close-button.svg); ads--CFloatingWidgetTitleBar {
background: palette(midlight);
qproperty-maximizeIcon: url(:/ads/images/maximize-button.svg);
qproperty-normalIcon: url(:/ads/images/restore-button.svg);
}
#floatingTitleCloseButton, #floatingTitleMaximizeButton {
qproperty-iconSize: 16px; qproperty-iconSize: 16px;
border: none; border: none;
margin: 3px; margin: 3px;
} }
#floatingTitleCloseButton {
qproperty-icon: url(:/ads/images/close-button.svg);
}
#floatingTitleCloseButton:hover { #floatingTitleCloseButton:hover {
background: rgba(0, 0, 0, 24); background: rgba(0, 0, 0, 24);
border: none; border: none;

View File

@ -129,42 +129,63 @@ ads--CDockAreaWidget[focused="true"] ads--CDockAreaTitleBar {
} }
ads--CFloatingWidgetTitleBar {
background: palette(midlight);
qproperty-maximizeIcon: url(:/ads/images/maximize-button.svg);
qproperty-normalIcon: url(:/ads/images/restore-button.svg);
}
ads--CFloatingDockContainer[isActiveWindow="true"] ads--CFloatingWidgetTitleBar { ads--CFloatingDockContainer[isActiveWindow="true"] ads--CFloatingWidgetTitleBar {
background: palette(highlight); background: palette(highlight);
qproperty-maximizeIcon: url(:/ads/images/maximize-button-focused.svg);
qproperty-normalIcon: url(:/ads/images/restore-button-focused.svg);
} }
ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleLabel { ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleLabel {
color: palette(light); color: palette(light);
} }
#floatingTitleCloseButton { #floatingTitleCloseButton, #floatingTitleMaximizeButton {
qproperty-icon: url(:/ads/images/close-button.svg);
qproperty-iconSize: 16px; qproperty-iconSize: 16px;
border: none; border: none;
margin: 3px; margin: 3px;
} }
#floatingTitleCloseButton:hover {
#floatingTitleCloseButton {
qproperty-icon: url(:/ads/images/close-button.svg);
}
#floatingTitleCloseButton:hover, #floatingTitleMaximizeButton:hover {
background: rgba(0, 0, 0, 24); background: rgba(0, 0, 0, 24);
border: none; border: none;
} }
#floatingTitleCloseButton:pressed {
#floatingTitleCloseButton:pressed, #floatingTitleMaximizeButton:pressed {
background: rgba(0, 0, 0, 48); background: rgba(0, 0, 0, 48);
} }
ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleMaximizeButton {
qproperty-iconSize: 16px;
}
ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleCloseButton { ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleCloseButton {
qproperty-icon: url(:/ads/images/close-button-focused.svg); qproperty-icon: url(:/ads/images/close-button-focused.svg);
qproperty-iconSize: 16px; qproperty-iconSize: 16px;
} }
ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleCloseButton:hover { ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleCloseButton:hover,
ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleMaximizeButton:hover {
background: rgba(255, 255, 255, 48); background: rgba(255, 255, 255, 48);
} }
ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleCloseButton:pressed { ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleCloseButton:pressed,
ads--CFloatingDockContainer[isActiveWindow="true"] #floatingTitleMaximizeButton:pressed {
background: rgba(255, 255, 255, 92); background: rgba(255, 255, 255, 92);
} }