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(
not_null<Window::SessionController*> controller,
not_null<PeerData*> 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<Ui::AbstractButton*> button,
not_null<Window::SessionController*> controller,
not_null<Window::SessionController*> window,
not_null<PeerData*> 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<Ui::RpWidget> 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<Profile::FloatingIcon>(
result,

View file

@ -44,11 +44,12 @@ SeparateId::SeparateId(not_null<PeerData*> peer)
: SeparateId(SeparateType::Chat, peer->owner().history(peer)) {
}
SeparateId::SeparateId(SeparateSharedMediaType type, not_null<PeerData*> 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

View file

@ -43,6 +43,12 @@ enum class SeparateSharedMediaType {
GIF,
};
struct SeparateSharedMedia {
SeparateSharedMediaType type = SeparateSharedMediaType::None;
not_null<PeerData*> peer;
MsgId topicRootId = MsgId();
};
struct SeparateId {
SeparateId(std::nullptr_t);
SeparateId(not_null<Main::Account*> account);
@ -50,13 +56,14 @@ struct SeparateId {
SeparateId(SeparateType type, not_null<Data::Thread*> thread);
SeparateId(not_null<Data::Thread*> thread);
SeparateId(not_null<PeerData*> peer);
SeparateId(SeparateSharedMediaType type, not_null<PeerData*> 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;

View file

@ -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<Info::Memento>(id.sharedMediaPeer(), type),
topicRootId
? std::make_shared<Info::Memento>(topic, type)
: std::make_shared<Info::Memento>(peer, type),
instant);
parent->widget()->setMaximumWidth(st::maxWidthSharedMediaWindow);
break;