mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Fixed tags display when color of chats filter tag is toggled.
This commit is contained in:
parent
4a19f193ce
commit
1f162aa2a0
5 changed files with 52 additions and 14 deletions
|
@ -652,6 +652,8 @@ bool ChatFilters::applyChange(ChatFilter &filter, ChatFilter &&updated) {
|
||||||
|| (filter.title() != updated.title())
|
|| (filter.title() != updated.title())
|
||||||
|| (filter.iconEmoji() != updated.iconEmoji());
|
|| (filter.iconEmoji() != updated.iconEmoji());
|
||||||
const auto colorChanged = filter.colorIndex() != updated.colorIndex();
|
const auto colorChanged = filter.colorIndex() != updated.colorIndex();
|
||||||
|
const auto colorExistenceChanged = (!filter.colorIndex())
|
||||||
|
!= (!updated.colorIndex());
|
||||||
if (!listUpdated && !chatlistChanged && !colorChanged) {
|
if (!listUpdated && !chatlistChanged && !colorChanged) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -707,7 +709,10 @@ bool ChatFilters::applyChange(ChatFilter &filter, ChatFilter &&updated) {
|
||||||
_isChatlistChanged.fire_copy(id);
|
_isChatlistChanged.fire_copy(id);
|
||||||
}
|
}
|
||||||
if (colorChanged) {
|
if (colorChanged) {
|
||||||
_tagColorChanged.fire_copy(id);
|
_tagColorChanged.fire_copy(TagColorChanged{
|
||||||
|
.filterId = id,
|
||||||
|
.colorExistenceChanged = colorExistenceChanged,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if (entryToRefreshHeight) {
|
if (entryToRefreshHeight) {
|
||||||
// Trigger a full refresh of height for the main list.
|
// Trigger a full refresh of height for the main list.
|
||||||
|
@ -855,7 +860,7 @@ rpl::producer<FilterId> ChatFilters::isChatlistChanged() const {
|
||||||
return _isChatlistChanged.events();
|
return _isChatlistChanged.events();
|
||||||
}
|
}
|
||||||
|
|
||||||
rpl::producer<FilterId> ChatFilters::tagColorChanged() const {
|
rpl::producer<TagColorChanged> ChatFilters::tagColorChanged() const {
|
||||||
return _tagColorChanged.events();
|
return _tagColorChanged.events();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -124,6 +124,11 @@ struct SuggestedFilter {
|
||||||
QString description;
|
QString description;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct TagColorChanged final {
|
||||||
|
FilterId filterId = 0;
|
||||||
|
bool colorExistenceChanged = false;
|
||||||
|
};
|
||||||
|
|
||||||
class ChatFilters final {
|
class ChatFilters final {
|
||||||
public:
|
public:
|
||||||
explicit ChatFilters(not_null<Session*> owner);
|
explicit ChatFilters(not_null<Session*> owner);
|
||||||
|
@ -140,7 +145,7 @@ public:
|
||||||
[[nodiscard]] const std::vector<ChatFilter> &list() const;
|
[[nodiscard]] const std::vector<ChatFilter> &list() const;
|
||||||
[[nodiscard]] rpl::producer<> changed() const;
|
[[nodiscard]] rpl::producer<> changed() const;
|
||||||
[[nodiscard]] rpl::producer<FilterId> isChatlistChanged() const;
|
[[nodiscard]] rpl::producer<FilterId> isChatlistChanged() const;
|
||||||
[[nodiscard]] rpl::producer<FilterId> tagColorChanged() const;
|
[[nodiscard]] rpl::producer<TagColorChanged> tagColorChanged() const;
|
||||||
[[nodiscard]] bool loaded() const;
|
[[nodiscard]] bool loaded() const;
|
||||||
[[nodiscard]] bool has() const;
|
[[nodiscard]] bool has() const;
|
||||||
|
|
||||||
|
@ -215,7 +220,7 @@ private:
|
||||||
base::flat_map<FilterId, std::unique_ptr<Dialogs::MainList>> _chatsLists;
|
base::flat_map<FilterId, std::unique_ptr<Dialogs::MainList>> _chatsLists;
|
||||||
rpl::event_stream<> _listChanged;
|
rpl::event_stream<> _listChanged;
|
||||||
rpl::event_stream<FilterId> _isChatlistChanged;
|
rpl::event_stream<FilterId> _isChatlistChanged;
|
||||||
rpl::event_stream<FilterId> _tagColorChanged;
|
rpl::event_stream<TagColorChanged> _tagColorChanged;
|
||||||
mtpRequestId _loadRequestId = 0;
|
mtpRequestId _loadRequestId = 0;
|
||||||
mtpRequestId _saveOrderRequestId = 0;
|
mtpRequestId _saveOrderRequestId = 0;
|
||||||
mtpRequestId _saveOrderAfterId = 0;
|
mtpRequestId _saveOrderAfterId = 0;
|
||||||
|
|
|
@ -332,23 +332,32 @@ int Entry::posInChatList(FilterId filterId) const {
|
||||||
return mainChatListLink(filterId)->index();
|
return mainChatListLink(filterId)->index();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Entry::setColorIndexForFilterId(
|
||||||
|
FilterId filterId,
|
||||||
|
std::optional<uint8> colorIndex) {
|
||||||
|
if (!filterId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (colorIndex) {
|
||||||
|
_tagColors[filterId] = *colorIndex;
|
||||||
|
} else {
|
||||||
|
_tagColors.remove(filterId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
not_null<Row*> Entry::addToChatList(
|
not_null<Row*> Entry::addToChatList(
|
||||||
FilterId filterId,
|
FilterId filterId,
|
||||||
not_null<MainList*> list) {
|
not_null<MainList*> list) {
|
||||||
if (const auto main = maybeMainChatListLink(filterId)) {
|
|
||||||
return main;
|
|
||||||
}
|
|
||||||
if (filterId) {
|
if (filterId) {
|
||||||
const auto &list = owner().chatsFilters().list();
|
const auto &list = owner().chatsFilters().list();
|
||||||
const auto it = ranges::find(list, filterId, &Data::ChatFilter::id);
|
const auto it = ranges::find(list, filterId, &Data::ChatFilter::id);
|
||||||
if (it != end(list) && it->colorIndex()) {
|
if (it != end(list)) {
|
||||||
_tagColors[filterId] = *(it->colorIndex());
|
setColorIndexForFilterId(filterId, it->colorIndex());
|
||||||
} else {
|
|
||||||
if (it != end(list)) {
|
|
||||||
}
|
|
||||||
_tagColors.remove(filterId);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (const auto main = maybeMainChatListLink(filterId)) {
|
||||||
|
return main;
|
||||||
|
}
|
||||||
return _chatListLinks.emplace(
|
return _chatListLinks.emplace(
|
||||||
filterId,
|
filterId,
|
||||||
list->addEntry(this)
|
list->addEntry(this)
|
||||||
|
|
|
@ -189,6 +189,7 @@ public:
|
||||||
not_null<Row*> addToChatList(
|
not_null<Row*> addToChatList(
|
||||||
FilterId filterId,
|
FilterId filterId,
|
||||||
not_null<MainList*> list);
|
not_null<MainList*> list);
|
||||||
|
void setColorIndexForFilterId(FilterId, std::optional<uint8>);
|
||||||
void removeFromChatList(
|
void removeFromChatList(
|
||||||
FilterId filterId,
|
FilterId filterId,
|
||||||
not_null<MainList*> list);
|
not_null<MainList*> list);
|
||||||
|
|
|
@ -329,10 +329,28 @@ InnerWidget::InnerWidget(
|
||||||
}, _handleChatListEntryTagRefreshesLifetime);
|
}, _handleChatListEntryTagRefreshesLifetime);
|
||||||
|
|
||||||
session().data().chatsFilters().tagColorChanged(
|
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);
|
const auto it = _chatsFilterTags.find(filterId);
|
||||||
if (it != _chatsFilterTags.end()) {
|
if (it != _chatsFilterTags.end()) {
|
||||||
_chatsFilterTags.erase(it);
|
_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();
|
update();
|
||||||
}
|
}
|
||||||
}, _handleChatListEntryTagRefreshesLifetime);
|
}, _handleChatListEntryTagRefreshesLifetime);
|
||||||
|
|
Loading…
Add table
Reference in a new issue