diff --git a/Telegram/SourceFiles/main/main_domain.cpp b/Telegram/SourceFiles/main/main_domain.cpp index 2b539b1407..069b6df82e 100644 --- a/Telegram/SourceFiles/main/main_domain.cpp +++ b/Telegram/SourceFiles/main/main_domain.cpp @@ -22,6 +22,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "storage/localstorage.h" #include "export/export_settings.h" #include "window/notifications_manager.h" +#include "data/data_peer_values.h" // Data::AmPremiumValue. #include "facades.h" namespace Main { @@ -326,6 +327,12 @@ void Domain::watchSession(not_null account) { ) | rpl::start_with_next([=] { scheduleUpdateUnreadBadge(); }, session->lifetime()); + + Data::AmPremiumValue( + session + ) | rpl::start_with_next([=] { + _lastMaxAccounts = maxAccounts(); + }, session->lifetime()); }, account->lifetime()); account->sessionChanges( @@ -467,4 +474,8 @@ int Domain::maxAccounts() const { return isAnyPreimium ? kPremiumMaxAccounts : kMaxAccounts; } +rpl::producer Domain::maxAccountsChanges() const { + return _lastMaxAccounts.changes(); +} + } // namespace Main diff --git a/Telegram/SourceFiles/main/main_domain.h b/Telegram/SourceFiles/main/main_domain.h index 59f2c7d066..1c0a876bad 100644 --- a/Telegram/SourceFiles/main/main_domain.h +++ b/Telegram/SourceFiles/main/main_domain.h @@ -42,6 +42,7 @@ public: void finish(); [[nodiscard]] int maxAccounts() const; + [[nodiscard]] rpl::producer maxAccountsChanges() const; [[nodiscard]] Storage::Domain &local() const { return *_local; @@ -105,6 +106,8 @@ private: bool _unreadBadgeMuted = true; bool _unreadBadgeUpdateScheduled = false; + rpl::variable _lastMaxAccounts; + rpl::lifetime _activeLifetime; rpl::lifetime _lifetime; diff --git a/Telegram/SourceFiles/settings/settings_information.cpp b/Telegram/SourceFiles/settings/settings_information.cpp index f81c0d4164..625b41fcf5 100644 --- a/Telegram/SourceFiles/settings/settings_information.cpp +++ b/Telegram/SourceFiles/settings/settings_information.cpp @@ -485,7 +485,8 @@ void SetupAccountsWrap( QWidget *parent, not_null window, not_null account, - Fn callback) { + Fn callback, + bool locked) { const auto active = (account == &Core::App().activeAccount()); const auto session = &account->session(); const auto user = session->user(); @@ -568,7 +569,7 @@ void SetupAccountsWrap( return; } const auto addAction = Menu::CreateAddActionCallback(state->menu); - if (!state->menu && IsAltShift(raw->clickModifiers())) { + if (!state->menu && IsAltShift(raw->clickModifiers()) && !locked) { state->menu = base::make_unique_q( raw, st::popupMenuWithIcons); @@ -589,9 +590,11 @@ void SetupAccountsWrap( QGuiApplication::clipboard()->setText(phone.current().text); }, &st::menuIconCopy); - addAction(tr::lng_menu_activate(tr::now), [=] { - Core::App().domain().activate(&session->account()); - }, &st::menuIconProfile); + if (!locked) { + addAction(tr::lng_menu_activate(tr::now), [=] { + Core::App().domain().activate(&session->account()); + }, &st::menuIconProfile); + } auto logoutCallback = [=] { const auto callback = [=](Fn &&close) { @@ -657,13 +660,22 @@ void AccountsList::setup() { for (const auto &[index, account] : list) { if (_watched.emplace(account.get()).second) { account->sessionChanges( - ) | rpl::start_with_next([=](Main::Session *session) { + ) | rpl::start_with_next([=] { rebuild(); }, _outer->lifetime()); } } rebuild(); }, _outer->lifetime()); + + Core::App().domain().maxAccountsChanges( + ) | rpl::start_with_next([=] { + // Full rebuild. + for (auto i = _watched.begin(); i != _watched.end(); i++) { + i->second = nullptr; + } + rebuild(); + }, _outer->lifetime()); } @@ -749,6 +761,7 @@ void AccountsList::rebuild() { } }, inner->lifetime()); + const auto premiumLimit = _controller->session().domain().maxAccounts(); const auto list = _controller->session().domain().orderedAccounts(); for (const auto &account : list) { auto i = _watched.find(account); @@ -758,6 +771,7 @@ void AccountsList::rebuild() { if (!account->sessionExists() || list.size() == 1) { button = nullptr; } else if (!button) { + const auto nextIsLocked = (inner->count() >= premiumLimit); auto callback = [=] { if (_reordering) { return; @@ -781,13 +795,20 @@ void AccountsList::rebuild() { inner, _controller, account, - std::move(callback)))); + std::move(callback), + nextIsLocked))); } } inner->resizeToWidth(_outer->width()); + const auto count = int(list.size()); + + _reorder->addPinnedInterval( + premiumLimit, + std::max(1, count - premiumLimit)); + _addAccount->toggle( - (inner->count() < Main::Domain::kPremiumMaxAccounts), + (count < Main::Domain::kPremiumMaxAccounts), anim::type::instant); _reorder->start();