From 093eb28e75c83ebb166a617d9606acfbe2ad3141 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 26 Dec 2025 12:24:02 +0400 Subject: [PATCH] Implement nice Cocoon about box. --- Telegram/Resources/animations/cocoon.tgs | Bin 0 -> 2164 bytes Telegram/Resources/art/cocoon.webp | Bin 0 -> 69456 bytes Telegram/Resources/langs/lang.strings | 17 ++ .../Resources/qrc/telegram/animations.qrc | 1 + Telegram/Resources/qrc/telegram/telegram.qrc | 1 + .../chat_helpers/stickers_lottie.cpp | 27 ++ .../view/history_view_translate_bar.cpp | 284 ++++++++++++++++++ Telegram/SourceFiles/ui/chat/chat.style | 26 ++ .../SourceFiles/ui/controls/feature_list.cpp | 1 + .../ui/effects/ministar_particles.cpp | 62 +++- .../ui/effects/ministar_particles.h | 5 +- Telegram/lib_ui | 2 +- 12 files changed, 415 insertions(+), 11 deletions(-) create mode 100644 Telegram/Resources/animations/cocoon.tgs create mode 100644 Telegram/Resources/art/cocoon.webp diff --git a/Telegram/Resources/animations/cocoon.tgs b/Telegram/Resources/animations/cocoon.tgs new file mode 100644 index 0000000000000000000000000000000000000000..9eba8213addbee4b4b0205df492ea18da948319e GIT binary patch literal 2164 zcmV-)2#fb0iwFP!000021MQq!Z{xfXhW|>SYl`6T%-j|&P@pJ^ws(P1xLId6UFQJX z-`6e{``YT|3aC`cS?fA28A%o*tgBDAv1o?>P8!yIt)t(VNfJJ-Sr47~o$D z1FV;yR-5e6guQ=!$GPu5RoA8@_}Aao>np(U+YS4D#3-MuC;C`&q>uRdMO4o(TyC`U zg8tP4{kAXtk`nj_3jNS?`IPhSly1A@>wiCR@*Nv>w$T^t&W0{u`q$p04+LoZn}R_0$0{X<|KU$1qcP&(b0Mlvz3!OI z(>@mXAPzp;SY3CFh2@EfZNS>a%FQ(>Ufl>#K3jqLi}L>_c9__22l+Xh{gf!~hiz?3 z?IkyTYDU%j4Yry4-QHnyOFbyJpKiOxnqM5ZcatJ1W!^;%3vq?enDhg=pvrPcY z{)JI-;HJrGeaqcw{U83~Zr1ds-R9}zYQV<3_0O^~_tQf|{&Zi^b8NUCK~EE$U?4MmVj2dlnrz!dnHM*FPsEK55<3=6QsMCea0Q6YXvOZHXSLu9cMHYUKIr+b0Heo-1bm1Ztk6WkR)mV5Gggre}rd z*)jaU*_JZhKQPI+LpS8m{61q-N(06!1s!AeGaT*X4K+!y8e(uAvsXPg>(rv?ss}{$ zASDoKU9_1U6lVa#B=VO+A_PvrE)7m9u!S&)5YV)e?0^W>u*r(rKn4@=LNg+!je$T* z8UrAc!1XeUw`m)X5%Ge;iIjiWv80wgXI{;`vgwj|)$H!v^U8-;<5d|;YC2*v?b>me>E1gGLMqexpiq5%cIn!^ZA9hf8 zQS>uM^fRwUzcOspywM-?)^?D7BL^|krO>Z7(qd5wB$_Xk3<{xRC8$7j^wOh(Me^)r zTW!76Dv8=>`gobVL5c;Ia!4(WLbe@pIvE47j*Bj}kgFZ)!GxqUu?RpkAz+n8Tabo` z!+2R9#)#$^5_D-M+DtSOC0#uS3Z^^&O~(V!pN%rw0m>-jt)OMhK7g{3gB0;%P=>66 zXa#h@z!F$2 zsn<*?ht*nZD`Rq_(nA@blhL}@T!;!F}q6y&@{kO!c=K#GpVjfQQxtWpkZw2`w6<`)7S4)SQ)%j&F}cn-{xhvOp{&bM6Cc~!Cm#0#H+ zlz1Kwk%XXNt{DRzuEheiWNFpF@Gq2hG$#jn3U5Z)jItf?7=6J8XQoWDBZ=nRYmqEA z+bxPx8y0F~rx1Q6j%n6qfM%E$WDFw6iwOn?l#Z^s491svFd`Cq9q6|r{0?bHD-B5n z#$9A=Wd)`!d*e8q1)s%M5;%_Mmlnz<9m@=ciyXVt0GcqU!a z>3A90k`FUoX1dID>F@Ah&Q%hw@0i8O(0Dlk{;lLW)=}p`?ybt)e?sN_Qjfv?N2s~f zrR{hM*{l=^0M_vaU{PVRjb^7un&;CRmAk(_}#-sQJHmqxPq%Bz-_gMNFI qcV8TRP+`7Q7>)71^77>~tLbML?c1lS%Vzt78~uL~d4x7iTL1tEAsmGO literal 0 HcmV?d00001 diff --git a/Telegram/Resources/art/cocoon.webp b/Telegram/Resources/art/cocoon.webp new file mode 100644 index 0000000000000000000000000000000000000000..060239730be9f1075cc42cdbb2e5a1835f2c46ce GIT binary patch literal 69456 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

