diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index 7f2db6e684..c34a900acb 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -259,6 +259,7 @@ style::color FromNameFg( struct Message::CommentsButton { std::unique_ptr ripple; + int rippleShift = 0; std::vector userpics; QImage cachedUserpics; ClickHandlerPtr link; @@ -1004,7 +1005,12 @@ void Message::paintCommentsButton( if (_comments->ripple) { p.setOpacity(st::historyPollRippleOpacity); const auto colorOverride = &stm->msgWaveformInactive->c; - _comments->ripple->paint(p, left, top, width, colorOverride); + _comments->ripple->paint( + p, + left - _comments->rippleShift, + top, + width, + colorOverride); if (_comments->ripple->empty()) { _comments->ripple.reset(); } @@ -1439,30 +1445,8 @@ void Message::toggleCommentsButtonRipple(bool pressed) { if (!drawBubble()) { return; } else if (pressed) { - const auto g = countGeometry(); - const auto linkWidth = g.width(); - const auto linkHeight = st::historyCommentsButtonHeight; if (!_comments->ripple) { - const auto drawMask = [&](QPainter &p) { - // #TODO rounding - const auto radius = st::bubbleRadiusSmall; - p.drawRoundedRect( - 0, - 0, - linkWidth, - linkHeight, - radius, - radius); - p.fillRect(0, 0, linkWidth, radius * 2, Qt::white); - }; - auto mask = Ui::RippleAnimation::MaskByDrawer( - QSize(linkWidth, linkHeight), - false, - drawMask); - _comments->ripple = std::make_unique( - st::defaultRippleAnimation, - std::move(mask), - [=] { repaint(); }); + createCommentsRipple(); } _comments->ripple->add(_comments->lastPoint); } else if (_comments->ripple) { @@ -1470,6 +1454,77 @@ void Message::toggleCommentsButtonRipple(bool pressed) { } } +void Message::createCommentsRipple() { + using namespace Ui; + using namespace Images; + using Radius = CachedCornerRadius; + using Corner = BubbleCornerRounding; + const auto g = countGeometry(); + const auto linkWidth = g.width(); + const auto linkHeight = st::historyCommentsButtonHeight; + const auto &large = CachedCornersMasks(Radius::BubbleLarge); + const auto &small = CachedCornersMasks(Radius::BubbleSmall); + const auto rounding = countBubbleRounding(); + const auto icon = (rounding.bottomLeft == Corner::Tail) + ? &st::historyBubbleTailInLeft + : (rounding.bottomRight == Corner::Tail) + ? &st::historyBubbleTailInRight + : nullptr; + const auto shift = (rounding.bottomLeft == Corner::Tail) + ? icon->width() + : 0; + const auto added = shift ? shift : icon ? icon->width() : 0; + auto corners = CornersMaskRef(); + const auto set = [&](int index) { + corners.p[index] = (rounding[index] == Corner::Large) + ? &large[index] + : (rounding[index] == Corner::Small) + ? &small[index] + : nullptr; + }; + set(kBottomLeft); + set(kBottomRight); + const auto drawer = [&](QPainter &p) { + p.setCompositionMode(QPainter::CompositionMode_Source); + const auto ratio = style::DevicePixelRatio(); + const auto corner = [&](int index, bool right) { + if (const auto image = corners.p[index]) { + const auto width = image->width() / ratio; + const auto height = image->height() / ratio; + p.drawImage( + QRect( + shift + (right ? (linkWidth - width) : 0), + linkHeight - height, + width, + height), + *image); + } + }; + corner(kBottomLeft, false); + corner(kBottomRight, true); + if (icon) { + const auto left = shift ? 0 : linkWidth; + p.fillRect( + QRect{ left, 0, added, linkHeight }, + Qt::transparent); + icon->paint( + p, + left, + linkHeight - icon->height(), + linkWidth + shift, + Qt::white); + } + }; + _comments->ripple = std::make_unique( + st::defaultRippleAnimation, + RippleAnimation::MaskByDrawer( + QSize(linkWidth + added, linkHeight), + true, + drawer), + [=] { repaint(); }); + _comments->rippleShift = shift; +} + bool Message::hasHeavyPart() const { return _comments || (_fromNameStatus && _fromNameStatus->custom) diff --git a/Telegram/SourceFiles/history/view/history_view_message.h b/Telegram/SourceFiles/history/view/history_view_message.h index a7ce221950..c79e74afd7 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.h +++ b/Telegram/SourceFiles/history/view/history_view_message.h @@ -168,6 +168,7 @@ private: TextSelection selection) const; void toggleCommentsButtonRipple(bool pressed); + void createCommentsRipple(); void paintCommentsButton( Painter &p,