From 0a2fbb0d70f9f98ebfc34606efdd36b4256a7ce5 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Fri, 11 Feb 2022 07:40:11 +0300 Subject: [PATCH] Added simple animation of stickers sending from inline bots. --- Telegram/SourceFiles/apiwrap.cpp | 7 +++++-- Telegram/SourceFiles/apiwrap.h | 3 ++- Telegram/SourceFiles/history/history_widget.cpp | 9 ++++++++- .../view/history_view_replies_section.cpp | 12 ++++++++---- .../history/view/history_view_replies_section.h | 3 ++- .../view/history_view_scheduled_section.cpp | 2 +- .../inline_bots/inline_bot_layout_internal.cpp | 14 ++++++++++++++ .../inline_bots/inline_bot_layout_internal.h | 2 ++ .../inline_bots/inline_bot_layout_item.h | 5 +++++ .../SourceFiles/inline_bots/inline_bot_result.h | 2 ++ .../inline_bots/inline_results_inner.cpp | 17 +++++++++++++++++ 11 files changed, 66 insertions(+), 10 deletions(-) diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index ec23a3c829..ef7e7fd113 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -3616,14 +3616,17 @@ void ApiWrap::sendBotStart(not_null bot, PeerData *chat) { void ApiWrap::sendInlineResult( not_null bot, not_null data, - const SendAction &action) { + const SendAction &action, + std::optional localMessageId) { sendAction(action); const auto history = action.history; const auto peer = history->peer; const auto newId = FullMsgId( peer->id, - _session->data().nextLocalMessageId()); + localMessageId + ? (*localMessageId) + : _session->data().nextLocalMessageId()); const auto randomId = base::RandomValue(); auto flags = NewMessageFlags(peer); diff --git a/Telegram/SourceFiles/apiwrap.h b/Telegram/SourceFiles/apiwrap.h index f26ea4dd58..c0b0cb7a3c 100644 --- a/Telegram/SourceFiles/apiwrap.h +++ b/Telegram/SourceFiles/apiwrap.h @@ -325,7 +325,8 @@ public: void sendInlineResult( not_null bot, not_null data, - const SendAction &action); + const SendAction &action, + std::optional localMessageId); void sendMessageFail( const MTP::Error &error, not_null peer, diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 41ea4e6e30..eb57de9ee3 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -6048,9 +6048,16 @@ void HistoryWidget::sendInlineResult(InlineBots::ResultSelected result) { return; } + controller()->sendingAnimation().appendSending( + result.messageSendingFrom); + auto action = prepareSendAction(result.options); action.generateLocal = true; - session().api().sendInlineResult(result.bot, result.result, action); + session().api().sendInlineResult( + result.bot, + result.result, + action, + result.messageSendingFrom.localId); clearFieldText(); _saveDraftText = true; diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp index eeb56f75f4..e488db7ef0 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp @@ -563,7 +563,10 @@ void RepliesWidget::setupComposeControls() { _composeControls->inlineResultChosen( ) | rpl::start_with_next([=](Selector::InlineChosen chosen) { - sendInlineResult(chosen.result, chosen.bot, chosen.options); + controller()->sendingAnimation().appendSending( + chosen.messageSendingFrom); + const auto localId = chosen.messageSendingFrom.localId; + sendInlineResult(chosen.result, chosen.bot, chosen.options, localId); }, lifetime()); _composeControls->scrollRequests( @@ -1146,7 +1149,7 @@ void RepliesWidget::sendInlineResult( controller()->show(Box(errorText)); return; } - sendInlineResult(result, bot, {}); + sendInlineResult(result, bot, {}, std::nullopt); //const auto callback = [=](Api::SendOptions options) { // sendInlineResult(result, bot, options); //}; @@ -1158,10 +1161,11 @@ void RepliesWidget::sendInlineResult( void RepliesWidget::sendInlineResult( not_null result, not_null bot, - Api::SendOptions options) { + Api::SendOptions options, + std::optional localMessageId) { auto action = prepareSendAction(options); action.generateLocal = true; - session().api().sendInlineResult(bot, result, action); + session().api().sendInlineResult(bot, result, action, localMessageId); _composeControls->clear(); //_saveDraftText = true; diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.h b/Telegram/SourceFiles/history/view/history_view_replies_section.h index 4102c4622a..43d247665f 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.h +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.h @@ -257,7 +257,8 @@ private: void sendInlineResult( not_null result, not_null bot, - Api::SendOptions options); + Api::SendOptions options, + std::optional localMessageId); [[nodiscard]] bool showSlowmodeError(); [[nodiscard]] std::optional writeRestriction() const; diff --git a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp index 31ce7156d9..c4e284381d 100644 --- a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp @@ -752,7 +752,7 @@ void ScheduledWidget::sendInlineResult( Api::SendOptions options) { auto action = prepareSendAction(options); action.generateLocal = true; - session().api().sendInlineResult(bot, result, action); + session().api().sendInlineResult(bot, result, action, std::nullopt); _composeControls->clear(); //_saveDraftText = true; diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp b/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp index fb0ff53080..21258af611 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp +++ b/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp @@ -465,6 +465,20 @@ void Sticker::unloadHeavyPart() { _webm = nullptr; } +QRect Sticker::innerContentRect() const { + ensureDataMediaCreated(getShownDocument()); + + const auto size = (_lottie && _lottie->ready()) + ? (_lottie->frame().size() / style::DevicePixelRatio()) + : (!_thumb.isNull()) + ? (_thumb.size() / style::DevicePixelRatio()) + : getThumbSize(); + const auto pos = QPoint( + (st::stickerPanSize.width() - size.width()) / 2, + (st::stickerPanSize.height() - size.height()) / 2); + return QRect(pos, size); +} + void Sticker::paint(Painter &p, const QRect &clip, const PaintContext *context) const { ensureDataMediaCreated(getShownDocument()); diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.h b/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.h index c29d06db7f..49a2c34a26 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.h +++ b/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.h @@ -201,6 +201,8 @@ public: void unloadHeavyPart() override; + QRect innerContentRect() const override; + private: void ensureDataMediaCreated(not_null document) const; void setupLottie() const; diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_layout_item.h b/Telegram/SourceFiles/inline_bots/inline_bot_layout_item.h index d4676103ac..d989bc91c2 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_layout_item.h +++ b/Telegram/SourceFiles/inline_bots/inline_bot_layout_item.h @@ -109,6 +109,11 @@ public: update(); } + virtual QRect innerContentRect() const { + // Only stickers are supported for now. + Unexpected("Unsupported type to get a rect of inner content."); + } + static std::unique_ptr createLayout( not_null context, not_null result, diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_result.h b/Telegram/SourceFiles/inline_bots/inline_bot_result.h index c698b0698f..e95b6ddf77 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_result.h +++ b/Telegram/SourceFiles/inline_bots/inline_bot_result.h @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_cloud_file.h" #include "api/api_common.h" #include "media/view/media_view_open_common.h" +#include "ui/effects/message_sending_animation_common.h" class FileLoader; class History; @@ -132,6 +133,7 @@ struct ResultSelected { not_null result; not_null bot; Api::SendOptions options; + Ui::MessageSendingAnimationFrom messageSendingFrom; // Open in OverlayWidget; bool open = false; }; diff --git a/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp b/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp index 3e4b927ea4..9b15a6be85 100644 --- a/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp +++ b/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp @@ -11,10 +11,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "chat_helpers/gifs_list_widget.h" // ChatHelpers::AddGifAction #include "chat_helpers/send_context_menu.h" // SendMenu::FillSendMenu #include "core/click_handler_types.h" +#include "data/data_document.h" #include "data/data_file_origin.h" #include "data/data_user.h" #include "data/data_changes.h" #include "data/data_chat_participant_status.h" +#include "data/data_session.h" #include "inline_bots/inline_bot_result.h" #include "inline_bots/inline_bot_layout_item.h" #include "lang/lang_keys.h" @@ -264,6 +266,20 @@ void Inner::selectInlineResult( if (!item) { return; } + const auto messageSendingFrom = [&]() -> Ui::MessageSendingAnimationFrom { + const auto document = item->getDocument() + ? item->getDocument() + : item->getPreviewDocument(); + if (options.scheduled || !document || !document->sticker()) { + return {}; + } + const auto rect = item->innerContentRect().translated( + _mosaic.findRect(index).topLeft()); + return { + .localId = _controller->session().data().nextLocalMessageId(), + .globalStartGeometry = mapToGlobal(rect), + }; + }; if (const auto inlineResult = item->getResult()) { if (inlineResult->onChoose(item)) { @@ -271,6 +287,7 @@ void Inner::selectInlineResult( .result = inlineResult, .bot = _inlineBot, .options = std::move(options), + .messageSendingFrom = messageSendingFrom(), .open = open, }); }