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