File indexing completed on 2024-04-28 05:26:20

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