_)X^SE 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index b893ac30c8..dc596196c3 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -4971,6 +4971,23 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_translate_settings" = "Settings"; "lng_translate_undo" = "Undo"; +"lng_translate_cocoon_menu" = "Translations are powered by\n**{emoji} Cocoon**. {link}"; +"lng_translate_cocoon_link" = "How does it work?"; +"lng_translate_cocoon_title" = "Cocoon"; +"lng_translate_cocoon_subtitle" = "**Cocoon** ({text}) handles AI tasks **safely** and **efficiently**."; +"lng_translate_cocoon_explain" = "**Co**nfidential **Co**mpute **O**pen **N**etwork"; +"lng_translate_cocoon_private_title" = "Private"; +"lng_translate_cocoon_private_text" = "No third party can access any data, such as translations, inside {mention}."; +"lng_translate_cocoon_private_mention" = "@cocoon"; +"lng_translate_cocoon_efficient_title" = "Efficient"; +"lng_translate_cocoon_efficient_text" = "Cocoon has allowed Telegram to reduce translation costs by 6x."; +"lng_translate_cocoon_everyone_title" = "For Everyone"; +"lng_translate_cocoon_everyone_text" = "Any developer can use Cocoon for AI features. Learn more at {domain}."; +"lng_translate_cocoon_everyone_domain" = "cocoon.org"; +"lng_translate_cocoon_text" = "Want to integrate Cocoon into your projects?\nReach out at {link}"; +"lng_translate_cocoon_text_link" = "t.me/cocoon?direct"; +"lng_translate_cocoon_done" = "Understood"; + "lng_downloads_section" = "Downloads"; "lng_downloads_view_in_chat" = "View in chat"; "lng_downloads_view_in_section" = "View in downloads"; diff --git a/Telegram/Resources/qrc/telegram/animations.qrc b/Telegram/Resources/qrc/telegram/animations.qrc index f448e9e4a5..a33a9ff016 100644 --- a/Telegram/Resources/qrc/telegram/animations.qrc +++ b/Telegram/Resources/qrc/telegram/animations.qrc @@ -52,6 +52,7 @@ ../../animations/show_or_premium_readtime.tgs ../../animations/passkeys.tgs ../../animations/ban.tgs + ../../animations/cocoon.tgs ../../animations/profile/profile_muting.tgs ../../animations/profile/profile_unmuting.tgs diff --git a/Telegram/Resources/qrc/telegram/telegram.qrc b/Telegram/Resources/qrc/telegram/telegram.qrc index ca37cc179a..fd3f69e5ed 100644 --- a/Telegram/Resources/qrc/telegram/telegram.qrc +++ b/Telegram/Resources/qrc/telegram/telegram.qrc @@ -9,6 +9,7 @@ ../../art/logo_256_no_margin.png ../../art/themeimage.jpg ../../art/round_placeholder.jpg + ../../art/cocoon.webp ../../day-blue.tdesktop-theme ../../night.tdesktop-theme ../../night-green.tdesktop-theme diff --git a/Telegram/SourceFiles/chat_helpers/stickers_lottie.cpp b/Telegram/SourceFiles/chat_helpers/stickers_lottie.cpp index 04ceda97cb..0c62f7680a 100644 --- a/Telegram/SourceFiles/chat_helpers/stickers_lottie.cpp +++ b/Telegram/SourceFiles/chat_helpers/stickers_lottie.cpp @@ -354,10 +354,37 @@ not_null GenerateLocalSticker( not_null GenerateLocalTgsSticker( not_null session, const QString &name) { + const auto cache = [&] { + struct Session { + base::weak_ptr session; + base::flat_map> cache; + }; + static auto Map = std::vector(); + for (auto i = begin(Map); i != end(Map);) { + if (const auto strong = i->session.get()) { + if (strong == session) { + return &i->cache; + } + ++i; + } else { + i = Map.erase(i); + } + } + Map.push_back({ .session = session }); + return &Map.back().cache; + }(); + + const auto i = cache->find(name); + if (i != end(*cache)) { + return i->second; + } + const auto result = GenerateLocalSticker( session, u":/animations/"_q + name + u".tgs"_q); + cache->emplace(name, result); + Ensures(result->sticker()->isLottie()); return result; } diff --git a/Telegram/SourceFiles/history/view/history_view_translate_bar.cpp b/Telegram/SourceFiles/history/view/history_view_translate_bar.cpp index 48085dc18b..83d4ab0f08 100644 --- a/Telegram/SourceFiles/history/view/history_view_translate_bar.cpp +++ b/Telegram/SourceFiles/history/view/history_view_translate_bar.cpp @@ -7,19 +7,30 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "history/view/history_view_translate_bar.h" +#include "boxes/star_gift_box.h" // AddUniqueCloseButton #include "boxes/translate_box.h" +#include "chat_helpers/stickers_lottie.h" #include "core/application.h" #include "core/core_settings.h" +#include "core/ui_integration.h" +#include "data/stickers/data_custom_emoji.h" #include "data/data_changes.h" +#include "data/data_document.h" #include "history/history.h" #include "lang/lang_keys.h" #include "main/main_session.h" +#include "settings/settings_credits_graphics.h" // CreditsEntryBoxStyleOverrides +#include "ui/controls/feature_list.h" +#include "ui/effects/ministar_particles.h" #include "ui/effects/ripple_animation.h" #include "ui/boxes/choose_language_box.h" // EditSkipTranslationLanguages. #include "ui/layers/box_content.h" +#include "ui/layers/generic_box.h" #include "ui/widgets/menu/menu_item_base.h" #include "ui/text/text_utilities.h" #include "ui/toast/toast.h" +#include "ui/top_background_gradient.h" +#include "ui/widgets/menu/menu_multiline_action.h" #include "ui/widgets/buttons.h" #include "ui/widgets/labels.h" #include "ui/widgets/popup_menu.h" @@ -27,6 +38,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/painter.h" #include "window/window_session_controller.h" #include "styles/style_chat.h" +#include "styles/style_info.h" // infoStarsUnderstood +#include "styles/style_layers.h" #include "styles/style_menu_icons.h" #include @@ -80,6 +93,247 @@ TextParseOptions MenuTextOptions = { Qt::LayoutDirectionAuto, // dir }; +void AddCocoonBoxCover(not_null container) { + const auto cover = container->add(object_ptr(container)); + + static const auto gradientEdge = QColor(0x06, 0x11, 0x29); + static const auto gradientCenter = QColor(0x09, 0x16, 0x43); + + static const auto gradientLeft = QColor(0x68, 0xc9, 0xff); + static const auto gradientRight = QColor(0xcb, 0x57, 0xff); + + static const auto textColor = QColor(0xb8, 0xc9, 0xef); + static const auto boldColor = QColor(0xff, 0xff, 0xff); + + const auto logoTop = st::cocoonLogoTop; + const auto logoSize = st::cocoonLogoSize; + const auto ratio = style::DevicePixelRatio(); + auto logo = QImage(u":/gui/art/cocoon.webp"_q).scaled( + QSize(logoSize, logoSize) * ratio, + Qt::IgnoreAspectRatio, + Qt::SmoothTransformation); + logo.setDevicePixelRatio(ratio); + const auto titleTop = logoTop + logoSize + st::cocoonTitleTop; + const auto subtitleTop = titleTop + + st::cocoonTitleFont->height + + st::cocoonSubtitleTop; + + const auto boldToColorized = [](QString text) { + auto result = tr::rich(text); + auto &entities = result.entities; + for (auto i = entities.begin(); i != entities.end(); ++i) { + if (i->type() == EntityType::Bold) { + i = entities.insert( + i, + EntityInText( + EntityType::Colorized, + i->offset(), + i->length())); + ++i; + } + } + return result; + }; + + struct State { + QImage gradient; + Ui::Animations::Basic animation; + std::optional particles; + style::owned_color subtitleFg = style::owned_color{ textColor }; + style::owned_color subtitleBoldFg = style::owned_color{ boldColor }; + style::FlatLabel subtitleSt = st::cocoonSubtitle; + }; + const auto state = cover->lifetime().make_state(); + state->subtitleSt.textFg = state->subtitleFg.color(); + state->subtitleSt.palette.linkFg = state->subtitleBoldFg.color(); + state->animation.init([=] { + cover->update(); + if (anim::Disabled()) { + state->animation.stop(); + } + }); + + constexpr auto kParticlesCount = 50; + state->particles.emplace( + Ui::StarParticles::Type::RadialInside, + kParticlesCount, + st::cocoonLogoSize / 12); + state->particles->setSpeed(0.05); + auto particleColors = std::vector(); + constexpr auto kParticleColors = 12; + particleColors.reserve(kParticleColors); + for (auto i = 0; i != kParticleColors; ++i) { + particleColors.push_back(anim::color( + gradientLeft, + gradientRight, + float64(i) / (kParticleColors - 1))); + } + state->particles->setColors(std::move(particleColors)); + + const auto subtitle = CreateChild( + cover, + tr::lng_translate_cocoon_subtitle( + lt_text, + tr::lng_translate_cocoon_explain(boldToColorized), + tr::rich), + state->subtitleSt); + subtitle->setTryMakeSimilarLines(true); + + cover->widthValue() | rpl::on_next([=](int width) { + const auto available = width + - st::boxRowPadding.left() + - st::boxRowPadding.right(); + subtitle->resizeToWidth(available); + subtitle->moveToLeft(st::boxRowPadding.left(), subtitleTop); + + const auto bottom = st::cocoonSubtitleBottom; + cover->resize(width, subtitle->y() + subtitle->height() + bottom); + }, cover->lifetime()); + + cover->paintRequest() | rpl::on_next([=] { + auto p = Painter(cover); + + const auto width = cover->width(); + const auto ratio = style::DevicePixelRatio(); + if (state->gradient.size() != cover->size() * ratio) { + state->gradient = Ui::CreateTopBgGradient( + cover->size(), + gradientCenter, + gradientEdge); + + auto font = st::cocoonTitleFont->f; + font.setWeight(QFont::Bold); + auto metrics = QFontMetrics(font); + + const auto text = tr::lng_translate_cocoon_title(tr::now); + const auto textw = metrics.width(text); + const auto left = (width - textw) / 2; + + auto q = QPainter(&state->gradient); + auto hq = PainterHighQualityEnabler(q); + + auto gradient = QLinearGradient(left, 0, left + textw, 0); + gradient.setStops({ + { 0., gradientLeft }, + { 1., gradientRight }, + }); + auto pen = QPen(QBrush(gradient), 1.); + q.setPen(pen); + q.setFont(font); + q.setBrush(Qt::NoBrush); + + q.drawText(left, titleTop + metrics.ascent(), text); + } + p.drawImage(0, 0, state->gradient); + + const auto logoRect = QRect( + (width - logoSize) / 2, + logoTop, + logoSize, + logoSize); + const auto paddingAdd = int(base::SafeRound(logoTop * 1.2)); + const auto particlesRect = logoRect.marginsAdded( + { paddingAdd, paddingAdd, paddingAdd, paddingAdd }); + + state->particles->paint(p, particlesRect, crl::now()); + if (!anim::Disabled() && !state->animation.animating()) { + state->animation.start(); + } + p.drawImage(logoRect, logo); + }, cover->lifetime()); +} + +struct CocoonLinkInfo { + QString text; + QString link; +}; + +[[nodiscard]] CocoonLinkInfo CocoonMention() { + const auto mention = tr::lng_translate_cocoon_private_mention(tr::now); + const auto username = QString(mention).replace('@', QString()); + const auto link = u"tg://resolve?domain="_q + username; + return { mention, link }; +} + +[[nodiscard]] CocoonLinkInfo CocoonDomain() { + const auto domain = tr::lng_translate_cocoon_everyone_domain(tr::now); + const auto link = u"https://"_q + domain; + return { domain, link }; +} + +[[nodiscard]] CocoonLinkInfo CocoonDirect() { + const auto text = tr::lng_translate_cocoon_text_link(tr::now); + const auto link = u"https://"_q + text; + return { text, link }; +} + +void AboutCocoonBox(not_null box) { + box->setWidth(st::boxWideWidth); + box->setStyle(st::stakeBox); + box->setNoContentMargin(true); + + const auto container = box->verticalLayout(); + AddCocoonBoxCover(container); + + AddUniqueCloseButton(box, {}); + + const auto mention = CocoonMention(); + const auto domain = CocoonDomain(); + const auto direct = CocoonDirect(); + const auto features = std::vector{ + { + st::menuIconLock, + tr::lng_translate_cocoon_private_title(tr::now), + tr::lng_translate_cocoon_private_text( + tr::now, + lt_mention, + tr::link(mention.text, mention.link), + tr::rich), + }, + { + st::menuIconStats, + tr::lng_translate_cocoon_efficient_title(tr::now), + tr::lng_translate_cocoon_efficient_text(tr::now, tr::rich), + }, + { + st::menuIconGiftPremium, + tr::lng_translate_cocoon_everyone_title(tr::now), + tr::lng_translate_cocoon_everyone_text( + tr::now, + lt_domain, + tr::link(domain.text, domain.link), + tr::rich), + }, + }; + auto margin = QMargins(0, st::defaultVerticalListSkip, 0, 0); + for (const auto &feature : features) { + box->addRow( + MakeFeatureListEntry(box, feature), + st::boxRowPadding + margin); + margin = {}; + } + + box->addRow( + object_ptr(box), + st::cocoonJoinSeparatorPadding); + + box->addRow( + object_ptr( + box, + tr::lng_translate_cocoon_text( + lt_link, + rpl::single(tr::link(direct.text, direct.link)), + tr::rich), + st::cocoonJoinLabel), + style::al_top); + + box->addButton(rpl::single(QString()), [=] { + box->closeBox(); + })->setText(rpl::single(Ui::Text::IconEmoji( + &st::infoStarsUnderstood + ).append(' ').append(tr::lng_translate_cocoon_done(tr::now)))); +} + TwoTextAction::TwoTextAction( not_null parent, const style::Menu &st, @@ -476,6 +730,36 @@ void TranslateBar::showMenu(base::unique_qptr menu) { tr::lng_translate_menu_hide(tr::now), hideBar, &st::menuIconCancel); + _menu->addSeparator(); + + const auto cocoon = ChatHelpers::GenerateLocalTgsSticker( + &_history->session(), + u"cocoon"_q); + cocoon->overrideEmojiUsesTextColor(true); + auto item = base::make_unique_q( + _menu, + st::defaultMenu, + st::historyTranslateCocoonLabel, + QPoint( + st::defaultMenu.itemPadding.left(), + st::defaultMenu.itemPadding.top()), + tr::lng_translate_cocoon_menu( + tr::now, + lt_emoji, + Data::SingleCustomEmoji(cocoon), + lt_link, + tr::link(tr::lng_translate_cocoon_link(tr::now, tr::bold)), + tr::rich), + Core::TextContext({ + .session = &_history->session(), + .customEmojiLoopLimit = -1, + })); + item->clicks( + ) | rpl::on_next([controller = _controller] { + controller->show(Box(AboutCocoonBox)); + }, item->lifetime()); + _menu->addAction(std::move(item)); + _menu->popup(_wrap.mapToGlobal( QPoint(_wrap.width(), 0) + st::historyTranslateMenuPosition)); } diff --git a/Telegram/SourceFiles/ui/chat/chat.style b/Telegram/SourceFiles/ui/chat/chat.style index 5c8d9de706..8b13683746 100644 --- a/Telegram/SourceFiles/ui/chat/chat.style +++ b/Telegram/SourceFiles/ui/chat/chat.style @@ -971,6 +971,32 @@ historyTranslateSettings: IconButton(defaultIconButton) { } } historyTranslateMenuPosition: point(-6px, 30px); +historyTranslateCocoonLabel: FlatLabel(historyHasCustomEmoji) { + style: TextStyle(defaultTextStyle) { + font: font(12px); + } + margin: margins(4px, 8px, 4px, 8px); +} + +cocoonLogoTop: 32px; +cocoonLogoSize: 96px; +cocoonTitleFont: font(36px semibold); +cocoonTitleTop: 12px; +cocoonSubtitle: FlatLabel(defaultFlatLabel) { + minWidth: 120px; + align: align(top); +} +cocoonSubtitleTop: 8px; +cocoonSubtitleBottom: 16px; +cocoonJoinSeparatorPadding: margins(24px, 4px, 24px, 12px); +cocoonJoinLabel: FlatLabel(defaultFlatLabel) { + style: TextStyle(defaultTextStyle) { + font: font(12px); + } + textFg: windowSubTextFg; + minWidth: 120px; + align: align(top); +} historySponsoredAboutMenuLabelPosition: point(54px, 4px); diff --git a/Telegram/SourceFiles/ui/controls/feature_list.cpp b/Telegram/SourceFiles/ui/controls/feature_list.cpp index 5ab504bab9..dcb31ce8df 100644 --- a/Telegram/SourceFiles/ui/controls/feature_list.cpp +++ b/Telegram/SourceFiles/ui/controls/feature_list.cpp @@ -42,6 +42,7 @@ object_ptr MakeFeatureListEntry( icon->show(); title->show(); about->show(); + about->setLinksTrusted(); widget->widthValue( ) | rpl::on_next([=](int width) { const auto left = st::infoStarsFeatureLabelLeft; diff --git a/Telegram/SourceFiles/ui/effects/ministar_particles.cpp b/Telegram/SourceFiles/ui/effects/ministar_particles.cpp index 1922044c0f..13214ad55c 100644 --- a/Telegram/SourceFiles/ui/effects/ministar_particles.cpp +++ b/Telegram/SourceFiles/ui/effects/ministar_particles.cpp @@ -32,7 +32,31 @@ void StarParticles::setVisible(float visible) { } void StarParticles::setColor(const QColor &color) { - _color = color; + setColors({ color }); +} + +void StarParticles::setColors(std::vector colors) { + Expects(!colors.empty()); + + const auto was = int(_colors.size()); + _colors = std::move(colors); + const auto now = int(_colors.size()); + + _paintedCaches.clear(); + + if (now != was) { + if (now > 1) { + auto buffered = base::BufferedRandom(_particles.size()); + for (auto &p : _particles) { + p.colorIndex = base::RandomIndex(now, buffered); + } + } else { + for (auto &p : _particles) { + p.colorIndex = 0; + } + } + + } } QImage StarParticles::generateStarCache(int size, QColor color) { @@ -76,12 +100,14 @@ void StarParticles::generate() { _particles.clear(); _particles.reserve(_count); - constexpr auto kRandomPerParticle = 12; + constexpr auto kRandomPerParticle = 13; auto random = bytes::vector(_count * kRandomPerParticle); base::RandomFill(random.data(), random.size()); auto idx = 0; const auto next = [&] { return uchar(random[idx++]) / 255.; }; + const auto colors = int(_colors.size()); + for (auto i = 0; i < _count; ++i) { auto p = Particle(); p.x = next(); @@ -106,6 +132,10 @@ void StarParticles::generate() { p.vy = -std::sin(angle) * speed; } + if (colors > 1) { + p.colorIndex = int(base::SafeRound(next() * (colors - 1))); + } + _particles.push_back(p); } } @@ -116,13 +146,26 @@ void StarParticles::paint(QPainter &p, const QRect &rect, crl::time now) { return; } - const auto colorKey = _color.rgba(); - const auto i = _starCache.find(colorKey); - const auto &cache = (i != end(_starCache)) - ? i->second - : _starCache.emplace( - colorKey, - generateStarCache(_starSize, _color)).first->second; + const auto validate = [&](int colorIndex) { + Expects(colorIndex >= 0 && colorIndex < _colors.size()); + + if (_paintedCaches.empty()) { + _paintedCaches.resize(_colors.size()); + } else if (const auto result = _paintedCaches[colorIndex] + ; !result.isNull()) { + return result; + } + const auto &color = _colors[colorIndex]; + const auto colorKey = color.rgba(); + const auto i = _starCache.find(colorKey); + const auto &cache = (i != end(_starCache)) + ? i->second + : _starCache.emplace( + colorKey, + generateStarCache(_starSize, color)).first->second; + _paintedCaches[colorIndex] = cache; + return cache; + }; const auto dt = (now - _lastTime) / 1000.; _lastTime = now; @@ -147,6 +190,7 @@ void StarParticles::paint(QPainter &p, const QRect &rect, crl::time now) { const auto x = rect.x() + particle.x * rect.width(); const auto y = rect.y() + particle.y * rect.height(); + const auto cache = validate(particle.colorIndex); const auto size = cache.width() / cache.devicePixelRatio() * particle.size; diff --git a/Telegram/SourceFiles/ui/effects/ministar_particles.h b/Telegram/SourceFiles/ui/effects/ministar_particles.h index 5b667d3534..9fc07d1f2a 100644 --- a/Telegram/SourceFiles/ui/effects/ministar_particles.h +++ b/Telegram/SourceFiles/ui/effects/ministar_particles.h @@ -24,10 +24,12 @@ public: void setSpeed(float speed); void setVisible(float visible); void setColor(const QColor &color); + void setColors(std::vector colors); void paint(QPainter &p, const QRect &rect, crl::time now); private: struct Particle { + int colorIndex = 0; float x = 0.; float y = 0.; float vx = 0.; @@ -47,7 +49,8 @@ private: int _starSize = 0; float _speed = 1.f; float _visible = 1.f; - QColor _color = QColor(255, 200, 70); + std::vector _colors = { QColor(255, 200, 70) }; + std::vector _paintedCaches; std::vector _particles; base::flat_map _starCache; crl::time _lastTime = 0; diff --git a/Telegram/lib_ui b/Telegram/lib_ui index 07bc368f17..b5b21bbcc5 160000 --- a/Telegram/lib_ui +++ b/Telegram/lib_ui @@ -1 +1 @@ -Subproject commit 07bc368f1795e0fa99aed6e18a5256d18badce0a +Subproject commit b5b21bbcc5a7c702b74f9450615fe350824f5fa7