1 // SPDX-FileCopyrightText: 2021 Nheko Contributors
2 //
3 // SPDX-License-Identifier: GPL-3.0-or-later
4 
5 #pragma once
6 
7 #include <QBrush>
8 #include <QEasingCurve>
9 #include <QParallelAnimationGroup>
10 #include <QPoint>
11 #include <QPropertyAnimation>
12 
13 class RippleOverlay;
14 
15 class Ripple : public QParallelAnimationGroup
16 {
17     Q_OBJECT
18 
19     Q_PROPERTY(qreal radius WRITE setRadius READ radius)
20     Q_PROPERTY(qreal opacity WRITE setOpacity READ opacity)
21 
22 public:
23     explicit Ripple(const QPoint &center, QObject *parent = nullptr);
24     Ripple(const QPoint &center, RippleOverlay *overlay, QObject *parent = nullptr);
25 
26     inline void setOverlay(RippleOverlay *overlay);
27 
28     void setRadius(qreal radius);
29     void setOpacity(qreal opacity);
30     void setColor(const QColor &color);
31     void setBrush(const QBrush &brush);
32 
33     inline qreal radius() const;
34     inline qreal opacity() const;
35     inline QColor color() const;
36     inline QBrush brush() const;
37     inline QPoint center() const;
38 
39     inline QPropertyAnimation *radiusAnimation() const;
40     inline QPropertyAnimation *opacityAnimation() const;
41 
42     inline void setOpacityStartValue(qreal value);
43     inline void setOpacityEndValue(qreal value);
44     inline void setRadiusStartValue(qreal value);
45     inline void setRadiusEndValue(qreal value);
46     inline void setDuration(int msecs);
47 
48 protected slots:
49     void destroy();
50 
51 private:
52     Q_DISABLE_COPY(Ripple)
53 
54     QPropertyAnimation *animate(const QByteArray &property,
55                                 const QEasingCurve &easing = QEasingCurve::OutQuad,
56                                 int duration               = 800);
57 
58     void init();
59 
60     RippleOverlay *overlay_;
61 
62     QPropertyAnimation *const radius_anim_;
63     QPropertyAnimation *const opacity_anim_;
64 
65     qreal radius_;
66     qreal opacity_;
67 
68     QPoint center_;
69     QBrush brush_;
70 };
71 
72 inline void
setOverlay(RippleOverlay * overlay)73 Ripple::setOverlay(RippleOverlay *overlay)
74 {
75     overlay_ = overlay;
76 }
77 
78 inline qreal
radius()79 Ripple::radius() const
80 {
81     return radius_;
82 }
83 
84 inline qreal
opacity()85 Ripple::opacity() const
86 {
87     return opacity_;
88 }
89 
90 inline QColor
color()91 Ripple::color() const
92 {
93     return brush_.color();
94 }
95 
96 inline QBrush
brush()97 Ripple::brush() const
98 {
99     return brush_;
100 }
101 
102 inline QPoint
center()103 Ripple::center() const
104 {
105     return center_;
106 }
107 
108 inline QPropertyAnimation *
radiusAnimation()109 Ripple::radiusAnimation() const
110 {
111     return radius_anim_;
112 }
113 
114 inline QPropertyAnimation *
opacityAnimation()115 Ripple::opacityAnimation() const
116 {
117     return opacity_anim_;
118 }
119 
120 inline void
setOpacityStartValue(qreal value)121 Ripple::setOpacityStartValue(qreal value)
122 {
123     opacity_anim_->setStartValue(value);
124 }
125 
126 inline void
setOpacityEndValue(qreal value)127 Ripple::setOpacityEndValue(qreal value)
128 {
129     opacity_anim_->setEndValue(value);
130 }
131 
132 inline void
setRadiusStartValue(qreal value)133 Ripple::setRadiusStartValue(qreal value)
134 {
135     radius_anim_->setStartValue(value);
136 }
137 
138 inline void
setRadiusEndValue(qreal value)139 Ripple::setRadiusEndValue(qreal value)
140 {
141     radius_anim_->setEndValue(value);
142 }
143 
144 inline void
setDuration(int msecs)145 Ripple::setDuration(int msecs)
146 {
147     radius_anim_->setDuration(msecs);
148     opacity_anim_->setDuration(msecs);
149 }
150