From 08e04cdcb1d77f5a5ccc00d0b409dbc760c00327 Mon Sep 17 00:00:00 2001 From: John Preston <johnprestonmail@gmail.com> Date: Wed, 25 Dec 2019 12:01:49 +0300 Subject: [PATCH] Fix autoplay settings apply in albums. --- Telegram/SourceFiles/data/data_session.cpp | 28 ++++++++++++++----- Telegram/SourceFiles/data/data_session.h | 2 +- .../history/view/media/history_view_game.h | 4 +-- .../history/view/media/history_view_gif.cpp | 10 +++++-- .../history/view/media/history_view_gif.h | 2 +- .../history/view/media/history_view_media.h | 3 +- .../view/media/history_view_media_grouped.cpp | 20 +++++++++++++ .../view/media/history_view_media_grouped.h | 4 +++ .../view/media/history_view_web_page.h | 4 +-- 9 files changed, 60 insertions(+), 17 deletions(-) diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index ec79b54ad..745dcb626 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -3225,17 +3225,25 @@ void Session::unregisterContactItem( } void Session::registerPlayingVideoFile(not_null<ViewElement*> view) { - _playingVideoFiles.emplace(view); - registerHeavyViewPart(view); + if (++_playingVideoFiles[view] == 1) { + registerHeavyViewPart(view); + } } void Session::unregisterPlayingVideoFile(not_null<ViewElement*> view) { - _playingVideoFiles.remove(view); - unregisterHeavyViewPart(view); + const auto i = _playingVideoFiles.find(view); + if (i != _playingVideoFiles.end()) { + if (!--i->second) { + _playingVideoFiles.erase(i); + unregisterHeavyViewPart(view); + } + } else { + unregisterHeavyViewPart(view); + } } void Session::stopPlayingVideoFiles() { - for (const auto view : base::take(_playingVideoFiles)) { + for (const auto &[view, count] : base::take(_playingVideoFiles)) { if (const auto media = view->media()) { media->stopAnimation(); } @@ -3243,10 +3251,16 @@ void Session::stopPlayingVideoFiles() { } void Session::checkPlayingVideoFiles() { - for (const auto view : base::take(_playingVideoFiles)) { + const auto old = base::take(_playingVideoFiles); + for (const auto &[view, count] : old) { if (const auto media = view->media()) { - media->checkAnimation(); + if (const auto left = media->checkAnimationCount()) { + _playingVideoFiles.emplace(view, left); + registerHeavyViewPart(view); + continue; + } } + unregisterHeavyViewPart(view); } } diff --git a/Telegram/SourceFiles/data/data_session.h b/Telegram/SourceFiles/data/data_session.h index a2392f21d..d9a5d13a7 100644 --- a/Telegram/SourceFiles/data/data_session.h +++ b/Telegram/SourceFiles/data/data_session.h @@ -951,7 +951,7 @@ private: std::unordered_map< UserId, base::flat_set<not_null<ViewElement*>>> _contactViews; - base::flat_set<not_null<ViewElement*>> _playingVideoFiles; + base::flat_map<not_null<ViewElement*>, int> _playingVideoFiles; base::flat_set<not_null<WebPageData*>> _webpagesUpdated; base::flat_set<not_null<GameData*>> _gamesUpdated; diff --git a/Telegram/SourceFiles/history/view/media/history_view_game.h b/Telegram/SourceFiles/history/view/media/history_view_game.h index 8f523a609..b6e30d17a 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_game.h +++ b/Telegram/SourceFiles/history/view/media/history_view_game.h @@ -56,8 +56,8 @@ public: void stopAnimation() override { if (_attach) _attach->stopAnimation(); } - void checkAnimation() override { - if (_attach) _attach->checkAnimation(); + int checkAnimationCount() override { + return _attach ? _attach->checkAnimationCount() : 0; } not_null<GameData*> game() { diff --git a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp index f1ec081d2..6469c30b3 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp @@ -1365,10 +1365,14 @@ void Gif::stopAnimation() { } } -void Gif::checkAnimation() { - if (_streamed && !autoplayEnabled()) { - stopAnimation(); +int Gif::checkAnimationCount() { + if (!_streamed) { + return 0; + } else if (autoplayEnabled()) { + return 1; } + stopAnimation(); + return 0; } float64 Gif::dataProgress() const { diff --git a/Telegram/SourceFiles/history/view/media/history_view_gif.h b/Telegram/SourceFiles/history/view/media/history_view_gif.h index 4ace8dfe8..0a8eb7615 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_gif.h +++ b/Telegram/SourceFiles/history/view/media/history_view_gif.h @@ -82,7 +82,7 @@ public: StateRequest request) const override; void stopAnimation() override; - void checkAnimation() override; + int checkAnimationCount() override; TextWithEntities getCaption() const override { return _caption.toTextWithEntities(); diff --git a/Telegram/SourceFiles/history/view/media/history_view_media.h b/Telegram/SourceFiles/history/view/media/history_view_media.h index 99507e18d..e6782c48b 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_media.h +++ b/Telegram/SourceFiles/history/view/media/history_view_media.h @@ -133,7 +133,8 @@ public: } virtual void clearStickerLoopPlayed() { } - virtual void checkAnimation() { + virtual int checkAnimationCount() { + return 0; } [[nodiscard]] virtual QSize sizeForGrouping() const { diff --git a/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp b/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp index 18af76bdf..0b742bbe2 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp @@ -408,6 +408,26 @@ void GroupedMedia::updateNeedBubbleState() { _needBubble = computeNeedBubble(); } +void GroupedMedia::stopAnimation() { + for (auto &part : _parts) { + part.content->stopAnimation(); + } +} + +int GroupedMedia::checkAnimationCount() { + auto result = 0; + for (auto &part : _parts) { + result += part.content->checkAnimationCount(); + } + return result; +} + +void GroupedMedia::unloadHeavyPart() { + for (auto &part : _parts) { + part.content->unloadHeavyPart(); + } +} + void GroupedMedia::parentTextUpdated() { history()->owner().requestViewResize(_parent); } diff --git a/Telegram/SourceFiles/history/view/media/history_view_media_grouped.h b/Telegram/SourceFiles/history/view/media/history_view_media_grouped.h index 0c5323019..c042f9ac4 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_media_grouped.h +++ b/Telegram/SourceFiles/history/view/media/history_view_media_grouped.h @@ -86,6 +86,10 @@ public: return true; } + void stopAnimation() override; + int checkAnimationCount() override; + void unloadHeavyPart() override; + void parentTextUpdated() override; private: diff --git a/Telegram/SourceFiles/history/view/media/history_view_web_page.h b/Telegram/SourceFiles/history/view/media/history_view_web_page.h index f22e69f31..72d5cf906 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_web_page.h +++ b/Telegram/SourceFiles/history/view/media/history_view_web_page.h @@ -62,8 +62,8 @@ public: void stopAnimation() override { if (_attach) _attach->stopAnimation(); } - void checkAnimation() override { - if (_attach) _attach->checkAnimation(); + int checkAnimationCount() override { + return _attach ? _attach->checkAnimationCount() : 0; } not_null<WebPageData*> webpage() {