diff --git a/Telegram/SourceFiles/main/main_domain.cpp b/Telegram/SourceFiles/main/main_domain.cpp index fa58bb7953..20cb26c368 100644 --- a/Telegram/SourceFiles/main/main_domain.cpp +++ b/Telegram/SourceFiles/main/main_domain.cpp @@ -305,14 +305,24 @@ not_null Domain::add(MTP::Environment environment) { return account; } -void Domain::addActivated(MTP::Environment environment) { +void Domain::addActivated(MTP::Environment environment, bool newWindow) { + const auto added = [&](not_null account) { + if (newWindow) { + Core::App().ensureSeparateWindowForAccount(account); + } else if (const auto window = Core::App().separateWindowForAccount( + account)) { + window->activate(); + } else { + activate(account); + } + }; if (accounts().size() < maxAccounts()) { - activate(add(environment)); + added(add(environment)); } else { for (auto &[index, account] : accounts()) { if (!account->sessionExists() && account->mtp().environment() == environment) { - activate(account.get()); + added(account.get()); break; } } diff --git a/Telegram/SourceFiles/main/main_domain.h b/Telegram/SourceFiles/main/main_domain.h index 62933e4fa0..f1f93b624d 100644 --- a/Telegram/SourceFiles/main/main_domain.h +++ b/Telegram/SourceFiles/main/main_domain.h @@ -70,7 +70,7 @@ public: [[nodiscard]] not_null add(MTP::Environment environment); void maybeActivate(not_null account); void activate(not_null account); - void addActivated(MTP::Environment environment); + void addActivated(MTP::Environment environment, bool newWindow = false); // Interface for Storage::Domain. void accountAddedInStorage(AccountWithIndex accountWithIndex); diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 07d9ae42ec..7f83c7b7ce 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -1294,7 +1294,7 @@ bool MainWidget::showHistoryInDifferentWindow( return true; } -void MainWidget::showPeerHistory( +void MainWidget::showHistory( PeerId peerId, const SectionShow ¶ms, MsgId showAtMsgId) { @@ -1311,6 +1311,7 @@ void MainWidget::showPeerHistory( Assert(isPrimary()); if (params.activation != anim::activation::background) { _controller->show(Ui::MakeInformBox(unavailable)); + _controller->window().activate(); } return; } @@ -1324,9 +1325,13 @@ void MainWidget::showPeerHistory( return; } + if (peerId && params.activation != anim::activation::background) { + _controller->window().activate(); + } + if (!(_history->peer() && _history->peer()->id == peerId) && preventsCloseSection( - [=] { showPeerHistory(peerId, params, showAtMsgId); }, + [=] { showHistory(peerId, params, showAtMsgId); }, params)) { return; } @@ -1490,7 +1495,7 @@ void MainWidget::showMessage( return; } } else if (_history->peer() == item->history()->peer) { - showPeerHistory(peerId, params, itemId); + showHistory(peerId, params, itemId); return; } } diff --git a/Telegram/SourceFiles/mainwidget.h b/Telegram/SourceFiles/mainwidget.h index c2a2bc2048..2dd9f3aa28 100644 --- a/Telegram/SourceFiles/mainwidget.h +++ b/Telegram/SourceFiles/mainwidget.h @@ -220,7 +220,7 @@ public: void toggleChooseChatTheme(not_null peer); - void showPeerHistory( + void showHistory( PeerId peer, const SectionShow ¶ms, MsgId msgId); diff --git a/Telegram/SourceFiles/settings/settings_information.cpp b/Telegram/SourceFiles/settings/settings_information.cpp index 957c3b0697..1b0d0febb1 100644 --- a/Telegram/SourceFiles/settings/settings_information.cpp +++ b/Telegram/SourceFiles/settings/settings_information.cpp @@ -778,23 +778,38 @@ not_null*> AccountsList::setupAdd() { })))->setDuration(0); const auto button = result->entity(); - const auto add = [=](MTP::Environment environment) { - Core::App().preventOrInvoke([=] { - auto &domain = _controller->session().domain(); - if (domain.accounts().size() >= domain.maxAccounts()) { - _controller->show( - Box(AccountsLimitBox, &_controller->session())); - } else { - domain.addActivated(environment); + using Environment = MTP::Environment; + const auto add = [=](Environment environment, bool newWindow = false) { + auto &domain = _controller->session().domain(); + auto found = false; + for (const auto &[index, account] : domain.accounts()) { + const auto raw = account.get(); + if (!raw->sessionExists() + && raw->mtp().environment() == environment) { + found = true; } - }); + } + if (!found && domain.accounts().size() >= domain.maxAccounts()) { + _controller->show( + Box(AccountsLimitBox, &_controller->session())); + } else if (newWindow) { + domain.addActivated(environment, true); + } else { + _controller->window().preventOrInvoke([=] { + _controller->session().domain().addActivated(environment); + }); + } }; button->setAcceptBoth(true); button->clicks( ) | rpl::start_with_next([=](Qt::MouseButton which) { if (which == Qt::LeftButton) { - add(MTP::Environment::Production); + const auto modifiers = button->clickModifiers(); + const auto newWindow = (modifiers & Qt::ControlModifier) + && base::options::lookup( + Dialogs::kOptionCtrlClickChatNewWindow).value(); + add(Environment::Production, newWindow); return; } else if (which != Qt::RightButton || !IsAltShift(button->clickModifiers())) { @@ -802,10 +817,10 @@ not_null*> AccountsList::setupAdd() { } _contextMenu = base::make_unique_q(_outer); _contextMenu->addAction("Production Server", [=] { - add(MTP::Environment::Production); + add(Environment::Production); }); _contextMenu->addAction("Test Server", [=] { - add(MTP::Environment::Test); + add(Environment::Test); }); _contextMenu->popup(QCursor::pos()); }, button->lifetime()); diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index 98c935fbcb..3c44d67518 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -1689,10 +1689,7 @@ void SessionController::showPeerHistory( PeerId peerId, const SectionShow ¶ms, MsgId msgId) { - content()->showPeerHistory(peerId, params, msgId); - if (peerId && params.activation != anim::activation::background) { - _window->activate(); - } + content()->showHistory(peerId, params, msgId); } void SessionController::showMessage(