1 #ifndef BREEZE_DECORATION_H
2 #define BREEZE_DECORATION_H
3 
4 /*
5  * SPDX-FileCopyrightText: 2014 Martin Gräßlin <mgraesslin@kde.org>
6  * SPDX-FileCopyrightText: 2014 Hugo Pereira Da Costa <hugo.pereira@free.fr>
7  *
8  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
9  */
10 
11 #include "breeze.h"
12 #include "breezesettings.h"
13 
14 #include <KDecoration2/Decoration>
15 #include <KDecoration2/DecoratedClient>
16 #include <KDecoration2/DecorationSettings>
17 
18 #include <QPalette>
19 #include <QVariant>
20 #include <QVariantAnimation>
21 
22 class QVariantAnimation;
23 
24 namespace KDecoration2
25 {
26     class DecorationButton;
27     class DecorationButtonGroup;
28 }
29 
30 namespace Breeze
31 {
32     class SizeGrip;
33     class Decoration : public KDecoration2::Decoration
34     {
35         Q_OBJECT
36 
37         public:
38 
39         //* constructor
40         explicit Decoration(QObject *parent = nullptr, const QVariantList &args = QVariantList());
41 
42         //* destructor
43         virtual ~Decoration();
44 
45         //* paint
46         void paint(QPainter *painter, const QRect &repaintRegion) override;
47 
48         //* internal settings
internalSettings()49         InternalSettingsPtr internalSettings() const
50         { return m_internalSettings; }
51 
animationsDuration()52         qreal animationsDuration() const
53         { return m_animation->duration();}
54 
55         //* caption height
56         int captionHeight() const;
57 
58         //* button height
59         int buttonHeight() const;
60 
61         //*@name active state change animation
62         //@{
63         void setOpacity( qreal );
64 
opacity()65         qreal opacity() const
66         { return m_opacity; }
67 
68         //@}
69 
70         //*@name colors
71         //@{
72         QColor titleBarColor() const;
73         QColor outlineColor() const;
74         QColor fontColor() const;
75         //@}
76 
77         //*@name maximization modes
78         //@{
79         inline bool isMaximized() const;
80         inline bool isMaximizedHorizontally() const;
81         inline bool isMaximizedVertically() const;
82 
83         inline bool isLeftEdge() const;
84         inline bool isRightEdge() const;
85         inline bool isTopEdge() const;
86         inline bool isBottomEdge() const;
87 
88         inline bool hideTitleBar() const;
89         //@}
90 
91         public Q_SLOTS:
92         void init() override;
93 
94         private Q_SLOTS:
95         void reconfigure();
96         void recalculateBorders();
97         void updateButtonsGeometry();
98         void updateButtonsGeometryDelayed();
99         void updateTitleBar();
100         void updateAnimationState();
101         void updateSizeGripVisibility();
102 
103         private:
104 
105         //* return the rect in which caption will be drawn
106         QPair<QRect,Qt::Alignment> captionRect() const;
107 
108         void createButtons();
109         void paintTitleBar(QPainter *painter, const QRect &repaintRegion);
110         void updateShadow();
111         QSharedPointer<KDecoration2::DecorationShadow> createShadowObject( const float strengthScale );
112         void setScaledCornerRadius();
113 
114         //*@name border size
115         //@{
116         int borderSize(bool bottom = false) const;
117         inline bool hasBorders() const;
118         inline bool hasNoBorders() const;
119         inline bool hasNoSideBorders() const;
120         //@}
121 
122         //*@name size grip
123         //@{
124         void createSizeGrip();
125         void deleteSizeGrip();
sizeGrip()126         SizeGrip* sizeGrip() const
127         { return m_sizeGrip; }
128         //@}
129 
130         InternalSettingsPtr m_internalSettings;
131         KDecoration2::DecorationButtonGroup *m_leftButtons = nullptr;
132         KDecoration2::DecorationButtonGroup *m_rightButtons = nullptr;
133 
134         //* size grip widget
135         SizeGrip *m_sizeGrip = nullptr;
136 
137         //* active state change animation
138         QVariantAnimation *m_animation;
139         QVariantAnimation *m_shadowAnimation;
140 
141         //* active state change opacity
142         qreal m_opacity = 0;
143         qreal m_shadowOpacity = 0;
144 
145 
146         //*frame corner radius, scaled according to DPI
147         qreal m_scaledCornerRadius = 3;
148     };
149 
hasBorders()150     bool Decoration::hasBorders() const
151     {
152         if( m_internalSettings && m_internalSettings->mask() & BorderSize ) return m_internalSettings->borderSize() > InternalSettings::BorderNoSides;
153         else return settings()->borderSize() > KDecoration2::BorderSize::NoSides;
154     }
155 
hasNoBorders()156     bool Decoration::hasNoBorders() const
157     {
158         if( m_internalSettings && m_internalSettings->mask() & BorderSize ) return m_internalSettings->borderSize() == InternalSettings::BorderNone;
159         else return settings()->borderSize() == KDecoration2::BorderSize::None;
160     }
161 
hasNoSideBorders()162     bool Decoration::hasNoSideBorders() const
163     {
164         if( m_internalSettings && m_internalSettings->mask() & BorderSize ) return m_internalSettings->borderSize() == InternalSettings::BorderNoSides;
165         else return settings()->borderSize() == KDecoration2::BorderSize::NoSides;
166     }
167 
isMaximized()168     bool Decoration::isMaximized() const
169     { return client().data()->isMaximized() && !m_internalSettings->drawBorderOnMaximizedWindows(); }
170 
isMaximizedHorizontally()171     bool Decoration::isMaximizedHorizontally() const
172     { return client().data()->isMaximizedHorizontally() && !m_internalSettings->drawBorderOnMaximizedWindows(); }
173 
isMaximizedVertically()174     bool Decoration::isMaximizedVertically() const
175     { return client().data()->isMaximizedVertically() && !m_internalSettings->drawBorderOnMaximizedWindows(); }
176 
isLeftEdge()177     bool Decoration::isLeftEdge() const
178     { return (client().data()->isMaximizedHorizontally() || client().data()->adjacentScreenEdges().testFlag( Qt::LeftEdge ) ) && !m_internalSettings->drawBorderOnMaximizedWindows(); }
179 
isRightEdge()180     bool Decoration::isRightEdge() const
181     { return (client().data()->isMaximizedHorizontally() || client().data()->adjacentScreenEdges().testFlag( Qt::RightEdge ) ) && !m_internalSettings->drawBorderOnMaximizedWindows(); }
182 
isTopEdge()183     bool Decoration::isTopEdge() const
184     { return (client().data()->isMaximizedVertically() || client().data()->adjacentScreenEdges().testFlag( Qt::TopEdge ) ) && !m_internalSettings->drawBorderOnMaximizedWindows(); }
185 
isBottomEdge()186     bool Decoration::isBottomEdge() const
187     { return (client().data()->isMaximizedVertically() || client().data()->adjacentScreenEdges().testFlag( Qt::BottomEdge ) ) && !m_internalSettings->drawBorderOnMaximizedWindows(); }
188 
hideTitleBar()189     bool Decoration::hideTitleBar() const
190     { return m_internalSettings->hideTitleBar() && !client().data()->isShaded(); }
191 
192 }
193 
194 #endif
195