diff --git a/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_slider.cpp b/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_slider.cpp index ac6f6dcbd..b2286be5f 100644 --- a/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_slider.cpp +++ b/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_slider.cpp @@ -57,6 +57,26 @@ ChatsFiltersTabs::ChatsFiltersTabs( Ui::DiscreteSlider::setSelectOnPress(false); } +bool ChatsFiltersTabs::setSectionsAndCheckChanged( + std::vector &§ions) { + const auto &was = sectionsRef(); + const auto changed = [&] { + if (was.size() != sections.size()) { + return true; + } + for (auto i = 0; i < sections.size(); i++) { + if (was[i].label.toString() != sections[i]) { + return true; + } + } + return false; + }(); + if (changed) { + Ui::DiscreteSlider::setSections(std::move(sections)); + } + return changed; +} + int ChatsFiltersTabs::centerOfSection(int section) const { const auto widths = countSectionsWidths(0); auto result = 0; diff --git a/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_slider.h b/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_slider.h index c66818fbd..9bd4cf67e 100644 --- a/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_slider.h +++ b/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_slider.h @@ -27,6 +27,8 @@ public: not_null parent, const style::SettingsSlider &st); + bool setSectionsAndCheckChanged(std::vector &§ions); + [[nodiscard]] int centerOfSection(int section) const; void fitWidthToSections(); void setUnreadCount(int index, int unreadCount, bool muted); diff --git a/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.cpp b/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.cpp index fe8710f30..2c4472e79 100644 --- a/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.cpp +++ b/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.cpp @@ -293,15 +293,18 @@ not_null AddChatFiltersTabsStrip( if ((list.size() <= 1 && !slider->width()) || state->ignoreRefresh) { return; } + const auto sectionsChanged = slider->setSectionsAndCheckChanged( + ranges::views::all( + list + ) | ranges::views::transform([](const Data::ChatFilter &filter) { + return filter.title().isEmpty() + ? tr::lng_filters_all_short(tr::now) + : filter.title(); + }) | ranges::to_vector); + if (!sectionsChanged) { + return; + } state->rebuildLifetime.destroy(); - auto sections = ranges::views::all( - list - ) | ranges::views::transform([](const Data::ChatFilter &filter) { - return filter.title().isEmpty() - ? tr::lng_filters_all_short(tr::now) - : filter.title(); - }) | ranges::to_vector; - slider->setSections(std::move(sections)); slider->fitWidthToSections(); { const auto reorderAll = session->user()->isPremium();