diff --git a/Telegram/SourceFiles/boxes/gift_premium_box.cpp b/Telegram/SourceFiles/boxes/gift_premium_box.cpp index 72633a441..4f4bec384 100644 --- a/Telegram/SourceFiles/boxes/gift_premium_box.cpp +++ b/Telegram/SourceFiles/boxes/gift_premium_box.cpp @@ -36,6 +36,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/effects/premium_top_bar.h" #include "ui/effects/spoiler_mess.h" #include "ui/layers/generic_box.h" +#include "ui/painter.h" #include "ui/rect.h" #include "ui/text/text_utilities.h" #include "ui/widgets/checkbox.h" @@ -75,6 +76,54 @@ GiftOptions GiftOptionFromTL(const MTPDuserFull &data) { return result; } +[[nodiscard]] not_null UserpicsContainer( + not_null parent, + std::vector> users) { + Expects(!users.empty()); + + if (users.size() == 1) { + const auto userpic = Ui::CreateChild( + parent.get(), + users.front(), + st::defaultUserpicButton); + userpic->setAttribute(Qt::WA_TransparentForMouseEvents); + return userpic; + } + + const auto &singleSize = st::defaultUserpicButton.size; + + const auto container = Ui::CreateChild(parent.get()); + const auto single = singleSize.width(); + const auto shift = st::premiumGiftsUserpicShift; + const auto maxWidth = users.size() * (single - shift) + shift; + container->resize(maxWidth, singleSize.height()); + container->setAttribute(Qt::WA_TransparentForMouseEvents); + + const auto diff = (single - st::premiumGiftsUserpicButton.size.width()) + / 2; + for (auto i = 0; i < users.size(); i++) { + const auto bg = Ui::CreateChild(container); + bg->resize(singleSize); + bg->paintRequest( + ) | rpl::start_with_next([=] { + auto p = QPainter(bg); + auto hq = PainterHighQualityEnabler(p); + p.setPen(Qt::NoPen); + p.setBrush(st::boxBg); + p.drawEllipse(bg->rect()); + }, bg->lifetime()); + bg->moveToLeft(std::max(0, i * (single - shift)), 0); + + const auto userpic = Ui::CreateChild( + bg, + users[i], + st::premiumGiftsUserpicButton); + userpic->moveToLeft(diff, diff); + } + + return container; +} + void GiftBox( not_null box, not_null controller, @@ -98,12 +147,11 @@ void GiftBox( + st::defaultUserpicButton.size.height())); using ColoredMiniStars = Ui::Premium::ColoredMiniStars; - const auto stars = box->lifetime().make_state(top, true); - - const auto userpic = Ui::CreateChild( + const auto stars = box->lifetime().make_state( top, - user, - st::defaultUserpicButton); + true); + + const auto userpic = UserpicsContainer(top, { user }); userpic->setAttribute(Qt::WA_TransparentForMouseEvents); top->widthValue( ) | rpl::start_with_next([=](int width) { @@ -267,9 +315,36 @@ void GiftsBox( + userpicPadding.bottom() + st::defaultUserpicButton.size.height())); - // Header. - const auto &padding = st::premiumGiftAboutPadding; - const auto available = boxWidth - padding.left() - padding.right(); + using ColoredMiniStars = Ui::Premium::ColoredMiniStars; + const auto stars = box->lifetime().make_state( + top, + true); + + const auto userpics = UserpicsContainer(top, users); + top->widthValue( + ) | rpl::start_with_next([=](int width) { + userpics->moveToLeft( + (width - userpics->width()) / 2, + userpicPadding.top()); + + const auto center = top->rect().center(); + const auto size = QSize( + userpics->width() * Ui::Premium::MiniStars::kSizeFactor, + userpics->height()); + const auto ministarsRect = QRect( + QPoint(center.x() - size.width(), center.y() - size.height()), + QPoint(center.x() + size.width(), center.y() + size.height())); + stars->setPosition(ministarsRect.topLeft()); + stars->setSize(ministarsRect.size()); + }, userpics->lifetime()); + + top->paintRequest( + ) | rpl::start_with_next([=](const QRect &r) { + auto p = QPainter(top); + + p.fillRect(r, Qt::transparent); + stars->paint(p); + }, top->lifetime()); const auto close = Ui::CreateChild( buttonsParent, @@ -281,6 +356,10 @@ void GiftsBox( close->moveToRight(0, 0, width); }, close->lifetime()); + // Header. + const auto &padding = st::premiumGiftAboutPadding; + const auto available = boxWidth - padding.left() - padding.right(); + // List. const auto options = api->options(users.size()); const auto group = std::make_shared(); @@ -614,7 +693,7 @@ void GiftPremiumValidator::showChoosePeerBox() { return u; }) | ranges::to>>(); if (!users.empty()) { - const auto giftBox = show->showBox( + const auto giftBox = show->show( Box(GiftsBox, _controller, users, api)); giftBox->boxClosing( ) | rpl::start_with_next([=] { diff --git a/Telegram/SourceFiles/ui/effects/premium.style b/Telegram/SourceFiles/ui/effects/premium.style index b847e5cc8..9f7cacece 100644 --- a/Telegram/SourceFiles/ui/effects/premium.style +++ b/Telegram/SourceFiles/ui/effects/premium.style @@ -230,6 +230,13 @@ premiumGiftBox: Box(premiumPreviewBox) { buttonPadding: margins(12px, 12px, 12px, 12px); } +premiumGiftsUserpicButton: UserpicButton(defaultUserpicButton) { + size: size(64px, 64px); + photoSize: 64px; + photoPosition: point(-1px, -1px); +} +premiumGiftsUserpicShift: 30px; + boostSkipTop: 37px; boostLimits: PremiumLimits(defaultPremiumLimits) { gradientFromLeft: true;