From 7442ea7a1607ac38aac5f9be2f8d87b31a7c0cf5 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 30 Jan 2025 12:04:44 +0300 Subject: [PATCH] Added ability to open single typed shared media in window for topics. --- .../info/profile/info_profile_inner_widget.cpp | 17 +++++++++++------ .../SourceFiles/window/window_separate_id.cpp | 17 ++++++++++++----- .../SourceFiles/window/window_separate_id.h | 12 ++++++++++-- .../window/window_session_controller.cpp | 12 +++++++++++- 4 files changed, 44 insertions(+), 14 deletions(-) diff --git a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp index 8d8a6b599..5ef8bfd32 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp @@ -78,22 +78,26 @@ Window::SeparateSharedMediaType ToSeparateType( Fn SeparateWindowFactory( not_null controller, not_null peer, + MsgId topicRootId, Storage::SharedMediaType type) { const auto separateType = ToSeparateType(type); if (separateType == Window::SeparateSharedMediaType::None) { return nullptr; } return [=] { - controller->showInNewWindow(Window::SeparateId(separateType, peer)); + controller->showInNewWindow({ + Window::SeparateSharedMedia(separateType, peer, topicRootId), + }); }; } void AddContextMenu( not_null button, - not_null controller, + not_null window, not_null peer, + MsgId rootId, Storage::SharedMediaType type) { - const auto callback = SeparateWindowFactory(controller, peer, type); + const auto callback = SeparateWindowFactory(window, peer, rootId, type); if (!callback) { return; } @@ -224,16 +228,17 @@ object_ptr InnerWidget::setupSharedMedia( auto addMediaButton = [&]( MediaType type, const style::icon &icon) { + const auto topicRootId = _topic ? _topic->rootId() : 0; auto result = Media::AddButton( content, _controller, _peer, - _topic ? _topic->rootId() : 0, + topicRootId, _migrated, type, tracker); - if (const auto window = _controller->parentController(); !_topic) { - AddContextMenu(result, window, _peer, type); + if (const auto window = _controller->parentController()) { + AddContextMenu(result, window, _peer, topicRootId, type); } object_ptr( result, diff --git a/Telegram/SourceFiles/window/window_separate_id.cpp b/Telegram/SourceFiles/window/window_separate_id.cpp index f46d4bce4..2b8896896 100644 --- a/Telegram/SourceFiles/window/window_separate_id.cpp +++ b/Telegram/SourceFiles/window/window_separate_id.cpp @@ -44,11 +44,12 @@ SeparateId::SeparateId(not_null peer) : SeparateId(SeparateType::Chat, peer->owner().history(peer)) { } -SeparateId::SeparateId(SeparateSharedMediaType type, not_null peer) +SeparateId::SeparateId(SeparateSharedMedia data) : type(SeparateType::SharedMedia) -, sharedMedia(type) -, account(&peer->session().account()) -, sharedMediaLocalPeer(peer) { +, sharedMedia(data.type) +, account(&data.peer->session().account()) +, sharedMediaDataPeer(data.peer) +, sharedMediaDataTopicRootId(data.topicRootId) { } bool SeparateId::primary() const { @@ -83,8 +84,14 @@ bool SeparateId::hasChatsList() const { PeerData *SeparateId::sharedMediaPeer() const { return (type == SeparateType::SharedMedia) - ? sharedMediaLocalPeer + ? sharedMediaDataPeer : nullptr; } +MsgId SeparateId::sharedMediaTopicRootId() const { + return (type == SeparateType::SharedMedia) + ? sharedMediaDataTopicRootId + : MsgId(); +} + } // namespace Window diff --git a/Telegram/SourceFiles/window/window_separate_id.h b/Telegram/SourceFiles/window/window_separate_id.h index e031e5400..81f417d4f 100644 --- a/Telegram/SourceFiles/window/window_separate_id.h +++ b/Telegram/SourceFiles/window/window_separate_id.h @@ -43,6 +43,12 @@ enum class SeparateSharedMediaType { GIF, }; +struct SeparateSharedMedia { + SeparateSharedMediaType type = SeparateSharedMediaType::None; + not_null peer; + MsgId topicRootId = MsgId(); +}; + struct SeparateId { SeparateId(std::nullptr_t); SeparateId(not_null account); @@ -50,13 +56,14 @@ struct SeparateId { SeparateId(SeparateType type, not_null thread); SeparateId(not_null thread); SeparateId(not_null peer); - SeparateId(SeparateSharedMediaType type, not_null peer); + SeparateId(SeparateSharedMedia data); SeparateType type = SeparateType::Primary; SeparateSharedMediaType sharedMedia = SeparateSharedMediaType::None; Main::Account *account = nullptr; Data::Thread *thread = nullptr; // For types except Main and Archive. - PeerData *sharedMediaLocalPeer = nullptr; + PeerData *sharedMediaDataPeer = nullptr; + MsgId sharedMediaDataTopicRootId = MsgId(); [[nodiscard]] bool valid() const { return account != nullptr; @@ -71,6 +78,7 @@ struct SeparateId { [[nodiscard]] Data::Folder *folder() const; [[nodiscard]] Data::SavedSublist *sublist() const; [[nodiscard]] PeerData *sharedMediaPeer() const; + [[nodiscard]] MsgId sharedMediaTopicRootId() const; [[nodiscard]] bool hasChatsList() const; diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index 6a82b2b49..5562388d2 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -1207,8 +1207,18 @@ void SessionNavigation::showByInitialId( : (id.sharedMedia == SeparateSharedMediaType::GIF) ? Storage::SharedMediaType::GIF : Storage::SharedMediaType::Photo; + const auto topicRootId = id.sharedMediaTopicRootId(); + const auto peer = id.sharedMediaPeer(); + const auto topic = topicRootId + ? peer->forumTopicFor(topicRootId) + : nullptr; + if (topicRootId && !topic) { + break; + } showSection( - std::make_shared(id.sharedMediaPeer(), type), + topicRootId + ? std::make_shared(topic, type) + : std::make_shared(peer, type), instant); parent->widget()->setMaximumWidth(st::maxWidthSharedMediaWindow); break;