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 }