#pragma once #include #include "widgets/basewidget.hpp" #include #include #include #include #include namespace chatterino { namespace widgets { class RippleEffectButton : public BaseWidget { Q_OBJECT struct ClickEffect { double progress = 0.0; QPoint position; ClickEffect(QPoint _position) : position(_position) { } }; public: RippleEffectButton(BaseWidget *parent); void setMouseEffectColor(boost::optional color); signals: void clicked(); protected: bool selected = false; bool mouseOver = false; bool mouseDown = false; virtual void paintEvent(QPaintEvent *) override; virtual void enterEvent(QEvent *) override; virtual void leaveEvent(QEvent *) override; virtual void mousePressEvent(QMouseEvent *event) override; virtual void mouseReleaseEvent(QMouseEvent *event) override; virtual void mouseMoveEvent(QMouseEvent *event) override; void fancyPaint(QPainter &painter); private: QPoint mousePos; double hoverMultiplier = 0.0; QTimer effectTimer; std::vector clickEffects; boost::optional mouseEffectColor = boost::none; void onMouseEffectTimeout(); }; } // namespace widgets } // namespace chatterino