From 289602528cbea228c286de9bb0ac00948eff7778 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 1 Jul 2022 18:23:30 +0400 Subject: [PATCH] Fix custom emoji pausing in captions. --- .../SourceFiles/history/view/history_view_element.cpp | 3 +++ .../SourceFiles/history/view/history_view_element.h | 2 ++ .../SourceFiles/history/view/history_view_message.cpp | 10 +++++++++- .../SourceFiles/history/view/history_view_message.h | 3 +++ .../history/view/media/history_view_document.cpp | 1 + .../history/view/media/history_view_game.cpp | 7 +++---- .../history/view/media/history_view_gif.cpp | 1 + .../history/view/media/history_view_media.cpp | 11 +++++++++-- .../history/view/media/history_view_media.h | 3 +++ .../history/view/media/history_view_media_grouped.cpp | 1 + .../history/view/media/history_view_photo.cpp | 1 + .../history/view/media/history_view_web_page.cpp | 10 +++++----- .../media/view/media_view_overlay_widget.cpp | 8 +++++++- 13 files changed, 48 insertions(+), 13 deletions(-) diff --git a/Telegram/SourceFiles/history/view/history_view_element.cpp b/Telegram/SourceFiles/history/view/history_view_element.cpp index a442fb18e..7e5f4ae79 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.cpp +++ b/Telegram/SourceFiles/history/view/history_view_element.cpp @@ -412,6 +412,9 @@ void Element::setY(int y) { void Element::refreshDataIdHook() { } +void Element::customEmojiRepaint() { +} + //void Element::externalLottieProgressing(bool external) const { // if (const auto media = _media.get()) { // media->externalLottieProgressing(external); diff --git a/Telegram/SourceFiles/history/view/history_view_element.h b/Telegram/SourceFiles/history/view/history_view_element.h index 5a9a6d62b..c21cf218f 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.h +++ b/Telegram/SourceFiles/history/view/history_view_element.h @@ -427,6 +427,8 @@ public: virtual QRect innerGeometry() const = 0; + virtual void customEmojiRepaint(); + [[nodiscard]] ClickHandlerPtr fromPhotoLink() const { return fromLink(); } diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index 455178af0..b828f63f2 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -849,7 +849,7 @@ void Message::draw(Painter &p, const PaintContext &context) const { auto mediaPosition = QPoint( inner.left(), trect.y() + trect.height() - mediaHeight); - + _mediaRepaintScheduled = false; p.translate(mediaPosition); media->draw(p, context.translated( -mediaPosition @@ -918,6 +918,7 @@ void Message::draw(Painter &p, const PaintContext &context) const { media->paintBubbleFireworks(p, g, context.now); } } else if (media && media->isDisplayed()) { + _mediaRepaintScheduled = false; p.translate(g.topLeft()); media->draw(p, context.translated( -g.topLeft() @@ -2823,6 +2824,13 @@ QRect Message::innerGeometry() const { return result; } +void Message::customEmojiRepaint() { + if (!_mediaRepaintScheduled) { + _mediaRepaintScheduled = true; + history()->owner().requestViewRepaint(this); + } +} + QRect Message::countGeometry() const { const auto commentsRoot = (context() == Context::Replies) && data()->isDiscussionPost(); diff --git a/Telegram/SourceFiles/history/view/history_view_message.h b/Telegram/SourceFiles/history/view/history_view_message.h index d6687e3e1..151d7db90 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.h +++ b/Telegram/SourceFiles/history/view/history_view_message.h @@ -140,6 +140,8 @@ public: QRect innerGeometry() const override; + void customEmojiRepaint() override; + protected: void refreshDataIdHook() override; @@ -253,6 +255,7 @@ private: Ui::Text::String _rightBadge; int _bubbleWidthLimit = 0; mutable bool _heavyCustomEmoji = false; + mutable bool _mediaRepaintScheduled = false; BottomInfo _bottomInfo; diff --git a/Telegram/SourceFiles/history/view/media/history_view_document.cpp b/Telegram/SourceFiles/history/view/media/history_view_document.cpp index 2e2e707e4..80488b93a 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_document.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_document.cpp @@ -672,6 +672,7 @@ void Document::draw( } if (const auto captioned = Get()) { p.setPen(stm->historyTextFg); + applyCustomEmojiPause(p, captioned->_caption); captioned->_caption.draw(p, st::msgPadding.left(), captiontop, captionw, style::al_left, 0, -1, selection); } } diff --git a/Telegram/SourceFiles/history/view/media/history_view_game.cpp b/Telegram/SourceFiles/history/view/media/history_view_game.cpp index f629ec710..c83f14fb3 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_game.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_game.cpp @@ -36,8 +36,7 @@ Game::Game( if (!consumed.text.isEmpty()) { const auto context = Core::MarkedTextContext{ .session = &history()->session(), - .customEmojiRepaint = [=] { - history()->owner().requestViewRepaint(_parent); }, + .customEmojiRepaint = [=] { _parent->customEmojiRepaint(); }, }; _description.setMarkedText( st::webPageDescriptionStyle, @@ -246,6 +245,7 @@ void Game::draw(Painter &p, const PaintContext &context) const { if (_description.hasSkipBlock()) { endskip = _parent->skipBlockWidth(); } + applyCustomEmojiPause(p, _description); _description.drawLeftElided(p, padding.left(), tshift, paintw, width(), _descriptionLines, style::al_left, 0, -1, endskip, false, toDescriptionSelection(context.selection)); tshift += _descriptionLines * lineHeight; } @@ -431,8 +431,7 @@ void Game::parentTextUpdated() { if (!consumed.text.isEmpty()) { const auto context = Core::MarkedTextContext{ .session = &history()->session(), - .customEmojiRepaint = [=] { - history()->owner().requestViewRepaint(_parent); }, + .customEmojiRepaint = [=] { _parent->customEmojiRepaint(); }, }; _description.setMarkedText( st::webPageDescriptionStyle, diff --git a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp index 4c6aaa1f1..0c332cb16 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp @@ -670,6 +670,7 @@ void Gif::draw(Painter &p, const PaintContext &context) const { } if (!unwrapped && !_caption.isEmpty()) { p.setPen(stm->historyTextFg); + applyCustomEmojiPause(p, _caption); _caption.draw(p, st::msgPadding.left(), painty + painth + st::mediaCaptionSkip, captionw, style::al_left, 0, -1, context.selection); } else if (!inWebPage && !skipDrawingSurrounding) { auto fullRight = paintx + usex + usew; diff --git a/Telegram/SourceFiles/history/view/media/history_view_media.cpp b/Telegram/SourceFiles/history/view/media/history_view_media.cpp index 2be50fb68..bfb06c5cd 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_media.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_media.cpp @@ -191,6 +191,14 @@ void Media::repaint() const { history()->owner().requestViewRepaint(_parent); } +void Media::applyCustomEmojiPause( + Painter &p, + const Ui::Text::String &text) const { + if (text.hasCustomEmoji()) { + p.setInactive(_parent->delegate()->elementIsGifPaused()); + } +} + Ui::Text::String Media::createCaption(not_null item) const { if (item->emptyText()) { return {}; @@ -201,8 +209,7 @@ Ui::Text::String Media::createCaption(not_null item) const { auto result = Ui::Text::String(minResizeWidth); const auto context = Core::MarkedTextContext{ .session = &history()->session(), - .customEmojiRepaint = [=] { - history()->owner().requestViewRepaint(_parent); }, + .customEmojiRepaint = [=] { _parent->customEmojiRepaint(); }, }; result.setMarkedText( st::messageTextStyle, diff --git a/Telegram/SourceFiles/history/view/media/history_view_media.h b/Telegram/SourceFiles/history/view/media/history_view_media.h index ef97df565..0dfbc8058 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_media.h +++ b/Telegram/SourceFiles/history/view/media/history_view_media.h @@ -329,6 +329,9 @@ protected: [[nodiscard]] bool usesBubblePattern(const PaintContext &context) const; void repaint() const; + void applyCustomEmojiPause( + Painter &p, + const Ui::Text::String &text) const; const not_null _parent; MediaInBubbleState _inBubbleState = MediaInBubbleState::None; 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 faf675dc2..3947c3815 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp @@ -344,6 +344,7 @@ void GroupedMedia::draw(Painter &p, const PaintContext &context) const { - _caption.countHeight(captionw); const auto stm = context.messageStyle(); p.setPen(stm->historyTextFg); + applyCustomEmojiPause(p, _caption); _caption.draw(p, st::msgPadding.left(), captiony, captionw, style::al_left, 0, -1, selection); } else if (_parent->media() == this) { auto fullRight = width(); diff --git a/Telegram/SourceFiles/history/view/media/history_view_photo.cpp b/Telegram/SourceFiles/history/view/media/history_view_photo.cpp index 30d1555a9..12d2d9e19 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_photo.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_photo.cpp @@ -335,6 +335,7 @@ void Photo::draw(Painter &p, const PaintContext &context) const { // date if (!_caption.isEmpty()) { p.setPen(stm->historyTextFg); + applyCustomEmojiPause(p, _caption); _caption.draw(p, st::msgPadding.left(), painty + painth + st::mediaCaptionSkip, captionw, style::al_left, 0, -1, context.selection); } else if (!inWebPage) { auto fullRight = paintx + paintw; diff --git a/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp b/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp index 141135f35..89c020e13 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp @@ -210,12 +210,11 @@ QSize WebPage::countOptimalSize() { - st::msgPadding.right() - st::webPageLeft); } - auto context = Core::MarkedTextContext{ - .session = &history()->session(), - .customEmojiRepaint = [=] { - history()->owner().requestViewRepaint(_parent); }, - }; using MarkedTextContext = Core::MarkedTextContext; + auto context = MarkedTextContext{ + .session = &history()->session(), + .customEmojiRepaint = [=] { _parent->customEmojiRepaint(); }, + }; if (_data->siteName == qstr("Twitter")) { context.type = MarkedTextContext::HashtagMentionType::Twitter; } else if (_data->siteName == qstr("Instagram")) { @@ -566,6 +565,7 @@ void WebPage::draw(Painter &p, const PaintContext &context) const { if (_description.hasSkipBlock()) { endskip = _parent->skipBlockWidth(); } + applyCustomEmojiPause(p, _description); if (_descriptionLines > 0) { _description.drawLeftElided(p, padding.left(), tshift, paintw, width(), _descriptionLines, style::al_left, 0, -1, endskip, false, toDescriptionSelection(context.selection)); tshift += _descriptionLines * lineHeight; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 84f7cc140..766c65336 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -2264,9 +2264,15 @@ void OverlayWidget::refreshCaption() { const auto base = duration ? TimestampLinkBase(_document, _message->fullId()) : QString(); + const auto captionRepaint = [=] { + if (_fullScreenVideo || !_controlsOpacity.current()) { + return; + } + update(captionGeometry()); + }; const auto context = Core::MarkedTextContext{ .session = &_message->history()->session(), - .customEmojiRepaint = [=] { update(); }, + .customEmojiRepaint = captionRepaint, }; _caption.setMarkedText( st::mediaviewCaptionStyle,