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);