File indexing completed on 2024-05-12 16:58:27

0001 /*
0002  * SPDX-FileCopyrightText: 2014 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #ifndef breezeframeshadow_h
0008 #define breezeframeshadow_h
0009 
0010 #include "breeze.h"
0011 #include "breezeaddeventfilter.h"
0012 #include "breezehelper.h"
0013 
0014 #include <QEvent>
0015 #include <QObject>
0016 #include <QSet>
0017 
0018 #include <KColorScheme>
0019 #include <QPaintEvent>
0020 #include <QWidget>
0021 
0022 namespace Breeze
0023 {
0024 //* shadow manager
0025 class FrameShadowFactory : public QObject
0026 {
0027     Q_OBJECT
0028 
0029 public:
0030     //* constructor
0031     explicit FrameShadowFactory(QObject *parent)
0032         : QObject(parent)
0033     {
0034     }
0035 
0036     //* register widget
0037     bool registerWidget(QWidget *, Helper &);
0038 
0039     //* unregister
0040     void unregisterWidget(QWidget *);
0041 
0042     //* true if widget is registered
0043     bool isRegistered(const QWidget *widget) const
0044     {
0045         return _registeredWidgets.contains(widget);
0046     }
0047 
0048     //* event filter
0049     bool eventFilter(QObject *, QEvent *) override;
0050 
0051     //* update state
0052     void updateState(const QWidget *, bool focus, bool hover, qreal opacity, AnimationMode) const;
0053 
0054     //* update shadows geometry
0055     void updateShadowsGeometry(const QObject *, QRect) const;
0056 
0057 protected:
0058     //* install shadows on given widget
0059     void installShadows(QWidget *, Helper &);
0060 
0061     //* remove shadows from widget
0062     void removeShadows(QWidget *);
0063 
0064     //* raise shadows
0065     void raiseShadows(QObject *) const;
0066 
0067     //* update shadows
0068     void update(QObject *) const;
0069 
0070     //* install shadow on given side
0071     void installShadow(QWidget *, Helper &, Side) const;
0072 
0073 protected Q_SLOTS:
0074 
0075     //* triggered by object destruction
0076     void widgetDestroyed(QObject *);
0077 
0078 private:
0079     //* needed to block ChildAdded events when creating shadows
0080     AddEventFilter _addEventFilter;
0081 
0082     //* set of registered widgets
0083     QSet<const QObject *> _registeredWidgets;
0084 };
0085 
0086 //* frame shadow
0087 /** this allows the shadow to be painted over the widgets viewport */
0088 class FrameShadow : public QWidget
0089 {
0090     Q_OBJECT
0091 
0092 public:
0093     //* constructor
0094     FrameShadow(Side, Helper &);
0095 
0096     //* update geometry
0097     virtual void updateGeometry(QRect);
0098 
0099     //* update state
0100     void updateState(bool focus, bool hover, qreal opacity, AnimationMode);
0101 
0102 protected:
0103     //* painting
0104     void paintEvent(QPaintEvent *) override;
0105 
0106     //* return viewport associated to parent widget
0107     QWidget *viewport() const;
0108 
0109 private:
0110     //* helper
0111     Helper &_helper;
0112 
0113     //* shadow area
0114     Side _area;
0115 
0116     //* margins
0117     /** offsets between update rect and parent widget rect. It is set via updateGeometry */
0118     QMargins _margins;
0119 
0120     //*@name widget state
0121     //@{
0122     bool _hasFocus = false;
0123     bool _mouseOver = false;
0124     qreal _opacity = -1;
0125     AnimationMode _mode = AnimationNone;
0126     //@}
0127 };
0128 }
0129 
0130 #endif