mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +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(
|
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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue