Provided count of dialogs in filter to premium limit boxes.

This commit is contained in:
23rd 2022-06-07 08:05:33 +03:00
parent 9b6b5968e2
commit 9e9a269439
5 changed files with 29 additions and 12 deletions

View file

@ -121,15 +121,19 @@ bool ChooseFilterValidator::canRemove(FilterId filterId) const {
return false; return false;
} }
bool ChooseFilterValidator::limitReached(FilterId filterId) const { ChooseFilterValidator::LimitData ChooseFilterValidator::limitReached(
FilterId filterId) const {
Expects(filterId != 0); Expects(filterId != 0);
const auto list = _history->owner().chatsFilters().list(); const auto list = _history->owner().chatsFilters().list();
const auto i = ranges::find(list, filterId, &Data::ChatFilter::id); const auto i = ranges::find(list, filterId, &Data::ChatFilter::id);
const auto limit = _history->owner().pinnedChatsLimit(nullptr, filterId); const auto limit = _history->owner().pinnedChatsLimit(nullptr, filterId);
return (i != end(list)) return {
&& !ranges::contains(i->always(), _history) .reached = (i != end(list))
&& (i->always().size() >= limit); && !ranges::contains(i->always(), _history)
&& (i->always().size() >= limit),
.count = int(i->always().size()),
};
} }
void ChooseFilterValidator::add(FilterId filterId) const { void ChooseFilterValidator::add(FilterId filterId) const {
@ -158,9 +162,11 @@ void FillChooseFilterMenu(
if (validator.canRemove(id)) { if (validator.canRemove(id)) {
validator.remove(id); validator.remove(id);
} }
} else if (validator.limitReached(id)) { } else if (const auto r = validator.limitReached(id); r.reached) {
controller->show( controller->show(Box(
Box(FilterChatsLimitBox, &controller->session())); FilterChatsLimitBox,
&controller->session(),
r.count));
} else if (validator.canAdd()) { } else if (validator.canAdd()) {
validator.add(id); validator.add(id);
} }

View file

@ -20,10 +20,14 @@ class History;
class ChooseFilterValidator final { class ChooseFilterValidator final {
public: public:
ChooseFilterValidator(not_null<History*> history); ChooseFilterValidator(not_null<History*> history);
struct LimitData {
const bool reached = false;
const int count = 0;
};
[[nodiscard]] bool canAdd() const; [[nodiscard]] bool canAdd() const;
[[nodiscard]] bool canRemove(FilterId filterId) const; [[nodiscard]] bool canRemove(FilterId filterId) const;
[[nodiscard]] bool limitReached(FilterId filterId) const; [[nodiscard]] LimitData limitReached(FilterId filterId) const;
void add(FilterId filterId) const; void add(FilterId filterId) const;
void remove(FilterId filterId) const; void remove(FilterId filterId) const;

View file

@ -348,7 +348,8 @@ void EditFilterChatsListController::rowClicked(not_null<PeerListRow*> row) {
delegate()->peerListSetRowChecked(row, !row->checked()); delegate()->peerListSetRowChecked(row, !row->checked());
updateTitle(); updateTitle();
} else { } else {
delegate()->peerListShowBox(Box(FilterChatsLimitBox, _session)); delegate()->peerListShowBox(
Box(FilterChatsLimitBox, _session, count));
} }
} }

View file

@ -668,7 +668,8 @@ void PublicLinksLimitBox(
void FilterChatsLimitBox( void FilterChatsLimitBox(
not_null<Ui::GenericBox*> box, not_null<Ui::GenericBox*> box,
not_null<Main::Session*> session) { not_null<Main::Session*> session,
int currentCount) {
const auto premium = session->premium(); const auto premium = session->premium();
const auto defaultLimit = Limit( const auto defaultLimit = Limit(
@ -679,6 +680,10 @@ void FilterChatsLimitBox(
session, session,
"dialog_filters_chats_limit_premium", "dialog_filters_chats_limit_premium",
200); 200);
const auto current = std::clamp(
float64(currentCount),
defaultLimit,
premiumLimit);
auto text = rpl::combine( auto text = rpl::combine(
tr::lng_filter_chats_limit1( tr::lng_filter_chats_limit1(
@ -703,7 +708,7 @@ void FilterChatsLimitBox(
tr::lng_filter_chats_limit_title(), tr::lng_filter_chats_limit_title(),
std::move(text), std::move(text),
"dialog_filters_chats", "dialog_filters_chats",
{ defaultLimit, defaultLimit, premiumLimit, &st::premiumIconChats }, { defaultLimit, current, premiumLimit, &st::premiumIconChats },
premium); premium);
} }

View file

@ -26,7 +26,8 @@ void PublicLinksLimitBox(
Fn<void()> retry); Fn<void()> retry);
void FilterChatsLimitBox( void FilterChatsLimitBox(
not_null<Ui::GenericBox*> box, not_null<Ui::GenericBox*> box,
not_null<Main::Session*> session); not_null<Main::Session*> session,
int currentCount);
void FiltersLimitBox( void FiltersLimitBox(
not_null<Ui::GenericBox*> box, not_null<Ui::GenericBox*> box,
not_null<Main::Session*> session); not_null<Main::Session*> session);