From bc52ad7bf29d3de6d348fce174d9e673ae9e7c7d Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 25 Sep 2025 22:42:18 +0300 Subject: [PATCH] Added nice lottie icons to suggest and set photo in edit contact box. --- .../Resources/animations/camera_outline.tgs | Bin 0 -> 9844 bytes .../animations/photo_suggest_icon.tgs | Bin 0 -> 7357 bytes .../Resources/qrc/telegram/animations.qrc | 2 + .../boxes/peers/edit_contact_box.cpp | 143 +++++++++++++++++- 4 files changed, 141 insertions(+), 4 deletions(-) create mode 100644 Telegram/Resources/animations/camera_outline.tgs create mode 100644 Telegram/Resources/animations/photo_suggest_icon.tgs diff --git a/Telegram/Resources/animations/camera_outline.tgs b/Telegram/Resources/animations/camera_outline.tgs new file mode 100644 index 0000000000000000000000000000000000000000..f63db249de6cf4c324c841fca57aec23a94b886e GIT binary patch literal 9844 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/animations/photo_suggest_icon.tgs b/Telegram/Resources/animations/photo_suggest_icon.tgs new file mode 100644 index 0000000000000000000000000000000000000000..d05f5648e180a83a3ab5a9e6df37230d0a2f9320 GIT binary patch literal 7357 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/qrc/telegram/animations.qrc b/Telegram/Resources/qrc/telegram/animations.qrc index 7b120093d0..94365b758f 100644 --- a/Telegram/Resources/qrc/telegram/animations.qrc +++ b/Telegram/Resources/qrc/telegram/animations.qrc @@ -41,6 +41,8 @@ ../../animations/no_chats.tgs ../../animations/transcribe_loading.tgs ../../animations/cake.tgs + ../../animations/camera_outline.tgs + ../../animations/photo_suggest_icon.tgs ../../animations/dice/dice_idle.tgs ../../animations/dice/dart_idle.tgs diff --git a/Telegram/SourceFiles/boxes/peers/edit_contact_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_contact_box.cpp index 2a7ed69029..f80ca5db54 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_contact_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_contact_box.cpp @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_peer_photo.h" #include "api/api_text_entities.h" #include "apiwrap.h" +#include "base/call_delayed.h" #include "boxes/peers/edit_peer_common.h" #include "boxes/premium_preview_box.h" #include "chat_helpers/tabbed_panel.h" @@ -31,8 +32,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "info/userpic/info_userpic_emoji_builder_common.h" #include "info/userpic/info_userpic_emoji_builder_menu_item.h" #include "lang/lang_keys.h" +#include "lottie/lottie_common.h" +#include "lottie/lottie_frame_generator.h" #include "main/main_session.h" #include "settings/settings_common.h" +#include "ui/animated_icon.h" #include "ui/controls/emoji_button_factory.h" #include "ui/controls/emoji_button.h" #include "ui/controls/userpic_button.h" @@ -48,6 +52,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/widgets/popup_menu.h" #include "ui/wrap/vertical_layout.h" #include "ui/wrap/slide_wrap.h" +#include "ui/painter.h" #include "window/window_controller.h" #include "window/window_session_controller.h" #include "styles/style_boxes.h" @@ -56,12 +61,16 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_layers.h" #include "styles/style_menu_icons.h" #include "styles/style_settings.h" +#include "styles/style_widgets.h" #include #include namespace { +constexpr auto kAnimationStartFrame = 0; +constexpr auto kAnimationEndFrame = 21; + QString UserPhone(not_null user) { const auto phone = user->phone(); return phone.isEmpty() @@ -144,6 +153,11 @@ private: void processChosenPhotoWithMarkup( UserpicBuilder::Result &&data, bool suggest); + void executeWithDelay( + Fn callback, + bool suggest, + bool startAnimation = true); + void finishIconAnimation(bool suggest); not_null _box; not_null _window; @@ -153,6 +167,10 @@ private: Ui::InputField *_firstNameField = nullptr; base::unique_qptr _emojiPanel; base::unique_qptr _photoMenu; + std::unique_ptr _suggestIcon; + std::unique_ptr _cameraIcon; + Ui::RpWidget *_suggestIconWidget = nullptr; + Ui::RpWidget *_cameraIconWidget = nullptr; QString _phone; Fn _focus; Fn _save; @@ -457,6 +475,7 @@ void Controller::setupNotesField() { } void Controller::setupPhotoButtons() { + const auto iconSize = st::restoreUserpicIcon.size; auto nameValue = _firstNameField ? rpl::merge( rpl::single(_firstNameField->getLastText().trimmed()), @@ -489,12 +508,58 @@ void Controller::setupPhotoButtons() { }); suggestBirthdayWrap->toggleOn(rpl::single(!_user->birthday().valid())); + _suggestIcon = Ui::MakeAnimatedIcon({ + .generator = [] { + return std::make_unique( + Lottie::ReadContent( + QByteArray(), + u":/animations/photo_suggest_icon.tgs"_q)); + }, + .sizeOverride = iconSize * style::DevicePixelRatio(), + .colorized = true, + }); + + _cameraIcon = Ui::MakeAnimatedIcon({ + .generator = [] { + return std::make_unique( + Lottie::ReadContent( + QByteArray(), + u":/animations/camera_outline.tgs"_q)); + }, + .sizeOverride = iconSize * style::DevicePixelRatio(), + .colorized = true, + }); + const auto suggestButton = Settings::AddButtonWithIcon( inner, tr::lng_suggest_photo_for(lt_user, rpl::duplicate(nameValue)), st::settingsButtonLight, - { &st::menuBlueIconPhotoSuggest }); + { nullptr }); + + _suggestIconWidget = Ui::CreateChild(suggestButton); + _suggestIconWidget->resize(iconSize * style::DevicePixelRatio()); + _suggestIconWidget->paintRequest() | rpl::start_with_next([=] { + if (_suggestIcon && _suggestIcon->valid()) { + auto p = QPainter(_suggestIconWidget); + const auto frame = _suggestIcon->frame(st::lightButtonFg->c); + const auto rect = _suggestIconWidget->rect(); + p.drawImage(rect, frame); + } + }, _suggestIconWidget->lifetime()); + + suggestButton->sizeValue() | rpl::start_with_next([=](QSize size) { + _suggestIconWidget->move( + st::settingsButtonLight.iconLeft - iconSize.width() / 2, + (size.height() - _suggestIconWidget->height()) / 2); + }, _suggestIconWidget->lifetime()); + suggestButton->setClickedCallback([=] { + if (_suggestIcon && _suggestIcon->valid()) { + _suggestIcon->setCustomStartFrame(kAnimationStartFrame); + _suggestIcon->setCustomEndFrame(kAnimationEndFrame); + _suggestIcon->jumpToStart([=] { _suggestIconWidget->update(); }); + _suggestIcon->animate([=] { _suggestIconWidget->update(); }); + } showPhotoMenu(true); }); @@ -502,8 +567,32 @@ void Controller::setupPhotoButtons() { inner, tr::lng_set_photo_for_user(lt_user, rpl::duplicate(nameValue)), st::settingsButtonLight, - { &st::menuBlueIconPhotoSet }); + { nullptr }); + + _cameraIconWidget = Ui::CreateChild(setButton); + _cameraIconWidget->resize(iconSize * style::DevicePixelRatio()); + _cameraIconWidget->paintRequest() | rpl::start_with_next([=] { + if (_cameraIcon && _cameraIcon->valid()) { + auto p = QPainter(_cameraIconWidget); + const auto frame = _cameraIcon->frame(st::lightButtonFg->c); + const auto rect = _cameraIconWidget->rect(); + p.drawImage(rect, frame); + } + }, _cameraIconWidget->lifetime()); + + setButton->sizeValue() | rpl::start_with_next([=](QSize size) { + _cameraIconWidget->move( + st::settingsButtonLight.iconLeft - iconSize.width() / 2, + (size.height() - _cameraIconWidget->height()) / 2); + }, _cameraIconWidget->lifetime()); + setButton->setClickedCallback([=] { + if (_cameraIcon && _cameraIcon->valid()) { + _cameraIcon->setCustomStartFrame(kAnimationStartFrame); + _cameraIcon->setCustomEndFrame(kAnimationEndFrame); + _cameraIcon->jumpToStart([=] { _cameraIconWidget->update(); }); + _cameraIcon->animate([=] { _cameraIconWidget->update(); }); + } showPhotoMenu(false); }); @@ -623,9 +712,13 @@ void Controller::showPhotoMenu(bool suggest) { _box, st::popupMenuWithIcons); + QObject::connect(_photoMenu.get(), &QObject::destroyed, [=] { + finishIconAnimation(suggest); + }); + _photoMenu->addAction( tr::lng_attach_photo(tr::now), - [=] { choosePhotoFile(suggest); }, + [=] { executeWithDelay([=] { choosePhotoFile(suggest); }, suggest); }, &st::menuIconPhoto); if (const auto data = QGuiApplication::clipboard()->mimeData()) { @@ -659,7 +752,7 @@ void Controller::showPhotoMenu(bool suggest) { }; _photoMenu->addAction( tr::lng_profile_photo_from_clipboard(tr::now), - std::move(callback), + [=] { executeWithDelay(callback, suggest); }, &st::menuIconPhoto); } } @@ -708,6 +801,11 @@ void Controller::processChosenPhoto(QImage &&image, bool suggest) { Api::PeerPhoto::UserPhoto photo{ .image = base::duplicate(image), }; + if (suggest && _suggestIcon && _suggestIcon->valid()) { + _suggestIcon->animate([=] { _suggestIconWidget->update(); }); + } else if (!suggest && _cameraIcon && _cameraIcon->valid()) { + _cameraIcon->animate([=] { _cameraIconWidget->update(); }); + } if (suggest) { _window->session().api().peerPhoto().suggest(_user, std::move(photo)); _window->showPeerHistory(_user->id); @@ -724,6 +822,11 @@ void Controller::processChosenPhotoWithMarkup( .markupDocumentId = data.id, .markupColors = std::move(data.colors), }; + if (suggest && _suggestIcon && _suggestIcon->valid()) { + _suggestIcon->animate([=] { _suggestIconWidget->update(); }); + } else if (!suggest && _cameraIcon && _cameraIcon->valid()) { + _cameraIcon->animate([=] { _cameraIconWidget->update(); }); + } if (suggest) { _window->session().api().peerPhoto().suggest(_user, std::move(photo)); _window->showPeerHistory(_user->id); @@ -732,6 +835,38 @@ void Controller::processChosenPhotoWithMarkup( } } +void Controller::finishIconAnimation(bool suggest) { + const auto icon = suggest ? _suggestIcon.get() : _cameraIcon.get(); + const auto widget = suggest ? _suggestIconWidget : _cameraIconWidget; + if (icon && icon->valid()) { + icon->setCustomStartFrame(icon->frameIndex()); + icon->setCustomEndFrame(-1); + icon->animate([=] { widget->update(); }); + } +} + +void Controller::executeWithDelay( + Fn callback, + bool suggest, + bool startAnimation) { + const auto icon = suggest ? _suggestIcon.get() : _cameraIcon.get(); + const auto widget = suggest ? _suggestIconWidget : _cameraIconWidget; + + if (startAnimation && icon && icon->valid()) { + icon->setCustomStartFrame(icon->frameIndex()); + icon->setCustomEndFrame(-1); + icon->animate([=] { widget->update(); }); + } + + if (icon && icon->valid() && icon->animating()) { + base::call_delayed(50, [=] { + executeWithDelay(callback, suggest, false); + }); + } else { + callback(); + } +} + } // namespace void EditContactBox(