From 7b51383b3bba65a1e30761c53fab7a5484485d4b Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 16 Mar 2020 17:38:36 +0400 Subject: [PATCH] Force animation unload in inline results. Fixes #7335. --- .../chat_helpers/gifs_list_widget.cpp | 1 + .../inline_bots/inline_bot_layout_internal.cpp | 16 ++++++++++++---- .../inline_bots/inline_bot_layout_internal.h | 4 ++++ .../inline_bots/inline_bot_layout_item.h | 2 ++ .../inline_bots/inline_results_widget.cpp | 1 + 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp index ef9e8ecea..30d8a84bb 100644 --- a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp @@ -442,6 +442,7 @@ void GifsListWidget::processPanelHideFinished() { if (const auto result = item->getResult()) { result->unload(); } + item->unloadAnimation(); }; // Preserve panel state through visibility toggles. //clearInlineRows(false); diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp b/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp index a29cadc62..06dd1b0c8 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp +++ b/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp @@ -357,6 +357,11 @@ void Gif::radialAnimationCallback(crl::time now) const { } } +void Gif::unloadAnimation() { + _gif.reset(); + getShownDocument()->unload(); +} + void Gif::clipCallback(Media::Clip::Notification notification) { using namespace Media::Clip; switch (notification) { @@ -370,8 +375,7 @@ void Gif::clipCallback(Media::Clip::Notification notification) { auto frame = countFrameSize(); _gif->start(frame.width(), frame.height(), _width, height, ImageRoundRadius::None, RectPart::None); } else if (_gif->autoPausedGif() && !context()->inlineItemVisible(this)) { - _gif.reset(); - getShownDocument()->unload(); + unloadAnimation(); } } @@ -1429,6 +1433,11 @@ void Game::radialAnimationCallback(crl::time now) const { } } +void Game::unloadAnimation() { + _gif.reset(); + getResultDocument()->unload(); +} + void Game::clipCallback(Media::Clip::Notification notification) { using namespace Media::Clip; switch (notification) { @@ -1440,8 +1449,7 @@ void Game::clipCallback(Media::Clip::Notification notification) { } else if (_gif->ready() && !_gif->started()) { _gif->start(_frameSize.width(), _frameSize.height(), st::inlineThumbSize, st::inlineThumbSize, ImageRoundRadius::None, RectPart::None); } else if (_gif->autoPausedGif() && !context()->inlineItemVisible(this)) { - _gif.reset(); - getResultDocument()->unload(); + unloadAnimation(); } } diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.h b/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.h index f98e2cd6b..a496f8535 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.h +++ b/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.h @@ -75,6 +75,8 @@ public: int resizeGetHeight(int width) override; + void unloadAnimation() override; + private: QSize countFrameSize() const; @@ -370,6 +372,8 @@ public: QPoint point, StateRequest request) const override; + void unloadAnimation() override; + private: void countFrameSize(); diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_layout_item.h b/Telegram/SourceFiles/inline_bots/inline_bot_layout_item.h index b506d6cae..3ee685426 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_layout_item.h +++ b/Telegram/SourceFiles/inline_bots/inline_bot_layout_item.h @@ -80,6 +80,8 @@ public: PhotoData *getPreviewPhoto() const; virtual void preload() const; + virtual void unloadAnimation() { + } void update() const; void layoutChanged(); diff --git a/Telegram/SourceFiles/inline_bots/inline_results_widget.cpp b/Telegram/SourceFiles/inline_bots/inline_results_widget.cpp index 17e537944..83ce40017 100644 --- a/Telegram/SourceFiles/inline_bots/inline_results_widget.cpp +++ b/Telegram/SourceFiles/inline_bots/inline_results_widget.cpp @@ -304,6 +304,7 @@ void Inner::hideFinish(bool completely) { if (const auto result = item->getResult()) { result->unload(); } + item->unloadAnimation(); }; clearInlineRows(false); for (const auto &[result, layout] : _inlineLayouts) {