From 567216f41f7f97ad64e5ccf1375b52066c66d5b8 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 29 Dec 2022 17:48:33 +0400 Subject: [PATCH] Fix crash in topic jump ripple animation. Fixes #25500. --- Telegram/SourceFiles/dialogs/dialogs_row.cpp | 20 ++++++++++++++++--- Telegram/SourceFiles/dialogs/dialogs_row.h | 4 +++- .../dialogs/ui/dialogs_message_view.cpp | 6 ++++++ .../dialogs/ui/dialogs_message_view.h | 1 + .../dialogs/ui/dialogs_topics_view.cpp | 4 ++++ .../dialogs/ui/dialogs_topics_view.h | 2 +- 6 files changed, 32 insertions(+), 5 deletions(-) diff --git a/Telegram/SourceFiles/dialogs/dialogs_row.cpp b/Telegram/SourceFiles/dialogs/dialogs_row.cpp index e82fe1b4c..bf64ecdc7 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_row.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_row.cpp @@ -252,6 +252,10 @@ Row::Row(Key key, int index, int top) : _id(key), _top(top), _index(index) { } } +Row::~Row() { + clearTopicJumpRipple(); +} + void Row::recountHeight(float64 narrowRatio) { if (const auto history = _id.history()) { _height = history->isForum() @@ -487,6 +491,11 @@ void Row::stopLastRipple() { } } +void Row::clearRipple() { + BasicRow::clearRipple(); + clearTopicJumpRipple(); +} + void Row::addTopicJumpRipple( QPoint origin, not_null topicJumpCache, @@ -503,10 +512,15 @@ void Row::addTopicJumpRipple( } void Row::clearTopicJumpRipple() { - if (_topicJumpRipple) { - clearRipple(); - _topicJumpRipple = 0; + if (!_topicJumpRipple) { + return; } + const auto history = this->history(); + const auto view = history ? &history->lastItemDialogsView() : nullptr; + if (view) { + view->clearRipple(); + } + _topicJumpRipple = 0; } bool Row::topicJumpRipple() const { diff --git a/Telegram/SourceFiles/dialogs/dialogs_row.h b/Telegram/SourceFiles/dialogs/dialogs_row.h index 914962c40..d44667103 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_row.h +++ b/Telegram/SourceFiles/dialogs/dialogs_row.h @@ -53,11 +53,11 @@ public: void addRipple(QPoint origin, QSize size, Fn updateCallback); virtual void stopLastRipple(); + virtual void clearRipple(); void addRippleWithMask( QPoint origin, QImage mask, Fn updateCallback); - void clearRipple(); void paintRipple( QPainter &p, @@ -82,6 +82,7 @@ public: explicit Row(std::nullptr_t) { } Row(Key key, int index, int top); + ~Row(); [[nodiscard]] int top() const { return _top; @@ -105,6 +106,7 @@ public: [[nodiscard]] bool lookupIsInTopicJump(int x, int y) const; void stopLastRipple() override; + void clearRipple() override; void addTopicJumpRipple( QPoint origin, not_null topicJumpCache, diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.cpp index 986ec3581..ed869dd4b 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.cpp @@ -227,6 +227,12 @@ void MessageView::stopLastRipple() { } } +void MessageView::clearRipple() { + if (_topics) { + _topics->clearRipple(); + } +} + int MessageView::countWidth() const { auto result = 0; if (!_senderCache.isEmpty()) { diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.h b/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.h index 4ef089131..87b69b435 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.h +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.h @@ -73,6 +73,7 @@ public: not_null topicJumpCache, Fn updateCallback); void stopLastRipple(); + void clearRipple(); private: struct LoadingContext; diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_topics_view.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_topics_view.cpp index 564d7f88d..2b5b40349 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_topics_view.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_topics_view.cpp @@ -187,6 +187,10 @@ void TopicsView::stopLastRipple() { } } +void TopicsView::clearRipple() { + _ripple = nullptr; +} + void TopicsView::paintRipple( QPainter &p, int x, diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_topics_view.h b/Telegram/SourceFiles/dialogs/ui/dialogs_topics_view.h index ef712660d..b90c3d541 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_topics_view.h +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_topics_view.h @@ -89,8 +89,8 @@ public: int y, int outerWidth, const QColor *colorOverride) const; - void clearRipple(); void stopLastRipple(); + void clearRipple(); [[nodiscard]] rpl::lifetime &lifetime() { return _lifetime;