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 ¢er, QObject *parent = nullptr); 24 Ripple(const QPoint ¢er, 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)73Ripple::setOverlay(RippleOverlay *overlay) 74 { 75 overlay_ = overlay; 76 } 77 78 inline qreal radius()79Ripple::radius() const 80 { 81 return radius_; 82 } 83 84 inline qreal opacity()85Ripple::opacity() const 86 { 87 return opacity_; 88 } 89 90 inline QColor color()91Ripple::color() const 92 { 93 return brush_.color(); 94 } 95 96 inline QBrush brush()97Ripple::brush() const 98 { 99 return brush_; 100 } 101 102 inline QPoint center()103Ripple::center() const 104 { 105 return center_; 106 } 107 108 inline QPropertyAnimation * radiusAnimation()109Ripple::radiusAnimation() const 110 { 111 return radius_anim_; 112 } 113 114 inline QPropertyAnimation * opacityAnimation()115Ripple::opacityAnimation() const 116 { 117 return opacity_anim_; 118 } 119 120 inline void setOpacityStartValue(qreal value)121Ripple::setOpacityStartValue(qreal value) 122 { 123 opacity_anim_->setStartValue(value); 124 } 125 126 inline void setOpacityEndValue(qreal value)127Ripple::setOpacityEndValue(qreal value) 128 { 129 opacity_anim_->setEndValue(value); 130 } 131 132 inline void setRadiusStartValue(qreal value)133Ripple::setRadiusStartValue(qreal value) 134 { 135 radius_anim_->setStartValue(value); 136 } 137 138 inline void setRadiusEndValue(qreal value)139Ripple::setRadiusEndValue(qreal value) 140 { 141 radius_anim_->setEndValue(value); 142 } 143 144 inline void setDuration(int msecs)145Ripple::setDuration(int msecs) 146 { 147 radius_anim_->setDuration(msecs); 148 opacity_anim_->setDuration(msecs); 149 } 150