diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 4d92ebf9a5..cef92dcffb 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -2940,9 +2940,6 @@ void HistoryInner::updateSize() { if (_historyPaddingTop != newHistoryPaddingTop) { _historyPaddingTop = newHistoryPaddingTop; - _emojiInteractions->visibleAreaUpdated( - _visibleAreaTop - _historyPaddingTop, - _visibleAreaBottom - _historyPaddingTop); } int newHeight = _historyPaddingTop + itemsHeight + st::historyPaddingBottom; diff --git a/Telegram/SourceFiles/history/view/history_view_emoji_interactions.cpp b/Telegram/SourceFiles/history/view/history_view_emoji_interactions.cpp index 4e0b201aef..be6adfd074 100644 --- a/Telegram/SourceFiles/history/view/history_view_emoji_interactions.cpp +++ b/Telegram/SourceFiles/history/view/history_view_emoji_interactions.cpp @@ -162,7 +162,7 @@ void EmojiInteractions::play( QString filepath, bool incoming, bool premium) { - const auto top = view->block()->y() + view->y(); + const auto top = _itemTop(view); const auto bottom = top + view->height(); if (_visibleTop >= bottom || _visibleBottom <= top @@ -278,14 +278,13 @@ QRect EmojiInteractions::computeRect( const auto sticker = premium ? _premiumSize : _emojiSize; const auto size = sizeFor(premium); const auto shift = size.width() / 40; - const auto skip = (view->hasFromPhoto() ? st::msgPhotoSkip : 0) - + st::msgMargin.left(); + const auto inner = view->innerGeometry(); const auto rightAligned = view->hasOutLayout() && !view->delegate()->elementIsChatWide(); const auto left = rightAligned - ? (fullWidth - skip + shift - size.width()) - : (skip - shift); - const auto viewTop = _itemTop(view) + view->marginTop(); + ? (inner.x() + inner.width() + shift - size.width()) + : (inner.x() - shift); + const auto viewTop = _itemTop(view) + inner.y(); if (viewTop < 0) { return QRect(); } diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp index 1eee492dd0..2d1f6a678b 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp @@ -16,6 +16,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/media/history_view_sticker.h" #include "history/view/history_view_context_menu.h" #include "history/view/history_view_element.h" +#include "history/view/history_view_emoji_interactions.h" #include "history/view/history_view_message.h" #include "history/view/history_view_service_message.h" #include "history/view/history_view_cursor_state.h" @@ -264,6 +265,9 @@ ListWidget::ListWidget( : RpWidget(parent) , _delegate(delegate) , _controller(controller) +, _emojiInteractions(std::make_unique( + &controller->session(), + [=](not_null view) { return itemTop(view); })) , _context(_delegate->listContext()) , _itemAverageHeight(itemMinimalHeight()) , _pathGradient( @@ -381,6 +385,11 @@ ListWidget::ListWidget( _isChatWide = wide; }, lifetime()); + _emojiInteractions->updateRequests( + ) | rpl::start_with_next([=](QRect rect) { + update(rect); + }, lifetime()); + _selectScroll.scrolls( ) | rpl::start_with_next([=](int d) { delegate->listScrollTo(_visibleTop + d); @@ -804,6 +813,8 @@ void ListWidget::visibleTopBottomUpdated( _controller->floatPlayerAreaUpdated(); session().data().itemVisibilitiesUpdated(); _applyUpdatedScrollState.call(); + + _emojiInteractions->visibleAreaUpdated(_visibleTop, _visibleBottom); } void ListWidget::applyUpdatedScrollState() { @@ -1520,11 +1531,13 @@ void ListWidget::elementStartInteraction(not_null view) { } void ListWidget::elementStartPremium( - not_null view, - Element *replacing) { + not_null view, + Element *replacing) { + _emojiInteractions->playPremiumEffect(view, replacing); } void ListWidget::elementCancelPremium(not_null view) { + _emojiInteractions->cancelPremiumEffect(view); } void ListWidget::elementShowSpoilerAnimation() { @@ -1917,6 +1930,7 @@ void ListWidget::paintEvent(QPaintEvent *e) { }); _reactionsManager->paint(p, context); + _emojiInteractions->paint(p); } } diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.h b/Telegram/SourceFiles/history/view/history_view_list_widget.h index 930621c904..5fac0b4857 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.h +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.h @@ -45,6 +45,7 @@ namespace HistoryView { struct TextState; struct StateRequest; +class EmojiInteractions; enum class CursorState : char; enum class PointState : char; enum class Context : char; @@ -546,6 +547,8 @@ private: const not_null _delegate; const not_null _controller; + const std::unique_ptr _emojiInteractions; + Data::MessagePosition _aroundPosition; Data::MessagePosition _shownAtPosition; Context _context;