diff --git a/Telegram/Resources/icons/limits/accounts.png b/Telegram/Resources/icons/limits/accounts.png new file mode 100644 index 000000000..84205fe9b Binary files /dev/null and b/Telegram/Resources/icons/limits/accounts.png differ diff --git a/Telegram/Resources/icons/limits/accounts@2x.png b/Telegram/Resources/icons/limits/accounts@2x.png new file mode 100644 index 000000000..7b5dc5206 Binary files /dev/null and b/Telegram/Resources/icons/limits/accounts@2x.png differ diff --git a/Telegram/Resources/icons/limits/accounts@3x.png b/Telegram/Resources/icons/limits/accounts@3x.png new file mode 100644 index 000000000..43210dd1c Binary files /dev/null and b/Telegram/Resources/icons/limits/accounts@3x.png differ diff --git a/Telegram/SourceFiles/boxes/boxes.style b/Telegram/SourceFiles/boxes/boxes.style index 5470a25cb..5a1b70ae2 100644 --- a/Telegram/SourceFiles/boxes/boxes.style +++ b/Telegram/SourceFiles/boxes/boxes.style @@ -1096,6 +1096,7 @@ premiumIconFolders: icon {{ "limits/folders", settingsIconFg }}; premiumIconGroups: icon {{ "limits/groups", settingsIconFg }}; premiumIconLinks: icon {{ "limits/links", settingsIconFg }}; premiumIconPins: icon {{ "limits/pins", settingsIconFg }}; +premiumIconAccounts: icon {{ "limits/accounts", settingsIconFg }}; premiumAccountsCheckbox: RoundImageCheckbox(defaultPeerListCheckbox) { imageRadius: 27px; diff --git a/Telegram/SourceFiles/boxes/premium_limits_box.cpp b/Telegram/SourceFiles/boxes/premium_limits_box.cpp index 9b529ee1d..bbbd7f43b 100644 --- a/Telegram/SourceFiles/boxes/premium_limits_box.cpp +++ b/Telegram/SourceFiles/boxes/premium_limits_box.cpp @@ -26,6 +26,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_session.h" #include "lang/lang_keys.h" #include "settings/settings_common.h" +#include "settings/settings_information.h" // Settings::OrderedAccounts(). #include "settings/settings_premium.h" #include "base/unixtime.h" #include "apiwrap.h" @@ -888,7 +889,7 @@ void AccountsLimitBox( const auto defaultLimit = Main::Domain::kMaxAccounts; const auto premiumLimit = Main::Domain::kPremiumMaxAccounts; - const auto &accounts = session->domain().accounts(); + const auto accounts = Settings::OrderedAccounts(); const auto current = int(accounts.size()); auto text = tr::lng_accounts_limit1( @@ -909,7 +910,7 @@ void AccountsLimitBox( current, (current == premiumLimit) ? premiumLimit : (current * 2), std::nullopt, - &st::premiumIconFiles); + &st::premiumIconAccounts); Settings::AddSkip(top, st::premiumLineTextSkip); Ui::Premium::AddLimitRow(top, 0, std::nullopt, defaultLimit); Settings::AddSkip(top, st::premiumInfographicPadding.bottom()); @@ -935,9 +936,8 @@ void AccountsLimitBox( box->addButton(tr::lng_continue(), [=]() mutable { const auto ref = QString(); - const auto &accounts = session->domain().accounts(); const auto wasAccount = &session->account(); - const auto nowAccount = accounts[group->value()].account.get(); + const auto nowAccount = accounts[group->value()]; if (wasAccount == nowAccount) { Settings::ShowPremium(session, ref); return; @@ -967,9 +967,8 @@ void AccountsLimitBox( auto &&entries = ranges::views::all( accounts - ) | ranges::views::transform([&]( - const Main::Domain::AccountWithIndex &d) { - const auto user = d.account->session().user(); + ) | ranges::views::transform([&](not_null account) { + const auto user = account->session().user(); return Args::Entry{ user->name, PaintUserpicCallback(user, false) }; }); diff --git a/Telegram/SourceFiles/settings/settings_information.cpp b/Telegram/SourceFiles/settings/settings_information.cpp index 7820b7029..a878f05e8 100644 --- a/Telegram/SourceFiles/settings/settings_information.cpp +++ b/Telegram/SourceFiles/settings/settings_information.cpp @@ -619,29 +619,6 @@ void SetupAccountsWrap( return result; } -[[nodiscard]] std::vector> OrderedAccounts() { - using namespace Main; - - const auto order = Core::App().settings().accountsOrder(); - auto accounts = ranges::views::all( - Core::App().domain().accounts() - ) | ranges::views::transform([](const Domain::AccountWithIndex &a) { - return not_null{ a.account.get() }; - }) | ranges::to_vector; - ranges::stable_sort(accounts, [&]( - not_null a, - not_null b) { - const auto aIt = a->sessionExists() - ? ranges::find(order, a->session().uniqueId()) - : end(order); - const auto bIt = b->sessionExists() - ? ranges::find(order, b->session().uniqueId()) - : end(order); - return aIt < bIt; - }); - return accounts; -} - AccountsList::AccountsList( not_null container, not_null controller) @@ -853,6 +830,29 @@ AccountsEvents SetupAccounts( }; } +std::vector> OrderedAccounts() { + using namespace Main; + + const auto order = Core::App().settings().accountsOrder(); + auto accounts = ranges::views::all( + Core::App().domain().accounts() + ) | ranges::views::transform([](const Domain::AccountWithIndex &a) { + return not_null{ a.account.get() }; + }) | ranges::to_vector; + ranges::stable_sort(accounts, [&]( + not_null a, + not_null b) { + const auto aIt = a->sessionExists() + ? ranges::find(order, a->session().uniqueId()) + : end(order); + const auto bIt = b->sessionExists() + ? ranges::find(order, b->session().uniqueId()) + : end(order); + return aIt < bIt; + }); + return accounts; +} + Dialogs::Ui::UnreadBadgeStyle BadgeStyle() { auto result = Dialogs::Ui::UnreadBadgeStyle(); result.font = st::mainMenuBadgeFont; diff --git a/Telegram/SourceFiles/settings/settings_information.h b/Telegram/SourceFiles/settings/settings_information.h index fea72a8de..39f4de08a 100644 --- a/Telegram/SourceFiles/settings/settings_information.h +++ b/Telegram/SourceFiles/settings/settings_information.h @@ -13,6 +13,10 @@ namespace Dialogs::Ui { struct UnreadBadgeStyle; } // namespace Dialogs::Ui +namespace Main { +class Account; +} // namespace Main + namespace Settings { class Information : public Section { @@ -35,6 +39,7 @@ AccountsEvents SetupAccounts( not_null container, not_null controller); +[[nodiscard]] std::vector> OrderedAccounts(); [[nodiscard]] Dialogs::Ui::UnreadBadgeStyle BadgeStyle(); struct UnreadBadge { diff --git a/Telegram/SourceFiles/ui/effects/premium_graphics.cpp b/Telegram/SourceFiles/ui/effects/premium_graphics.cpp index 967fac26c..33f3b8294 100644 --- a/Telegram/SourceFiles/ui/effects/premium_graphics.cpp +++ b/Telegram/SourceFiles/ui/effects/premium_graphics.cpp @@ -683,7 +683,7 @@ void AddAccountsRow( const auto width = widget->width(); const auto photoLeft = (width - (imageRadius * 2)) / 2; const auto photoTop = checkSelectWidth; - auto &account = state->accounts[index]; + const auto &account = state->accounts[index]; account.checkbox.paint(p, photoLeft, photoTop, width); const auto &badgeSize = account.badge.size() @@ -719,10 +719,18 @@ void AddAccountsRow( const auto count = state->accounts.size(); const auto columnWidth = size.width() / count; for (auto i = 0; i < count; i++) { - state->accounts[i].widget->resize(columnWidth, size.height()); + auto &account = state->accounts[i]; + account.widget->resize(columnWidth, size.height()); const auto left = columnWidth * i; - state->accounts[i].widget->moveToLeft(left, 0); - state->accounts[i].badge = cacheBadge(left + columnWidth / 2); + account.widget->moveToLeft(left, 0); + account.badge = cacheBadge(left + columnWidth / 2); + + const auto photoWidth = ((imageRadius + checkSelectWidth) * 2); + account.checkbox.setColorOverride(QBrush( + ComputeGradient( + container, + left + (columnWidth - photoWidth) / 2, + photoWidth))); } }, container->lifetime()); } diff --git a/Telegram/SourceFiles/ui/effects/round_checkbox.cpp b/Telegram/SourceFiles/ui/effects/round_checkbox.cpp index bab09d8d6..3ab51c436 100644 --- a/Telegram/SourceFiles/ui/effects/round_checkbox.cpp +++ b/Telegram/SourceFiles/ui/effects/round_checkbox.cpp @@ -258,7 +258,7 @@ RoundCheckbox::RoundCheckbox(const style::RoundCheckbox &st, Fn updateCa , _updateCallback(updateCallback) { } -void RoundCheckbox::paint(Painter &p, int x, int y, int outerWidth, float64 masterScale) { +void RoundCheckbox::paint(Painter &p, int x, int y, int outerWidth, float64 masterScale) const { if (!_st.size || (!_checkedProgress.animating() && !_checked @@ -361,7 +361,7 @@ RoundImageCheckbox::RoundImageCheckbox(const style::RoundImageCheckbox &st, Fnp; - pen.setWidth(_st.selectWidth); + const auto pen = QPen( + _fgOverride ? (*_fgOverride) : _st.selectFg->b, + _st.selectWidth); p.setPen(pen); p.drawEllipse(style::rtlrect(x, y, _st.imageRadius * 2, _st.imageRadius * 2, outerWidth)); p.setOpacity(1.); @@ -416,7 +414,21 @@ void RoundImageCheckbox::setChecked(bool newChecked, anim::type animated) { } if (animated == anim::type::normal) { prepareWideCache(); - _selection.start(_updateCallback, checked() ? 0 : 1, checked() ? 1 : 0, _st.selectDuration, anim::bumpy(1.25)); + const auto from = checked() ? 0. : 1.; + const auto to = checked() ? 1. : 0.; + _selection.start( + [=](float64 value) { + if (_updateCallback) { + _updateCallback(); + } + if (value == to) { + _wideCache = QPixmap(); + } + }, + from, + to, + _st.selectDuration, + anim::bumpy(1.25)); } else { _selection.stop(); } @@ -439,4 +451,8 @@ void RoundImageCheckbox::prepareWideCache() { } } +void RoundImageCheckbox::setColorOverride(std::optional fg) { + _fgOverride = fg; +} + } // namespace Ui diff --git a/Telegram/SourceFiles/ui/effects/round_checkbox.h b/Telegram/SourceFiles/ui/effects/round_checkbox.h index ec74fc506..30008581d 100644 --- a/Telegram/SourceFiles/ui/effects/round_checkbox.h +++ b/Telegram/SourceFiles/ui/effects/round_checkbox.h @@ -16,7 +16,7 @@ class RoundCheckbox { public: RoundCheckbox(const style::RoundCheckbox &st, Fn updateCallback); - void paint(Painter &p, int x, int y, int outerWidth, float64 masterScale = 1.); + void paint(Painter &p, int x, int y, int outerWidth, float64 masterScale = 1.) const; void setDisplayInactive(bool displayInactive); bool checked() const { @@ -47,9 +47,11 @@ public: using PaintRoundImage = Fn; RoundImageCheckbox(const style::RoundImageCheckbox &st, Fn updateCallback, PaintRoundImage &&paintRoundImage); - void paint(Painter &p, int x, int y, int outerWidth); + void paint(Painter &p, int x, int y, int outerWidth) const; float64 checkedAnimationRatio() const; + void setColorOverride(std::optional fg); + bool checked() const { return _check.checked(); } @@ -73,6 +75,8 @@ private: RoundCheckbox _check; + std::optional _fgOverride; + }; } // namespace Ui