| 87 | } |
| 88 | |
| 89 | [[nodiscard]] SwitchAccountResult AddAccountsMenu( |
| 90 | not_null<Ui::RpWidget*> parent, |
| 91 | UserId userIdHint = UserId()) { |
| 92 | const auto session = &Core::App().domain().active().session(); |
| 93 | const auto widget = Ui::CreateChild<SwitchableUserpicButton>( |
| 94 | parent, |
| 95 | st::restoreUserpicIcon.photoSize + st::lineWidth * 8); |
| 96 | struct State { |
| 97 | base::unique_qptr<Ui::PopupMenu> menu; |
| 98 | UserData *currentUser = nullptr; |
| 99 | Fn<void()> onUserChanged; |
| 100 | }; |
| 101 | const auto state = widget->lifetime().make_state<State>(); |
| 102 | |
| 103 | const auto isCurrentTest = session->isTestMode(); |
| 104 | const auto findHintedUser = [&]() -> UserData* { |
| 105 | if (!userIdHint) { |
| 106 | return session->user().get(); |
| 107 | } |
| 108 | for (const auto &account : Core::App().domain().orderedAccounts()) { |
| 109 | if (!account->sessionExists() |
| 110 | || (account->session().isTestMode() != isCurrentTest)) { |
| 111 | continue; |
| 112 | } |
| 113 | if (account->session().userId() == userIdHint) { |
| 114 | return account->session().user(); |
| 115 | } |
| 116 | } |
| 117 | return session->user().get(); |
| 118 | }; |
| 119 | |
| 120 | state->currentUser = findHintedUser(); |
| 121 | const auto userpic = Ui::CreateChild<Ui::UserpicButton>( |
| 122 | parent, |
| 123 | state->currentUser, |
| 124 | st::restoreUserpicIcon); |
| 125 | widget->setUserpic(userpic); |
| 126 | const auto filtered = [=] { |
| 127 | auto result = std::vector<not_null<Main::Session*>>(); |
| 128 | for (const auto &account : Core::App().domain().orderedAccounts()) { |
| 129 | if (!account->sessionExists() |
| 130 | || (account->session().user() == state->currentUser) |
| 131 | || (account->session().isTestMode() != isCurrentTest)) { |
| 132 | continue; |
| 133 | } |
| 134 | result.push_back(&account->session()); |
| 135 | } |
| 136 | return result; |
| 137 | }; |
| 138 | const auto isSingle = filtered().empty(); |
| 139 | widget->setExpanded(!isSingle); |
| 140 | widget->setAttribute(Qt::WA_TransparentForMouseEvents, isSingle); |
| 141 | widget->setClickedCallback([=] { |
| 142 | const auto &st = st::popupMenuWithIcons; |
| 143 | state->menu = base::make_unique_q<Ui::PopupMenu>(widget, st); |
| 144 | for (const auto &anotherSession : filtered()) { |
| 145 | const auto user = anotherSession->user(); |
| 146 | const auto action = new QAction(user->name(), state->menu); |
no test coverage detected