diff --git a/Telegram/Resources/animations/craft_progress.tgs b/Telegram/Resources/animations/craft_progress.tgs new file mode 100644 index 0000000000..7bcdbda3b2 Binary files /dev/null and b/Telegram/Resources/animations/craft_progress.tgs differ diff --git a/Telegram/Resources/qrc/telegram/animations.qrc b/Telegram/Resources/qrc/telegram/animations.qrc index 3842e925d7..1ab7e76e83 100644 --- a/Telegram/Resources/qrc/telegram/animations.qrc +++ b/Telegram/Resources/qrc/telegram/animations.qrc @@ -90,5 +90,6 @@ ../../animations/swipe_action/unpin.tgs ../../animations/swipe_action/read.tgs ../../animations/swipe_action/unread.tgs + ../../animations/craft_progress.tgs diff --git a/Telegram/SourceFiles/boxes/star_gift_craft_animation.cpp b/Telegram/SourceFiles/boxes/star_gift_craft_animation.cpp index 7a75148296..110fe2f216 100644 --- a/Telegram/SourceFiles/boxes/star_gift_craft_animation.cpp +++ b/Telegram/SourceFiles/boxes/star_gift_craft_animation.cpp @@ -22,6 +22,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "info/peer_gifts/info_peer_gifts_common.h" #include "lang/lang_keys.h" #include "lottie/lottie_common.h" +#include "lottie/lottie_icon.h" #include "main/main_session.h" #include "settings/settings_credits_graphics.h" #include "ui/boxes/boost_box.h" @@ -1354,6 +1355,76 @@ CraftState::EmptySide CraftState::prepareEmptySide(int index) const { return { .bg = bg, .frame = result }; } +void SetupCraftProgressTitle( + not_null container, + not_null*> opacity) { + const auto row = container->add( + object_ptr(container), + st::boxRowPadding + st::craftProgressTitleMargin, + style::al_top); + + const auto label = CreateChild( + row, + tr::lng_gift_craft_progress(), + st::uniqueGiftTitle); + label->setTextColorOverride(st::white->c); + + const auto iconSize = st::craftProgressIconSize; + const auto iconWidget = CreateChild(row); + iconWidget->resize(iconSize); + + auto owned = Lottie::MakeIcon({ + .name = u"craft_progress"_q, + .sizeOverride = iconSize, + .limitFps = true, + }); + const auto icon = owned.get(); + iconWidget->lifetime().add([kept = std::move(owned)] {}); + + const auto startAnimation = [=] { + icon->animate( + [=] { iconWidget->update(); }, + 0, + icon->framesCount() - 1); + }; + startAnimation(); + + iconWidget->paintRequest( + ) | rpl::on_next([=] { + auto p = QPainter(iconWidget); + p.setOpacity(opacity->current()); + icon->paint(p, 0, 0); + if (!icon->animating() && icon->frameIndex() > 0) { + startAnimation(); + } + }, iconWidget->lifetime()); + + rpl::combine( + label->sizeValue(), + row->sizeValue() + ) | rpl::on_next([=](QSize labelSize, QSize rowSize) { + const auto skip = st::craftProgressIconSkip; + const auto totalWidth = iconSize.width() + skip + labelSize.width(); + const auto rowHeight = std::max(iconSize.height(), labelSize.height()); + if (rowSize.height() != rowHeight) { + row->resize(rowSize.width(), rowHeight); + return; + } + const auto left = (rowSize.width() - totalWidth) / 2; + iconWidget->move(left, (rowHeight - iconSize.height()) / 2); + label->move( + left + iconSize.width() + skip, + (rowHeight - labelSize.height()) / 2); + }, row->lifetime()); + + opacity->value( + ) | rpl::on_next([=](float64 value) { + label->setOpacity(value); + iconWidget->update(); + }, row->lifetime()); + +} + void SetupProgressControls( not_null state, not_null canvas) { @@ -1367,15 +1438,7 @@ void SetupProgressControls( controls->resizeToWidth(canvas->width()); controls->move(0, state->shared->craftingBottom); - const auto title = controls->add( - object_ptr( - controls, - tr::lng_gift_craft_progress(), - st::uniqueGiftTitle), - st::boxRowPadding + st::craftProgressTitleMargin, - style::al_top); - add(title); - title->setTextColorOverride(st::white->c); + SetupCraftProgressTitle(controls, &state->progressOpacity); const auto subColor = QColor(255, 255, 255, 178); const auto about = controls->add( diff --git a/Telegram/SourceFiles/ui/effects/credits.style b/Telegram/SourceFiles/ui/effects/credits.style index 74613058f8..597b8e1645 100644 --- a/Telegram/SourceFiles/ui/effects/credits.style +++ b/Telegram/SourceFiles/ui/effects/credits.style @@ -633,6 +633,8 @@ craftProgressTitleMargin: margins(0px, 12px, 0px, 16px); craftProgressAboutMargin: margins(0px, 4px, 0px, 16px); craftProgressWarningMargin: margins(0px, 4px, 0px, 16px); craftProgressChanceMargin: margins(0px, 40px, 0px, 16px); +craftProgressIconSize: size(24px, 24px); +craftProgressIconSkip: 4px; craftFailureThumbsTop: 36px; craftFailureTitleMargin: margins(0px, 88px, 0px, 12px); craftFailureAboutMargin: margins(0px, 0px, 0px, 16px);