diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index b5aad44fe..f2aa6b215 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -1596,6 +1596,25 @@ void Session::unloadHeavyViewParts( } } +void Session::registerShownSpoiler(FullMsgId id) { + if (const auto item = message(id)) { + _shownSpoilers.emplace(item); + } +} + +void Session::unregisterShownSpoiler(FullMsgId id) { + if (const auto item = message(id)) { + _shownSpoilers.remove(item); + } +} + +void Session::hideShownSpoilers() { + for (const auto &item : _shownSpoilers) { + item->hideSpoilers(); + } + _shownSpoilers = base::flat_set>(); +} + void Session::removeMegagroupParticipant( not_null channel, not_null user) { diff --git a/Telegram/SourceFiles/data/data_session.h b/Telegram/SourceFiles/data/data_session.h index aa28fd30d..fb1bc7f80 100644 --- a/Telegram/SourceFiles/data/data_session.h +++ b/Telegram/SourceFiles/data/data_session.h @@ -282,6 +282,10 @@ public: int from, int till); + void registerShownSpoiler(FullMsgId id); + void unregisterShownSpoiler(FullMsgId id); + void hideShownSpoilers(); + using MegagroupParticipant = std::tuple< not_null, not_null>; @@ -943,6 +947,8 @@ private: rpl::event_stream _invitesToCalls; base::flat_map>> _invitedToCallUsers; + base::flat_set> _shownSpoilers; + History *_topPromoted = nullptr; NotifySettings _defaultUserNotifySettings; diff --git a/Telegram/SourceFiles/history/history_item.h b/Telegram/SourceFiles/history/history_item.h index a6a4f2c30..a2f447be1 100644 --- a/Telegram/SourceFiles/history/history_item.h +++ b/Telegram/SourceFiles/history/history_item.h @@ -333,6 +333,8 @@ public: virtual void setRealId(MsgId newId); virtual void incrementReplyToTopCounter() { } + virtual void hideSpoilers() { + } [[nodiscard]] bool emptyText() const { return _text.isEmpty(); diff --git a/Telegram/SourceFiles/history/history_message.cpp b/Telegram/SourceFiles/history/history_message.cpp index 7840194be..9063207bc 100644 --- a/Telegram/SourceFiles/history/history_message.cpp +++ b/Telegram/SourceFiles/history/history_message.cpp @@ -998,6 +998,10 @@ void HistoryMessage::setCommentsItemId(FullMsgId id) { } } +void HistoryMessage::hideSpoilers() { + HistoryView::HideSpoilers(_text); +} + bool HistoryMessage::updateDependencyItem() { if (const auto reply = Get()) { const auto documentId = reply->replyToDocumentId; diff --git a/Telegram/SourceFiles/history/history_message.h b/Telegram/SourceFiles/history/history_message.h index 3f91da06d..3cf8c8ec4 100644 --- a/Telegram/SourceFiles/history/history_message.h +++ b/Telegram/SourceFiles/history/history_message.h @@ -201,6 +201,7 @@ public: [[nodiscard]] MsgId dependencyMsgId() const override { return replyToId(); } + void hideSpoilers() override; void applySentMessage(const MTPDmessage &data) override; void applySentMessage( diff --git a/Telegram/SourceFiles/history/history_service.cpp b/Telegram/SourceFiles/history/history_service.cpp index cd7f94113..f2cd05962 100644 --- a/Telegram/SourceFiles/history/history_service.cpp +++ b/Telegram/SourceFiles/history/history_service.cpp @@ -998,6 +998,10 @@ void HistoryService::setServiceText(const PreparedText &prepared) { _textHeight = 0; } +void HistoryService::hideSpoilers() { + HistoryView::HideSpoilers(_text); +} + void HistoryService::markMediaAsReadHook() { if (const auto selfdestruct = Get()) { if (!selfdestruct->destructAt) { diff --git a/Telegram/SourceFiles/history/history_service.h b/Telegram/SourceFiles/history/history_service.h index 0e3fc4306..01bc48749 100644 --- a/Telegram/SourceFiles/history/history_service.h +++ b/Telegram/SourceFiles/history/history_service.h @@ -120,6 +120,8 @@ public: void setServiceText(const PreparedText &prepared); + void hideSpoilers() override; + ~HistoryService(); protected: diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 67248d59f..8a6dcd112 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -2007,6 +2007,7 @@ void HistoryWidget::showHistory( return; } else { session().data().sponsoredMessages().clearItems(_history); + session().data().hideShownSpoilers(); } session().sendProgressManager().update( _history, diff --git a/Telegram/SourceFiles/history/view/history_view_spoiler_click_handler.cpp b/Telegram/SourceFiles/history/view/history_view_spoiler_click_handler.cpp index eac71ef24..a75cf1c65 100644 --- a/Telegram/SourceFiles/history/view/history_view_spoiler_click_handler.cpp +++ b/Telegram/SourceFiles/history/view/history_view_spoiler_click_handler.cpp @@ -8,7 +8,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/history_view_spoiler_click_handler.h" #include "core/click_handler_types.h" // ClickHandlerContext +#include "data/data_session.h" #include "history/view/history_view_element.h" +#include "main/main_session.h" +#include "window/window_session_controller.h" #include "ui/spoiler_click_handler.h" namespace HistoryView { @@ -33,6 +36,10 @@ void AnimatedSpoilerClickHandler::onClick(ClickContext context) const { const auto nonconst = const_cast(this); nonconst->setStartMs(crl::now()); SpoilerClickHandler::onClick({}); + + if (const auto controller = my.sessionWindow.get()) { + controller->session().data().registerShownSpoiler(my.itemId); + } } } @@ -46,4 +53,10 @@ void FillTextWithAnimatedSpoilers(Ui::Text::String &text) { } } +void HideSpoilers(Ui::Text::String &text) { + for (auto i = 0; i < text.spoilersCount(); i++) { + text.setSpoilerShown(i + 1, false); + } +} + } // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/history_view_spoiler_click_handler.h b/Telegram/SourceFiles/history/view/history_view_spoiler_click_handler.h index 4813a31a6..e5a8f3936 100644 --- a/Telegram/SourceFiles/history/view/history_view_spoiler_click_handler.h +++ b/Telegram/SourceFiles/history/view/history_view_spoiler_click_handler.h @@ -10,5 +10,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace HistoryView { void FillTextWithAnimatedSpoilers(Ui::Text::String &text); +void HideSpoilers(Ui::Text::String &text); } // namespace HistoryView diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 5e4962458..96ba731c1 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -1276,6 +1276,7 @@ void MainWidget::ui_showPeerHistory( if (IsServerMsgId(showAtMsgId) && _mainSection && _mainSection->showMessage(peerId, params, showAtMsgId)) { + session().data().hideShownSpoilers(); return; }