Moved opening peer from PeerClickHandler to SessionController.

This commit is contained in:
23rd 2021-10-07 19:16:42 +03:00
parent 51b259fdea
commit d8fb5be9b5
4 changed files with 47 additions and 28 deletions

View file

@ -29,7 +29,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "main/main_app_config.h"
#include "mtproto/mtproto_config.h"
#include "core/application.h"
#include "mainwindow.h"
#include "core/click_handler_types.h"
#include "window/window_session_controller.h"
#include "ui/image/image.h"
#include "ui/empty_userpic.h"
@ -42,7 +42,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "storage/file_download.h"
#include "storage/storage_facade.h"
#include "storage/storage_shared_media.h"
#include "facades.h" // Ui::showPeerProfile
namespace {
@ -168,33 +167,22 @@ void PeerClickHandler::onClick(ClickContext context) const {
if (context.button != Qt::LeftButton) {
return;
}
const auto &windows = _peer->session().windows();
if (windows.empty()) {
Core::App().domain().activate(&_peer->session().account());
const auto my = context.other.value<ClickHandlerContext>();
const auto window = [&]() -> Window::SessionController* {
if (const auto controller = my.sessionWindow.get()) {
return controller;
}
const auto &windows = _peer->session().windows();
if (windows.empty()) {
return;
_peer->session().domain().activate(&_peer->session().account());
if (windows.empty()) {
return nullptr;
}
}
}
const auto window = windows.front();
const auto currentPeer = window->activeChatCurrent().peer();
if (_peer && _peer->isChannel() && currentPeer != _peer) {
const auto clickedChannel = _peer->asChannel();
if (!clickedChannel->isPublic()
&& !clickedChannel->amIn()
&& (!currentPeer->isChannel()
|| currentPeer->asChannel()->linkedChat() != clickedChannel)) {
Ui::ShowMultilineToast({
.text = { _peer->isMegagroup()
? tr::lng_group_not_accessible(tr::now)
: tr::lng_channel_not_accessible(tr::now) },
});
} else {
window->showPeerHistory(
_peer,
Window::SectionShow::Way::Forward);
}
} else {
Ui::showPeerProfile(_peer);
return windows.front();
}();
if (window) {
window->showPeer(_peer);
}
}

View file

@ -57,7 +57,12 @@ struct ViewButton::Inner {
ViewButton::Inner::Inner(not_null<PeerData*> peer, Fn<void()> updateCallback)
: margins(st::historyViewButtonMargins)
, link(peer->openLink())
, link(std::make_shared<LambdaClickHandler>([=](ClickContext context) {
const auto my = context.other.value<ClickHandlerContext>();
if (const auto controller = my.sessionWindow.get()) {
controller->showPeer(peer);
}
}))
, updateCallback(std::move(updateCallback))
, text(st::historyViewButtonTextStyle, PeerToPhrase(peer)) {
}

View file

@ -1074,6 +1074,30 @@ void SessionController::closeThirdSection() {
}
}
void SessionController::showPeer(not_null<PeerData*> peer, MsgId msgId) {
const auto currentPeer = activeChatCurrent().peer();
if (peer && peer->isChannel() && currentPeer != peer) {
const auto clickedChannel = peer->asChannel();
if (!clickedChannel->isPublic()
&& !clickedChannel->amIn()
&& (!currentPeer->isChannel()
|| currentPeer->asChannel()->linkedChat()
!= clickedChannel)) {
Ui::ShowMultilineToast({
.text = {
.text = peer->isMegagroup()
? tr::lng_group_not_accessible(tr::now)
: tr::lng_channel_not_accessible(tr::now)
},
});
} else {
showPeerHistory(peer->id, SectionShow(), msgId);
}
} else {
showPeerInfo(peer, SectionShow());
}
}
void SessionController::startOrJoinGroupCall(
not_null<PeerData*> peer,
QString joinHash,

View file

@ -322,6 +322,8 @@ public:
void resizeForThirdSection();
void closeThirdSection();
void showPeer(not_null<PeerData*> peer, MsgId msgId = ShowAtUnreadMsgId);
enum class GroupCallJoinConfirm {
None,
IfNowInAnother,