From 7caabb8f5a12b569a1cc06481f84ec75bd956a31 Mon Sep 17 00:00:00 2001 From: John Preston Date: Sat, 21 Jan 2023 09:42:57 +0400 Subject: [PATCH] Fix crash in topics disabling. --- .../view/history_view_pinned_section.cpp | 4 +++ .../view/history_view_pinned_section.h | 2 ++ .../view/history_view_replies_section.cpp | 5 +++ .../view/history_view_replies_section.h | 2 ++ Telegram/SourceFiles/info/info_wrap_widget.h | 2 -- Telegram/SourceFiles/mainwidget.cpp | 34 +++++++++++++++---- Telegram/SourceFiles/window/section_memento.h | 7 ++++ .../window/window_session_controller.cpp | 12 +++++-- 8 files changed, 56 insertions(+), 12 deletions(-) diff --git a/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp b/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp index b4c8a4769..b3d1c20db 100644 --- a/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp @@ -84,6 +84,10 @@ object_ptr PinnedMemento::createWidget( return result; } +Data::ForumTopic *PinnedMemento::topicForRemoveRequests() const { + return _thread->asTopic(); +} + PinnedWidget::PinnedWidget( QWidget *parent, not_null controller, diff --git a/Telegram/SourceFiles/history/view/history_view_pinned_section.h b/Telegram/SourceFiles/history/view/history_view_pinned_section.h index 4584fba63..067e78f03 100644 --- a/Telegram/SourceFiles/history/view/history_view_pinned_section.h +++ b/Telegram/SourceFiles/history/view/history_view_pinned_section.h @@ -210,6 +210,8 @@ public: return _highlightId; } + Data::ForumTopic *topicForRemoveRequests() const override; + private: const not_null _thread; const UniversalMsgId _highlightId = 0; diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp index f3aa59cc5..35afc1d2b 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp @@ -153,6 +153,11 @@ void RepliesMemento::setFromTopic(not_null topic) { } } + +Data::ForumTopic *RepliesMemento::topicForRemoveRequests() const { + return _history->peer->forumTopicFor(_rootId); +} + void RepliesMemento::setReadInformation( MsgId inboxReadTillId, int unreadCount, diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.h b/Telegram/SourceFiles/history/view/history_view_replies_section.h index ab1215014..1b7456df7 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.h +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.h @@ -408,6 +408,8 @@ public: return _replyReturns; } + Data::ForumTopic *topicForRemoveRequests() const override; + [[nodiscard]] not_null list() { return &_list; } diff --git a/Telegram/SourceFiles/info/info_wrap_widget.h b/Telegram/SourceFiles/info/info_wrap_widget.h index 22580107c..a04c4d89c 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.h +++ b/Telegram/SourceFiles/info/info_wrap_widget.h @@ -112,8 +112,6 @@ public: rpl::producer desiredHeightValue() const override; - void updateInternalState(not_null memento); - // Float player interface. bool floatPlayerHandleWheelEvent(QEvent *e) override; QRect floatPlayerAvailableRect() override; diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index efa331739..07d9ae42e 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_document.h" #include "data/data_document_media.h" #include "data/data_document_resolver.h" +#include "data/data_forum_topic.h" #include "data/data_wall_paper.h" #include "data/data_web_page.h" #include "data/data_game.h" @@ -150,13 +151,20 @@ public: } [[nodiscard]] virtual StackItemType type() const = 0; - [[nodiscard]] virtual rpl::producer<> removeRequests() const = 0; + [[nodiscard]] rpl::producer<> removeRequests() const { + return rpl::merge( + _thirdSectionRemoveRequests.events(), + sectionRemoveRequests()); + } virtual ~StackItem() = default; private: + [[nodiscard]] virtual rpl::producer<> sectionRemoveRequests() const = 0; + PeerData *_peer = nullptr; QPointer _thirdSectionWeak; std::shared_ptr _thirdSectionMemento; + rpl::event_stream<> _thirdSectionRemoveRequests; rpl::lifetime _lifetime; @@ -177,14 +185,16 @@ public: StackItemType type() const override { return HistoryStackItem; } - rpl::producer<> removeRequests() const override { - return rpl::never<>(); - } not_null history; MsgId msgId; QVector replyReturns; +private: + rpl::producer<> sectionRemoveRequests() const override { + return rpl::never<>(); + } + }; class StackItemSection : public StackItem { @@ -195,14 +205,13 @@ public: StackItemType type() const override { return SectionStackItem; } - rpl::producer<> removeRequests() const override { - return _memento->removeRequests(); - } std::shared_ptr takeMemento() { return std::move(_memento); } private: + rpl::producer<> sectionRemoveRequests() const override; + std::shared_ptr _memento; }; @@ -210,6 +219,10 @@ private: void StackItem::setThirdSectionMemento( std::shared_ptr memento) { _thirdSectionMemento = std::move(memento); + if (const auto memento = _thirdSectionMemento.get()) { + memento->removeRequests( + ) | rpl::start_to_stream(_thirdSectionRemoveRequests, _lifetime); + } } StackItemSection::StackItemSection( @@ -218,6 +231,13 @@ StackItemSection::StackItemSection( , _memento(std::move(memento)) { } +rpl::producer<> StackItemSection::sectionRemoveRequests() const { + if (const auto topic = _memento->topicForRemoveRequests()) { + return rpl::merge(_memento->removeRequests(), topic->destroyed()); + } + return _memento->removeRequests(); +} + struct MainWidget::SettingBackground { explicit SettingBackground(const Data::WallPaper &data); diff --git a/Telegram/SourceFiles/window/section_memento.h b/Telegram/SourceFiles/window/section_memento.h index 605663bd5..e794d024e 100644 --- a/Telegram/SourceFiles/window/section_memento.h +++ b/Telegram/SourceFiles/window/section_memento.h @@ -11,6 +11,10 @@ namespace Ui { class LayerWidget; } // namespace Ui +namespace Data { +class ForumTopic; +} // namespace Data + namespace Window { class SessionController; @@ -34,6 +38,9 @@ public: return false; } + [[nodiscard]] virtual Data::ForumTopic *topicForRemoveRequests() const { + return nullptr; + } [[nodiscard]] virtual rpl::producer<> removeRequests() const { return rpl::never<>(); } diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index 72a2c5f0b..98c935fbc 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -1001,10 +1001,16 @@ void SessionController::showForum( } forum->destroyed( ) | rpl::start_with_next([=, history = forum->history()] { + const auto now = activeChatCurrent().owningHistory(); + const auto showHistory = !now || (now == history); closeForum(); - showPeerHistory( - history, - { anim::type::normal, anim::activation::background }); + if (showHistory) { + showPeerHistory(history, { + SectionShow::Way::Backward, + anim::type::normal, + anim::activation::background, + }); + } }, _shownForumLifetime); content()->showForum(forum, params); }