mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 22:54:01 +02:00
Slightly improved style of box for premium accounts limits.
Added an icon for the info bubble. Added a gradient color to selected account. Respected an order of accounts from settings.
This commit is contained in:
parent
c138c74ab3
commit
9e4d47dcc0
10 changed files with 77 additions and 44 deletions
BIN
Telegram/Resources/icons/limits/accounts.png
Normal file
BIN
Telegram/Resources/icons/limits/accounts.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 663 B |
BIN
Telegram/Resources/icons/limits/accounts@2x.png
Normal file
BIN
Telegram/Resources/icons/limits/accounts@2x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
BIN
Telegram/Resources/icons/limits/accounts@3x.png
Normal file
BIN
Telegram/Resources/icons/limits/accounts@3x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
|
@ -1096,6 +1096,7 @@ premiumIconFolders: icon {{ "limits/folders", settingsIconFg }};
|
||||||
premiumIconGroups: icon {{ "limits/groups", settingsIconFg }};
|
premiumIconGroups: icon {{ "limits/groups", settingsIconFg }};
|
||||||
premiumIconLinks: icon {{ "limits/links", settingsIconFg }};
|
premiumIconLinks: icon {{ "limits/links", settingsIconFg }};
|
||||||
premiumIconPins: icon {{ "limits/pins", settingsIconFg }};
|
premiumIconPins: icon {{ "limits/pins", settingsIconFg }};
|
||||||
|
premiumIconAccounts: icon {{ "limits/accounts", settingsIconFg }};
|
||||||
|
|
||||||
premiumAccountsCheckbox: RoundImageCheckbox(defaultPeerListCheckbox) {
|
premiumAccountsCheckbox: RoundImageCheckbox(defaultPeerListCheckbox) {
|
||||||
imageRadius: 27px;
|
imageRadius: 27px;
|
||||||
|
|
|
@ -26,6 +26,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "data/data_session.h"
|
#include "data/data_session.h"
|
||||||
#include "lang/lang_keys.h"
|
#include "lang/lang_keys.h"
|
||||||
#include "settings/settings_common.h"
|
#include "settings/settings_common.h"
|
||||||
|
#include "settings/settings_information.h" // Settings::OrderedAccounts().
|
||||||
#include "settings/settings_premium.h"
|
#include "settings/settings_premium.h"
|
||||||
#include "base/unixtime.h"
|
#include "base/unixtime.h"
|
||||||
#include "apiwrap.h"
|
#include "apiwrap.h"
|
||||||
|
@ -888,7 +889,7 @@ void AccountsLimitBox(
|
||||||
const auto defaultLimit = Main::Domain::kMaxAccounts;
|
const auto defaultLimit = Main::Domain::kMaxAccounts;
|
||||||
const auto premiumLimit = Main::Domain::kPremiumMaxAccounts;
|
const auto premiumLimit = Main::Domain::kPremiumMaxAccounts;
|
||||||
|
|
||||||
const auto &accounts = session->domain().accounts();
|
const auto accounts = Settings::OrderedAccounts();
|
||||||
const auto current = int(accounts.size());
|
const auto current = int(accounts.size());
|
||||||
|
|
||||||
auto text = tr::lng_accounts_limit1(
|
auto text = tr::lng_accounts_limit1(
|
||||||
|
@ -909,7 +910,7 @@ void AccountsLimitBox(
|
||||||
current,
|
current,
|
||||||
(current == premiumLimit) ? premiumLimit : (current * 2),
|
(current == premiumLimit) ? premiumLimit : (current * 2),
|
||||||
std::nullopt,
|
std::nullopt,
|
||||||
&st::premiumIconFiles);
|
&st::premiumIconAccounts);
|
||||||
Settings::AddSkip(top, st::premiumLineTextSkip);
|
Settings::AddSkip(top, st::premiumLineTextSkip);
|
||||||
Ui::Premium::AddLimitRow(top, 0, std::nullopt, defaultLimit);
|
Ui::Premium::AddLimitRow(top, 0, std::nullopt, defaultLimit);
|
||||||
Settings::AddSkip(top, st::premiumInfographicPadding.bottom());
|
Settings::AddSkip(top, st::premiumInfographicPadding.bottom());
|
||||||
|
@ -935,9 +936,8 @@ void AccountsLimitBox(
|
||||||
box->addButton(tr::lng_continue(), [=]() mutable {
|
box->addButton(tr::lng_continue(), [=]() mutable {
|
||||||
const auto ref = QString();
|
const auto ref = QString();
|
||||||
|
|
||||||
const auto &accounts = session->domain().accounts();
|
|
||||||
const auto wasAccount = &session->account();
|
const auto wasAccount = &session->account();
|
||||||
const auto nowAccount = accounts[group->value()].account.get();
|
const auto nowAccount = accounts[group->value()];
|
||||||
if (wasAccount == nowAccount) {
|
if (wasAccount == nowAccount) {
|
||||||
Settings::ShowPremium(session, ref);
|
Settings::ShowPremium(session, ref);
|
||||||
return;
|
return;
|
||||||
|
@ -967,9 +967,8 @@ void AccountsLimitBox(
|
||||||
|
|
||||||
auto &&entries = ranges::views::all(
|
auto &&entries = ranges::views::all(
|
||||||
accounts
|
accounts
|
||||||
) | ranges::views::transform([&](
|
) | ranges::views::transform([&](not_null<Main::Account*> account) {
|
||||||
const Main::Domain::AccountWithIndex &d) {
|
const auto user = account->session().user();
|
||||||
const auto user = d.account->session().user();
|
|
||||||
return Args::Entry{ user->name, PaintUserpicCallback(user, false) };
|
return Args::Entry{ user->name, PaintUserpicCallback(user, false) };
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -619,29 +619,6 @@ void SetupAccountsWrap(
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] std::vector<not_null<Main::Account*>> 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<Account*> a,
|
|
||||||
not_null<Account*> 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(
|
AccountsList::AccountsList(
|
||||||
not_null<Ui::VerticalLayout*> container,
|
not_null<Ui::VerticalLayout*> container,
|
||||||
not_null<Window::SessionController*> controller)
|
not_null<Window::SessionController*> controller)
|
||||||
|
@ -853,6 +830,29 @@ AccountsEvents SetupAccounts(
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<not_null<Main::Account*>> 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<Account*> a,
|
||||||
|
not_null<Account*> 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() {
|
Dialogs::Ui::UnreadBadgeStyle BadgeStyle() {
|
||||||
auto result = Dialogs::Ui::UnreadBadgeStyle();
|
auto result = Dialogs::Ui::UnreadBadgeStyle();
|
||||||
result.font = st::mainMenuBadgeFont;
|
result.font = st::mainMenuBadgeFont;
|
||||||
|
|
|
@ -13,6 +13,10 @@ namespace Dialogs::Ui {
|
||||||
struct UnreadBadgeStyle;
|
struct UnreadBadgeStyle;
|
||||||
} // namespace Dialogs::Ui
|
} // namespace Dialogs::Ui
|
||||||
|
|
||||||
|
namespace Main {
|
||||||
|
class Account;
|
||||||
|
} // namespace Main
|
||||||
|
|
||||||
namespace Settings {
|
namespace Settings {
|
||||||
|
|
||||||
class Information : public Section<Information> {
|
class Information : public Section<Information> {
|
||||||
|
@ -35,6 +39,7 @@ AccountsEvents SetupAccounts(
|
||||||
not_null<Ui::VerticalLayout*> container,
|
not_null<Ui::VerticalLayout*> container,
|
||||||
not_null<Window::SessionController*> controller);
|
not_null<Window::SessionController*> controller);
|
||||||
|
|
||||||
|
[[nodiscard]] std::vector<not_null<::Main::Account*>> OrderedAccounts();
|
||||||
[[nodiscard]] Dialogs::Ui::UnreadBadgeStyle BadgeStyle();
|
[[nodiscard]] Dialogs::Ui::UnreadBadgeStyle BadgeStyle();
|
||||||
|
|
||||||
struct UnreadBadge {
|
struct UnreadBadge {
|
||||||
|
|
|
@ -683,7 +683,7 @@ void AddAccountsRow(
|
||||||
const auto width = widget->width();
|
const auto width = widget->width();
|
||||||
const auto photoLeft = (width - (imageRadius * 2)) / 2;
|
const auto photoLeft = (width - (imageRadius * 2)) / 2;
|
||||||
const auto photoTop = checkSelectWidth;
|
const auto photoTop = checkSelectWidth;
|
||||||
auto &account = state->accounts[index];
|
const auto &account = state->accounts[index];
|
||||||
account.checkbox.paint(p, photoLeft, photoTop, width);
|
account.checkbox.paint(p, photoLeft, photoTop, width);
|
||||||
|
|
||||||
const auto &badgeSize = account.badge.size()
|
const auto &badgeSize = account.badge.size()
|
||||||
|
@ -719,10 +719,18 @@ void AddAccountsRow(
|
||||||
const auto count = state->accounts.size();
|
const auto count = state->accounts.size();
|
||||||
const auto columnWidth = size.width() / count;
|
const auto columnWidth = size.width() / count;
|
||||||
for (auto i = 0; i < count; i++) {
|
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;
|
const auto left = columnWidth * i;
|
||||||
state->accounts[i].widget->moveToLeft(left, 0);
|
account.widget->moveToLeft(left, 0);
|
||||||
state->accounts[i].badge = cacheBadge(left + columnWidth / 2);
|
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());
|
}, container->lifetime());
|
||||||
}
|
}
|
||||||
|
|
|
@ -258,7 +258,7 @@ RoundCheckbox::RoundCheckbox(const style::RoundCheckbox &st, Fn<void()> updateCa
|
||||||
, _updateCallback(updateCallback) {
|
, _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
|
if (!_st.size
|
||||||
|| (!_checkedProgress.animating()
|
|| (!_checkedProgress.animating()
|
||||||
&& !_checked
|
&& !_checked
|
||||||
|
@ -361,7 +361,7 @@ RoundImageCheckbox::RoundImageCheckbox(const style::RoundImageCheckbox &st, Fn<v
|
||||||
, _check(_st.check, _updateCallback) {
|
, _check(_st.check, _updateCallback) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void RoundImageCheckbox::paint(Painter &p, int x, int y, int outerWidth) {
|
void RoundImageCheckbox::paint(Painter &p, int x, int y, int outerWidth) const {
|
||||||
auto selectionLevel = _selection.value(checked() ? 1. : 0.);
|
auto selectionLevel = _selection.value(checked() ? 1. : 0.);
|
||||||
if (_selection.animating()) {
|
if (_selection.animating()) {
|
||||||
auto userpicRadius = qRound(kWideScale * (_st.imageRadius + (_st.imageSmallRadius - _st.imageRadius) * selectionLevel));
|
auto userpicRadius = qRound(kWideScale * (_st.imageRadius + (_st.imageSmallRadius - _st.imageRadius) * selectionLevel));
|
||||||
|
@ -374,9 +374,6 @@ void RoundImageCheckbox::paint(Painter &p, int x, int y, int outerWidth) {
|
||||||
PainterHighQualityEnabler hq(p);
|
PainterHighQualityEnabler hq(p);
|
||||||
p.drawPixmapLeft(to, outerWidth, _wideCache, from);
|
p.drawPixmapLeft(to, outerWidth, _wideCache, from);
|
||||||
} else {
|
} else {
|
||||||
if (!_wideCache.isNull()) {
|
|
||||||
_wideCache = QPixmap();
|
|
||||||
}
|
|
||||||
auto userpicRadius = checked() ? _st.imageSmallRadius : _st.imageRadius;
|
auto userpicRadius = checked() ? _st.imageSmallRadius : _st.imageRadius;
|
||||||
auto userpicShift = _st.imageRadius - userpicRadius;
|
auto userpicShift = _st.imageRadius - userpicRadius;
|
||||||
auto userpicLeft = x + userpicShift;
|
auto userpicLeft = x + userpicShift;
|
||||||
|
@ -388,8 +385,9 @@ void RoundImageCheckbox::paint(Painter &p, int x, int y, int outerWidth) {
|
||||||
PainterHighQualityEnabler hq(p);
|
PainterHighQualityEnabler hq(p);
|
||||||
p.setOpacity(std::clamp(selectionLevel, 0., 1.));
|
p.setOpacity(std::clamp(selectionLevel, 0., 1.));
|
||||||
p.setBrush(Qt::NoBrush);
|
p.setBrush(Qt::NoBrush);
|
||||||
auto pen = _st.selectFg->p;
|
const auto pen = QPen(
|
||||||
pen.setWidth(_st.selectWidth);
|
_fgOverride ? (*_fgOverride) : _st.selectFg->b,
|
||||||
|
_st.selectWidth);
|
||||||
p.setPen(pen);
|
p.setPen(pen);
|
||||||
p.drawEllipse(style::rtlrect(x, y, _st.imageRadius * 2, _st.imageRadius * 2, outerWidth));
|
p.drawEllipse(style::rtlrect(x, y, _st.imageRadius * 2, _st.imageRadius * 2, outerWidth));
|
||||||
p.setOpacity(1.);
|
p.setOpacity(1.);
|
||||||
|
@ -416,7 +414,21 @@ void RoundImageCheckbox::setChecked(bool newChecked, anim::type animated) {
|
||||||
}
|
}
|
||||||
if (animated == anim::type::normal) {
|
if (animated == anim::type::normal) {
|
||||||
prepareWideCache();
|
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 {
|
} else {
|
||||||
_selection.stop();
|
_selection.stop();
|
||||||
}
|
}
|
||||||
|
@ -439,4 +451,8 @@ void RoundImageCheckbox::prepareWideCache() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RoundImageCheckbox::setColorOverride(std::optional<QBrush> fg) {
|
||||||
|
_fgOverride = fg;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Ui
|
} // namespace Ui
|
||||||
|
|
|
@ -16,7 +16,7 @@ class RoundCheckbox {
|
||||||
public:
|
public:
|
||||||
RoundCheckbox(const style::RoundCheckbox &st, Fn<void()> updateCallback);
|
RoundCheckbox(const style::RoundCheckbox &st, Fn<void()> 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);
|
void setDisplayInactive(bool displayInactive);
|
||||||
bool checked() const {
|
bool checked() const {
|
||||||
|
@ -47,9 +47,11 @@ public:
|
||||||
using PaintRoundImage = Fn<void(Painter &p, int x, int y, int outerWidth, int size)>;
|
using PaintRoundImage = Fn<void(Painter &p, int x, int y, int outerWidth, int size)>;
|
||||||
RoundImageCheckbox(const style::RoundImageCheckbox &st, Fn<void()> updateCallback, PaintRoundImage &&paintRoundImage);
|
RoundImageCheckbox(const style::RoundImageCheckbox &st, Fn<void()> 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;
|
float64 checkedAnimationRatio() const;
|
||||||
|
|
||||||
|
void setColorOverride(std::optional<QBrush> fg);
|
||||||
|
|
||||||
bool checked() const {
|
bool checked() const {
|
||||||
return _check.checked();
|
return _check.checked();
|
||||||
}
|
}
|
||||||
|
@ -73,6 +75,8 @@ private:
|
||||||
|
|
||||||
RoundCheckbox _check;
|
RoundCheckbox _check;
|
||||||
|
|
||||||
|
std::optional<QBrush> _fgOverride;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Ui
|
} // namespace Ui
|
||||||
|
|
Loading…
Add table
Reference in a new issue