Added ability to invoke callback for non-primary window controllers.

This commit is contained in:
23rd 2022-06-10 13:59:19 +03:00
parent f78b9324dc
commit 6ca167679d
5 changed files with 26 additions and 12 deletions

View file

@ -194,7 +194,8 @@ bool Widget::floatPlayerIsVisible(not_null<HistoryItem*> item) {
void Widget::floatPlayerDoubleClickEvent(not_null<const HistoryItem*> item) { void Widget::floatPlayerDoubleClickEvent(not_null<const HistoryItem*> item) {
getData()->controller->invokeForSessionController( getData()->controller->invokeForSessionController(
&item->history()->peer->session().account(), &item->history()->peer->session().account(),
[=](not_null<Window::SessionController*> controller) { item->history()->peer,
[&](not_null<Window::SessionController*> controller) {
controller->showPeerHistoryAtItem(item); controller->showPeerHistoryAtItem(item);
}); });
} }

View file

@ -4735,16 +4735,17 @@ Window::SessionController *OverlayWidget::findWindow(bool switchTo) const {
} }
} }
const auto &active = _session->windows(); if (switchTo) {
if (!active.empty()) { auto controllerPtr = (Window::SessionController*)nullptr;
return active.front(); const auto anyWindow = window ? window : Core::App().primaryWindow();
} else if (window && switchTo) { if (anyWindow) {
Window::SessionController *controllerPtr = nullptr; anyWindow->invokeForSessionController(
window->invokeForSessionController( &_session->account(),
&_session->account(), _history ? _history->peer : nullptr,
[&](not_null<Window::SessionController*> newController) { [&](not_null<Window::SessionController*> newController) {
controllerPtr = newController; controllerPtr = newController;
}); });
}
return controllerPtr; return controllerPtr;
} }

View file

@ -383,7 +383,17 @@ void Controller::preventOrInvoke(Fn<void()> &&callback) {
void Controller::invokeForSessionController( void Controller::invokeForSessionController(
not_null<Main::Account*> account, not_null<Main::Account*> account,
PeerData *singlePeer,
Fn<void(not_null<SessionController*>)> &&callback) { Fn<void(not_null<SessionController*>)> &&callback) {
const auto separateWindow = singlePeer
? Core::App().separateWindowForPeer(singlePeer)
: nullptr;
const auto separateSession = separateWindow
? separateWindow->sessionController()
: nullptr;
if (separateSession) {
return callback(separateSession);
}
_account->domain().activate(std::move(account)); _account->domain().activate(std::move(account));
if (_sessionController) { if (_sessionController) {
callback(_sessionController.get()); callback(_sessionController.get());

View file

@ -98,6 +98,7 @@ public:
void invokeForSessionController( void invokeForSessionController(
not_null<Main::Account*> account, not_null<Main::Account*> account,
PeerData *singlePeer,
Fn<void(not_null<SessionController*>)> &&callback); Fn<void(not_null<SessionController*>)> &&callback);
void openInMediaView(Media::View::OpenRequest &&request); void openInMediaView(Media::View::OpenRequest &&request);

View file

@ -1466,7 +1466,8 @@ void SessionController::showPeerHistoryAtItem(
not_null<const HistoryItem*> item) { not_null<const HistoryItem*> item) {
_window->invokeForSessionController( _window->invokeForSessionController(
&item->history()->peer->session().account(), &item->history()->peer->session().account(),
[=](not_null<SessionController*> controller) { item->history()->peer,
[&](not_null<SessionController*> controller) {
if (item->isScheduled()) { if (item->isScheduled()) {
controller->showSection( controller->showSection(
std::make_shared<HistoryView::ScheduledMemento>( std::make_shared<HistoryView::ScheduledMemento>(