mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-04-14 05:07:10 +02:00
Added ability to open single typed shared media in window for topics.
This commit is contained in:
parent
0089cad740
commit
7442ea7a16
4 changed files with 44 additions and 14 deletions
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue