summary refs log tree commit diff
path: root/src/ui/RippleOverlay.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/RippleOverlay.cpp')
-rw-r--r--src/ui/RippleOverlay.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/ui/RippleOverlay.cpp b/src/ui/RippleOverlay.cpp
new file mode 100644
index 00000000..20e98c0f
--- /dev/null
+++ b/src/ui/RippleOverlay.cpp
@@ -0,0 +1,62 @@
+#include <QPainter>
+
+#include "Ripple.h"
+#include "RippleOverlay.h"
+
+RippleOverlay::RippleOverlay(QWidget *parent)
+  : OverlayWidget(parent)
+  , use_clip_(false)
+{
+        setAttribute(Qt::WA_TransparentForMouseEvents);
+        setAttribute(Qt::WA_NoSystemBackground);
+}
+
+void
+RippleOverlay::addRipple(Ripple *ripple)
+{
+        ripple->setOverlay(this);
+        ripples_.push_back(ripple);
+        ripple->start();
+}
+
+void
+RippleOverlay::addRipple(const QPoint &position, qreal radius)
+{
+        Ripple *ripple = new Ripple(position);
+        ripple->setRadiusEndValue(radius);
+        addRipple(ripple);
+}
+
+void
+RippleOverlay::removeRipple(Ripple *ripple)
+{
+        if (ripples_.removeOne(ripple))
+                delete ripple;
+}
+
+void
+RippleOverlay::paintEvent(QPaintEvent *event)
+{
+        Q_UNUSED(event)
+
+        QPainter painter(this);
+        painter.setRenderHint(QPainter::Antialiasing);
+        painter.setPen(Qt::NoPen);
+
+        if (use_clip_)
+                painter.setClipPath(clip_path_);
+
+        for (auto it = ripples_.constBegin(); it != ripples_.constEnd(); ++it)
+                paintRipple(&painter, *it);
+}
+
+void
+RippleOverlay::paintRipple(QPainter *painter, Ripple *ripple)
+{
+        const qreal radius   = ripple->radius();
+        const QPointF center = ripple->center();
+
+        painter->setOpacity(ripple->opacity());
+        painter->setBrush(ripple->brush());
+        painter->drawEllipse(center, radius, radius);
+}