From 7a821ca0f4e3b5e006f8ee40437c4279f9c460d4 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 14 Jun 2022 01:43:13 +0300 Subject: [PATCH] Decomposed creating of unread badge in list of accounts. --- .../settings/settings_information.cpp | 71 ++++++++++++------- .../settings/settings_information.h | 12 +++- .../SourceFiles/window/window_main_menu.cpp | 8 +-- 3 files changed, 61 insertions(+), 30 deletions(-) diff --git a/Telegram/SourceFiles/settings/settings_information.cpp b/Telegram/SourceFiles/settings/settings_information.cpp index 71830aa70..b3d2a1e2c 100644 --- a/Telegram/SourceFiles/settings/settings_information.cpp +++ b/Telegram/SourceFiles/settings/settings_information.cpp @@ -516,11 +516,11 @@ void SetupAccountsWrap( const auto state = raw->lifetime().make_state(raw); if (!active) { - AddUnreadBadge(raw, rpl::single(rpl::empty) | rpl::then( + Badge::AddUnread(raw, rpl::single(rpl::empty) | rpl::then( session->data().unreadBadgeChanges() ) | rpl::map([=] { auto &owner = session->data(); - return UnreadBadge{ + return Badge::UnreadBadge{ owner.unreadBadge(), owner.unreadBadgeMuted(), }; @@ -852,7 +852,9 @@ AccountsEvents SetupAccounts( }; } -Dialogs::Ui::UnreadBadgeStyle BadgeStyle() { +namespace Badge { + +Dialogs::Ui::UnreadBadgeStyle Style() { auto result = Dialogs::Ui::UnreadBadgeStyle(); result.font = st::mainMenuBadgeFont; result.size = st::mainMenuBadgeSize; @@ -860,8 +862,33 @@ Dialogs::Ui::UnreadBadgeStyle BadgeStyle() { return result; } -void AddUnreadBadge( - not_null button, +not_null AddRight( + not_null button) { + const auto widget = Ui::CreateChild(button.get()); + + rpl::combine( + button->sizeValue(), + widget->sizeValue(), + widget->shownValue() + ) | rpl::start_with_next([=](QSize outer, QSize inner, bool shown) { + auto padding = button->st().padding; + if (shown) { + widget->moveToRight( + padding.right(), + (outer.height() - inner.height()) / 2, + outer.width()); + padding.setRight(padding.right() + + inner.width() + + button->st().style.font->spacew); + } + button->setPaddingOverride(padding); + }, widget->lifetime()); + + return widget; +} + +not_null CreateUnread( + not_null container, rpl::producer value) { struct State { State(QWidget *parent) : widget(parent) { @@ -869,11 +896,11 @@ void AddUnreadBadge( } Ui::RpWidget widget; - Dialogs::Ui::UnreadBadgeStyle st = BadgeStyle(); + Dialogs::Ui::UnreadBadgeStyle st = Style(); int count = 0; QString string; }; - const auto state = button->lifetime().make_state(button); + const auto state = container->lifetime().make_state(container); std::move( value @@ -902,23 +929,19 @@ void AddUnreadBadge( state->st); }, state->widget.lifetime()); - rpl::combine( - button->sizeValue(), - state->widget.sizeValue(), - state->widget.shownValue() - ) | rpl::start_with_next([=](QSize outer, QSize inner, bool shown) { - auto padding = button->st().padding; - if (shown) { - state->widget.moveToRight( - padding.right(), - (outer.height() - inner.height()) / 2, - outer.width()); - padding.setRight(padding.right() - + inner.width() - + button->st().style.font->spacew); - } - button->setPaddingOverride(padding); - }, state->widget.lifetime()); + return &state->widget; } +void AddUnread( + not_null button, + rpl::producer value) { + const auto container = AddRight(button); + const auto badge = CreateUnread(container, std::move(value)); + badge->sizeValue( + ) | rpl::start_with_next([=](const QSize &s) { + container->resize(s); + }, container->lifetime()); +} + +} // namespace Badge } // namespace Settings diff --git a/Telegram/SourceFiles/settings/settings_information.h b/Telegram/SourceFiles/settings/settings_information.h index c30cfc02d..5eb771f07 100644 --- a/Telegram/SourceFiles/settings/settings_information.h +++ b/Telegram/SourceFiles/settings/settings_information.h @@ -39,14 +39,22 @@ AccountsEvents SetupAccounts( not_null container, not_null controller); -[[nodiscard]] Dialogs::Ui::UnreadBadgeStyle BadgeStyle(); +namespace Badge { + +[[nodiscard]] Dialogs::Ui::UnreadBadgeStyle Style(); struct UnreadBadge { int count = 0; bool muted = false; }; -void AddUnreadBadge( +[[nodiscard]] not_null AddRight( + not_null button); +[[nodiscard]] not_null CreateUnread( + not_null container, + rpl::producer value); +void AddUnread( not_null button, rpl::producer value); +} // namespace Badge } // namespace Settings diff --git a/Telegram/SourceFiles/window/window_main_menu.cpp b/Telegram/SourceFiles/window/window_main_menu.cpp index 7911958d1..272d742e8 100644 --- a/Telegram/SourceFiles/window/window_main_menu.cpp +++ b/Telegram/SourceFiles/window/window_main_menu.cpp @@ -235,7 +235,7 @@ void MainMenu::ToggleAccountsButton::paintUnreadBadge(Painter &p) { return; } - auto st = Settings::BadgeStyle(); + auto st = Settings::Badge::Style(); const auto right = width() - st::mainMenuTogglePosition.x() - st::mainMenuToggleSize * 3; @@ -259,7 +259,7 @@ void MainMenu::ToggleAccountsButton::validateUnreadBadge() { _rightSkip = base; if (!_unreadBadge.isEmpty()) { - const auto st = Settings::BadgeStyle(); + const auto st = Settings::Badge::Style(); _rightSkip += 2 * st::mainMenuToggleSize + Dialogs::Ui::CountUnreadBadgeSize(_unreadBadge, st).width(); } @@ -513,13 +513,13 @@ void MainMenu::setupArchive() { }) | rpl::take(1); using namespace Settings; - AddUnreadBadge(button, rpl::single(rpl::empty) | rpl::then(std::move( + Badge::AddUnread(button, rpl::single(rpl::empty) | rpl::then(std::move( folderValue ) | rpl::map([=](not_null folder) { return folder->owner().chatsList(folder)->unreadStateChanges(); }) | rpl::flatten_latest() | rpl::to_empty) | rpl::map([=] { const auto loaded = folder(); - return UnreadBadge{ + return Badge::UnreadBadge{ loaded ? loaded->chatListUnreadCount() : 0, true, };