Added ability to open single typed shared media in window for topics.

This commit is contained in:
23rd 2025-01-30 12:04:44 +03:00
parent 0089cad740
commit 7442ea7a16
4 changed files with 44 additions and 14 deletions

View file

@ -78,22 +78,26 @@ Window::SeparateSharedMediaType ToSeparateType(
Fn<void()> SeparateWindowFactory( Fn<void()> SeparateWindowFactory(
not_null<Window::SessionController*> controller, not_null<Window::SessionController*> controller,
not_null<PeerData*> peer, not_null<PeerData*> peer,
MsgId topicRootId,
Storage::SharedMediaType type) { Storage::SharedMediaType type) {
const auto separateType = ToSeparateType(type); const auto separateType = ToSeparateType(type);
if (separateType == Window::SeparateSharedMediaType::None) { if (separateType == Window::SeparateSharedMediaType::None) {
return nullptr; return nullptr;
} }
return [=] { return [=] {
controller->showInNewWindow(Window::SeparateId(separateType, peer)); controller->showInNewWindow({
Window::SeparateSharedMedia(separateType, peer, topicRootId),
});
}; };
} }
void AddContextMenu( void AddContextMenu(
not_null<Ui::AbstractButton*> button, not_null<Ui::AbstractButton*> button,
not_null<Window::SessionController*> controller, not_null<Window::SessionController*> window,
not_null<PeerData*> peer, not_null<PeerData*> peer,
MsgId rootId,
Storage::SharedMediaType type) { Storage::SharedMediaType type) {
const auto callback = SeparateWindowFactory(controller, peer, type); const auto callback = SeparateWindowFactory(window, peer, rootId, type);
if (!callback) { if (!callback) {
return; return;
} }
@ -224,16 +228,17 @@ object_ptr<Ui::RpWidget> InnerWidget::setupSharedMedia(
auto addMediaButton = [&]( auto addMediaButton = [&](
MediaType type, MediaType type,
const style::icon &icon) { const style::icon &icon) {
const auto topicRootId = _topic ? _topic->rootId() : 0;
auto result = Media::AddButton( auto result = Media::AddButton(
content, content,
_controller, _controller,
_peer, _peer,
_topic ? _topic->rootId() : 0, topicRootId,
_migrated, _migrated,
type, type,
tracker); tracker);
if (const auto window = _controller->parentController(); !_topic) { if (const auto window = _controller->parentController()) {
AddContextMenu(result, window, _peer, type); AddContextMenu(result, window, _peer, topicRootId, type);
} }
object_ptr<Profile::FloatingIcon>( object_ptr<Profile::FloatingIcon>(
result, result,

View file

@ -44,11 +44,12 @@ SeparateId::SeparateId(not_null<PeerData*> peer)
: SeparateId(SeparateType::Chat, peer->owner().history(peer)) { : SeparateId(SeparateType::Chat, peer->owner().history(peer)) {
} }
SeparateId::SeparateId(SeparateSharedMediaType type, not_null<PeerData*> peer) SeparateId::SeparateId(SeparateSharedMedia data)
: type(SeparateType::SharedMedia) : type(SeparateType::SharedMedia)
, sharedMedia(type) , sharedMedia(data.type)
, account(&peer->session().account()) , account(&data.peer->session().account())
, sharedMediaLocalPeer(peer) { , sharedMediaDataPeer(data.peer)
, sharedMediaDataTopicRootId(data.topicRootId) {
} }
bool SeparateId::primary() const { bool SeparateId::primary() const {
@ -83,8 +84,14 @@ bool SeparateId::hasChatsList() const {
PeerData *SeparateId::sharedMediaPeer() const { PeerData *SeparateId::sharedMediaPeer() const {
return (type == SeparateType::SharedMedia) return (type == SeparateType::SharedMedia)
? sharedMediaLocalPeer ? sharedMediaDataPeer
: nullptr; : nullptr;
} }
MsgId SeparateId::sharedMediaTopicRootId() const {
return (type == SeparateType::SharedMedia)
? sharedMediaDataTopicRootId
: MsgId();
}
} // namespace Window } // namespace Window

View file

@ -43,6 +43,12 @@ enum class SeparateSharedMediaType {
GIF, GIF,
}; };
struct SeparateSharedMedia {
SeparateSharedMediaType type = SeparateSharedMediaType::None;
not_null<PeerData*> peer;
MsgId topicRootId = MsgId();
};
struct SeparateId { struct SeparateId {
SeparateId(std::nullptr_t); SeparateId(std::nullptr_t);
SeparateId(not_null<Main::Account*> account); SeparateId(not_null<Main::Account*> account);
@ -50,13 +56,14 @@ struct SeparateId {
SeparateId(SeparateType type, not_null<Data::Thread*> thread); SeparateId(SeparateType type, not_null<Data::Thread*> thread);
SeparateId(not_null<Data::Thread*> thread); SeparateId(not_null<Data::Thread*> thread);
SeparateId(not_null<PeerData*> peer); SeparateId(not_null<PeerData*> peer);
SeparateId(SeparateSharedMediaType type, not_null<PeerData*> peer); SeparateId(SeparateSharedMedia data);
SeparateType type = SeparateType::Primary; SeparateType type = SeparateType::Primary;
SeparateSharedMediaType sharedMedia = SeparateSharedMediaType::None; SeparateSharedMediaType sharedMedia = SeparateSharedMediaType::None;
Main::Account *account = nullptr; Main::Account *account = nullptr;
Data::Thread *thread = nullptr; // For types except Main and Archive. Data::Thread *thread = nullptr; // For types except Main and Archive.
PeerData *sharedMediaLocalPeer = nullptr; PeerData *sharedMediaDataPeer = nullptr;
MsgId sharedMediaDataTopicRootId = MsgId();
[[nodiscard]] bool valid() const { [[nodiscard]] bool valid() const {
return account != nullptr; return account != nullptr;
@ -71,6 +78,7 @@ struct SeparateId {
[[nodiscard]] Data::Folder *folder() const; [[nodiscard]] Data::Folder *folder() const;
[[nodiscard]] Data::SavedSublist *sublist() const; [[nodiscard]] Data::SavedSublist *sublist() const;
[[nodiscard]] PeerData *sharedMediaPeer() const; [[nodiscard]] PeerData *sharedMediaPeer() const;
[[nodiscard]] MsgId sharedMediaTopicRootId() const;
[[nodiscard]] bool hasChatsList() const; [[nodiscard]] bool hasChatsList() const;

View file

@ -1207,8 +1207,18 @@ void SessionNavigation::showByInitialId(
: (id.sharedMedia == SeparateSharedMediaType::GIF) : (id.sharedMedia == SeparateSharedMediaType::GIF)
? Storage::SharedMediaType::GIF ? Storage::SharedMediaType::GIF
: Storage::SharedMediaType::Photo; : 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( showSection(
std::make_shared<Info::Memento>(id.sharedMediaPeer(), type), topicRootId
? std::make_shared<Info::Memento>(topic, type)
: std::make_shared<Info::Memento>(peer, type),
instant); instant);
parent->widget()->setMaximumWidth(st::maxWidthSharedMediaWindow); parent->widget()->setMaximumWidth(st::maxWidthSharedMediaWindow);
break; break;