From 1f162aa2a0b4c1c50448d77b02bc66a650f49e5d Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 20 Nov 2024 17:40:22 +0300 Subject: [PATCH] Fixed tags display when color of chats filter tag is toggled. --- .../SourceFiles/data/data_chat_filters.cpp | 9 +++++-- Telegram/SourceFiles/data/data_chat_filters.h | 9 +++++-- .../SourceFiles/dialogs/dialogs_entry.cpp | 27 ++++++++++++------- Telegram/SourceFiles/dialogs/dialogs_entry.h | 1 + .../dialogs/dialogs_inner_widget.cpp | 20 +++++++++++++- 5 files changed, 52 insertions(+), 14 deletions(-) diff --git a/Telegram/SourceFiles/data/data_chat_filters.cpp b/Telegram/SourceFiles/data/data_chat_filters.cpp index 224ee2797..acc36d10e 100644 --- a/Telegram/SourceFiles/data/data_chat_filters.cpp +++ b/Telegram/SourceFiles/data/data_chat_filters.cpp @@ -652,6 +652,8 @@ bool ChatFilters::applyChange(ChatFilter &filter, ChatFilter &&updated) { || (filter.title() != updated.title()) || (filter.iconEmoji() != updated.iconEmoji()); const auto colorChanged = filter.colorIndex() != updated.colorIndex(); + const auto colorExistenceChanged = (!filter.colorIndex()) + != (!updated.colorIndex()); if (!listUpdated && !chatlistChanged && !colorChanged) { return false; } @@ -707,7 +709,10 @@ bool ChatFilters::applyChange(ChatFilter &filter, ChatFilter &&updated) { _isChatlistChanged.fire_copy(id); } if (colorChanged) { - _tagColorChanged.fire_copy(id); + _tagColorChanged.fire_copy(TagColorChanged{ + .filterId = id, + .colorExistenceChanged = colorExistenceChanged, + }); } if (entryToRefreshHeight) { // Trigger a full refresh of height for the main list. @@ -855,7 +860,7 @@ rpl::producer ChatFilters::isChatlistChanged() const { return _isChatlistChanged.events(); } -rpl::producer ChatFilters::tagColorChanged() const { +rpl::producer ChatFilters::tagColorChanged() const { return _tagColorChanged.events(); } diff --git a/Telegram/SourceFiles/data/data_chat_filters.h b/Telegram/SourceFiles/data/data_chat_filters.h index 82f050af0..b18cda973 100644 --- a/Telegram/SourceFiles/data/data_chat_filters.h +++ b/Telegram/SourceFiles/data/data_chat_filters.h @@ -124,6 +124,11 @@ struct SuggestedFilter { QString description; }; +struct TagColorChanged final { + FilterId filterId = 0; + bool colorExistenceChanged = false; +}; + class ChatFilters final { public: explicit ChatFilters(not_null owner); @@ -140,7 +145,7 @@ public: [[nodiscard]] const std::vector &list() const; [[nodiscard]] rpl::producer<> changed() const; [[nodiscard]] rpl::producer isChatlistChanged() const; - [[nodiscard]] rpl::producer tagColorChanged() const; + [[nodiscard]] rpl::producer tagColorChanged() const; [[nodiscard]] bool loaded() const; [[nodiscard]] bool has() const; @@ -215,7 +220,7 @@ private: base::flat_map> _chatsLists; rpl::event_stream<> _listChanged; rpl::event_stream _isChatlistChanged; - rpl::event_stream _tagColorChanged; + rpl::event_stream _tagColorChanged; mtpRequestId _loadRequestId = 0; mtpRequestId _saveOrderRequestId = 0; mtpRequestId _saveOrderAfterId = 0; diff --git a/Telegram/SourceFiles/dialogs/dialogs_entry.cpp b/Telegram/SourceFiles/dialogs/dialogs_entry.cpp index 76d5ebe84..81b42c14d 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_entry.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_entry.cpp @@ -332,23 +332,32 @@ int Entry::posInChatList(FilterId filterId) const { return mainChatListLink(filterId)->index(); } +void Entry::setColorIndexForFilterId( + FilterId filterId, + std::optional colorIndex) { + if (!filterId) { + return; + } + if (colorIndex) { + _tagColors[filterId] = *colorIndex; + } else { + _tagColors.remove(filterId); + } +} + not_null Entry::addToChatList( FilterId filterId, not_null list) { - if (const auto main = maybeMainChatListLink(filterId)) { - return main; - } if (filterId) { const auto &list = owner().chatsFilters().list(); const auto it = ranges::find(list, filterId, &Data::ChatFilter::id); - if (it != end(list) && it->colorIndex()) { - _tagColors[filterId] = *(it->colorIndex()); - } else { - if (it != end(list)) { - } - _tagColors.remove(filterId); + if (it != end(list)) { + setColorIndexForFilterId(filterId, it->colorIndex()); } } + if (const auto main = maybeMainChatListLink(filterId)) { + return main; + } return _chatListLinks.emplace( filterId, list->addEntry(this) diff --git a/Telegram/SourceFiles/dialogs/dialogs_entry.h b/Telegram/SourceFiles/dialogs/dialogs_entry.h index cb6ac728f..e1909f7a6 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_entry.h +++ b/Telegram/SourceFiles/dialogs/dialogs_entry.h @@ -189,6 +189,7 @@ public: not_null addToChatList( FilterId filterId, not_null list); + void setColorIndexForFilterId(FilterId, std::optional); void removeFromChatList( FilterId filterId, not_null list); diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 44f672bec..955f48a1c 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -329,10 +329,28 @@ InnerWidget::InnerWidget( }, _handleChatListEntryTagRefreshesLifetime); session().data().chatsFilters().tagColorChanged( - ) | rpl::start_with_next([=](FilterId filterId) { + ) | rpl::start_with_next([=](Data::TagColorChanged data) { + const auto filterId = data.filterId; const auto it = _chatsFilterTags.find(filterId); if (it != _chatsFilterTags.end()) { _chatsFilterTags.erase(it); + } + if (data.colorExistenceChanged) { + for (const auto &f : session().data().chatsFilters().list()) { + if (f.id() != filterId) { + continue; + } + const auto color = f.colorIndex(); + const auto list = session().data().chatsFilters().chatsList( + filterId); + for (const auto &row : list->indexed()->all()) { + row->entry()->setColorIndexForFilterId(filterId, color); + } + } + if (_shownList->updateHeights(_narrowRatio)) { + refresh(); + } + } else { update(); } }, _handleChatListEntryTagRefreshesLifetime);