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