#include "CircularReveal.h" #include #include #include CircularReveal::CircularReveal(QQuickItem *parent) : QQuickPaintedItem(parent) { _target = nullptr; _radius = 0; _anim = new QPropertyAnimation(this, "radius", this); _anim->setDuration(333); _anim->setEasingCurve(QEasingCurve::OutCubic); setVisible(false); connect(_anim, &QPropertyAnimation::finished, this, [=]() { update(); setVisible(false); Q_EMIT animationFinished(); }); connect(this, &CircularReveal::radiusChanged, this, [=]() { update(); }); } void CircularReveal::paint(QPainter *painter) { painter->save(); painter->drawImage(QRect(0, 0, static_cast(width()), static_cast(height())), _source); QPainterPath path; path.moveTo(_center.x(), _center.y()); path.addEllipse(QPointF(_center.x(), _center.y()), _radius, _radius); painter->setCompositionMode(QPainter::CompositionMode_Clear); painter->fillPath(path, Qt::black); painter->restore(); } [[maybe_unused]] void CircularReveal::start(int w, int h, const QPoint ¢er, int radius) { _anim->setStartValue(0); _anim->setEndValue(radius); _center = center; _grabResult = _target->grabToImage(QSize(w, h)); connect(_grabResult.data(), &QQuickItemGrabResult::ready, this, &CircularReveal::handleGrabResult); } void CircularReveal::handleGrabResult() { _grabResult.data()->image().swap(_source); update(); setVisible(true); Q_EMIT imageChanged(); _anim->start(); }