#ifndef BREEZE_DECORATION_H #define BREEZE_DECORATION_H /* * SPDX-FileCopyrightText: 2014 Martin Gräßlin * SPDX-FileCopyrightText: 2014 Hugo Pereira Da Costa * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ #include "breeze.h" #include "breezesettings.h" #include #include #include #include #include #include class QVariantAnimation; namespace KDecoration2 { class DecorationButton; class DecorationButtonGroup; } namespace Breeze { class SizeGrip; class Decoration : public KDecoration2::Decoration { Q_OBJECT public: //* constructor explicit Decoration(QObject *parent = nullptr, const QVariantList &args = QVariantList()); //* destructor virtual ~Decoration(); //* paint void paint(QPainter *painter, const QRect &repaintRegion) override; //* internal settings InternalSettingsPtr internalSettings() const { return m_internalSettings; } qreal animationsDuration() const { return m_animation->duration();} //* caption height int captionHeight() const; //* button height int buttonHeight() const; //*@name active state change animation //@{ void setOpacity( qreal ); qreal opacity() const { return m_opacity; } //@} //*@name colors //@{ QColor titleBarColor() const; QColor outlineColor() const; QColor fontColor() const; //@} //*@name maximization modes //@{ inline bool isMaximized() const; inline bool isMaximizedHorizontally() const; inline bool isMaximizedVertically() const; inline bool isLeftEdge() const; inline bool isRightEdge() const; inline bool isTopEdge() const; inline bool isBottomEdge() const; inline bool hideTitleBar() const; //@} public Q_SLOTS: void init() override; private Q_SLOTS: void reconfigure(); void recalculateBorders(); void updateButtonsGeometry(); void updateButtonsGeometryDelayed(); void updateTitleBar(); void updateAnimationState(); void updateSizeGripVisibility(); private: //* return the rect in which caption will be drawn QPair captionRect() const; void createButtons(); void paintTitleBar(QPainter *painter, const QRect &repaintRegion); void updateShadow(); static QSharedPointer createShadowObject(const InternalSettingsPtr& internalSettings, const float strengthScale, const int scale); //*@name border size //@{ int borderSize(bool bottom = false) const; //@} //*@name size grip //@{ void createSizeGrip(); void deleteSizeGrip(); SizeGrip* sizeGrip() const { return m_sizeGrip; } //@} InternalSettingsPtr m_internalSettings; KDecoration2::DecorationButtonGroup *m_leftButtons = nullptr; KDecoration2::DecorationButtonGroup *m_rightButtons = nullptr; //* size grip widget SizeGrip *m_sizeGrip = nullptr; //* active state change animation QVariantAnimation *m_animation; QVariantAnimation *m_shadowAnimation; //* active state change opacity qreal m_opacity = 0; qreal m_shadowOpacity = 0; }; bool Decoration::isMaximized() const { return client().data()->isMaximized() && !m_internalSettings->drawBorderOnMaximizedWindows(); } bool Decoration::isMaximizedHorizontally() const { return client().data()->isMaximizedHorizontally() && !m_internalSettings->drawBorderOnMaximizedWindows(); } bool Decoration::isMaximizedVertically() const { return client().data()->isMaximizedVertically() && !m_internalSettings->drawBorderOnMaximizedWindows(); } bool Decoration::isLeftEdge() const { return (client().data()->isMaximizedHorizontally() || client().data()->adjacentScreenEdges().testFlag( Qt::LeftEdge ) ) && !m_internalSettings->drawBorderOnMaximizedWindows(); } bool Decoration::isRightEdge() const { return (client().data()->isMaximizedHorizontally() || client().data()->adjacentScreenEdges().testFlag( Qt::RightEdge ) ) && !m_internalSettings->drawBorderOnMaximizedWindows(); } bool Decoration::isTopEdge() const { return (client().data()->isMaximizedVertically() || client().data()->adjacentScreenEdges().testFlag( Qt::TopEdge ) ) && !m_internalSettings->drawBorderOnMaximizedWindows(); } bool Decoration::isBottomEdge() const { return (client().data()->isMaximizedVertically() || client().data()->adjacentScreenEdges().testFlag( Qt::BottomEdge ) ) && !m_internalSettings->drawBorderOnMaximizedWindows(); } bool Decoration::hideTitleBar() const { return m_internalSettings->hideTitleBar() && !client().data()->isShaded(); } } #endif