From 336e691dbce1c415827528e60a2e7bbcfc206814 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 20 Feb 2018 20:53:55 +0300 Subject: [PATCH] Add unread counter from feed to common counter. --- Telegram/SourceFiles/data/data_feed.cpp | 46 +++++++++++++++++-- Telegram/SourceFiles/data/data_feed.h | 1 + Telegram/SourceFiles/history/history.cpp | 27 +++++++++-- Telegram/SourceFiles/history/history.h | 19 ++------ .../feed/info_feed_channels_controllers.cpp | 6 ++- 5 files changed, 72 insertions(+), 27 deletions(-) diff --git a/Telegram/SourceFiles/data/data_feed.cpp b/Telegram/SourceFiles/data/data_feed.cpp index 061b13e45..0aeb59b1c 100644 --- a/Telegram/SourceFiles/data/data_feed.cpp +++ b/Telegram/SourceFiles/data/data_feed.cpp @@ -359,17 +359,43 @@ void Feed::applyDialog(const MTPDdialogFeed &data) { } } +void Feed::changedInChatListHook(Dialogs::Mode list, bool added) { + if (list == Dialogs::Mode::All && unreadCount()) { + const auto mutedCount = _unreadMutedCount; + const auto nonMutedCount = unreadCount() - mutedCount; + const auto mutedDelta = added ? mutedCount : -mutedCount; + const auto nonMutedDelta = added ? nonMutedCount : -nonMutedCount; + App::histories().unreadIncrement(nonMutedDelta, false); + App::histories().unreadIncrement(mutedDelta, true); + } +} + void Feed::setUnreadCounts(int unreadNonMutedCount, int unreadMutedCount) { if (unreadCountKnown() && (*_unreadCount == unreadNonMutedCount + unreadMutedCount) && (_unreadMutedCount == unreadMutedCount)) { return; } + const auto unreadNonMutedCountDelta = _unreadCount | [&](int count) { + return unreadNonMutedCount - (count - _unreadMutedCount); + }; + const auto unreadMutedCountDelta = _unreadCount | [&](int count) { + return unreadMutedCount - _unreadMutedCount; + }; _unreadCount = unreadNonMutedCount + unreadMutedCount; _unreadMutedCount = unreadMutedCount; _unreadCountChanges.fire(unreadCount()); updateChatListEntry(); + + if (inChatList(Dialogs::Mode::All)) { + App::histories().unreadIncrement( + unreadNonMutedCountDelta ? *unreadNonMutedCountDelta : unreadNonMutedCount, + false); + App::histories().unreadIncrement( + unreadMutedCountDelta ? *unreadMutedCountDelta : unreadMutedCount, + true); + } } void Feed::setUnreadPosition(const MessagePosition &position) { @@ -384,14 +410,24 @@ void Feed::unreadCountChanged( if (!unreadCountKnown()) { return; } - *_unreadCount = std::max(*_unreadCount + unreadCountDelta, 0); - _unreadMutedCount = snap( - _unreadMutedCount + mutedCountDelta, - 0, - *_unreadCount); + accumulate_max(unreadCountDelta, -*_unreadCount); + *_unreadCount += unreadCountDelta; + + mutedCountDelta = snap( + mutedCountDelta, + -_unreadMutedCount, + *_unreadCount - _unreadMutedCount); + _unreadMutedCount += mutedCountDelta; _unreadCountChanges.fire(unreadCount()); updateChatListEntry(); + + if (inChatList(Dialogs::Mode::All)) { + App::histories().unreadIncrement( + unreadCountDelta, + false); + App::histories().unreadMuteChanged(mutedCountDelta, true); + } } MessagePosition Feed::unreadPosition() const { diff --git a/Telegram/SourceFiles/data/data_feed.h b/Telegram/SourceFiles/data/data_feed.h index 9b7ce8458..12bf51208 100644 --- a/Telegram/SourceFiles/data/data_feed.h +++ b/Telegram/SourceFiles/data/data_feed.h @@ -67,6 +67,7 @@ public: const QString &chatsListName() const override; const base::flat_set &chatsListNameWords() const override; const base::flat_set &chatsListFirstLetters() const override; + void changedInChatListHook(Dialogs::Mode list, bool added) override; void loadUserpic() override; void paintUserpic( diff --git a/Telegram/SourceFiles/history/history.cpp b/Telegram/SourceFiles/history/history.cpp index 19e894774..2e84639b1 100644 --- a/Telegram/SourceFiles/history/history.cpp +++ b/Telegram/SourceFiles/history/history.cpp @@ -162,6 +162,29 @@ int Histories::unreadBadge() const { return _unreadFull - (Global::IncludeMuted() ? 0 : _unreadMuted); } +int Histories::unreadMutedCount() const { + return _unreadMuted; +} + +void Histories::unreadIncrement(int count, bool muted) { + _unreadFull += count; + if (muted) { + _unreadMuted += count; + } + if (!muted || Global::IncludeMuted()) { + Notify::unreadCounterUpdated(); + } +} + +void Histories::unreadMuteChanged(int count, bool muted) { + if (muted) { + _unreadMuted += count; + } else { + _unreadMuted -= count; + } + Notify::unreadCounterUpdated(); +} + bool Histories::unreadOnlyMuted() const { return Global::IncludeMuted() ? (_unreadMuted >= _unreadFull) : false; } @@ -1642,9 +1665,6 @@ void History::setUnreadCount(int newUnreadCount) { App::histories().unreadIncrement( unreadCountDelta ? *unreadCountDelta : newUnreadCount, mute()); - if (!mute() || Global::IncludeMuted()) { - Notify::unreadCounterUpdated(); - } } if (const auto main = App::main()) { main->unreadCountChanged(this); @@ -2580,7 +2600,6 @@ void History::changedInChatListHook(Dialogs::Mode list, bool added) { if (list == Dialogs::Mode::All && unreadCount()) { const auto delta = added ? unreadCount() : -unreadCount(); App::histories().unreadIncrement(delta, mute()); - Notify::unreadCounterUpdated(); } } diff --git a/Telegram/SourceFiles/history/history.h b/Telegram/SourceFiles/history/history.h index 64ce42908..2915f3ab0 100644 --- a/Telegram/SourceFiles/history/history.h +++ b/Telegram/SourceFiles/history/history.h @@ -72,23 +72,10 @@ public: BasicAnimation _a_typings; int unreadBadge() const; - int unreadMutedCount() const { - return _unreadMuted; - } + int unreadMutedCount() const; bool unreadOnlyMuted() const; - void unreadIncrement(int32 count, bool muted) { - _unreadFull += count; - if (muted) { - _unreadMuted += count; - } - } - void unreadMuteChanged(int32 count, bool muted) { - if (muted) { - _unreadMuted += count; - } else { - _unreadMuted -= count; - } - } + void unreadIncrement(int count, bool muted); + void unreadMuteChanged(int count, bool muted); struct SendActionAnimationUpdate { History *history; diff --git a/Telegram/SourceFiles/info/feed/info_feed_channels_controllers.cpp b/Telegram/SourceFiles/info/feed/info_feed_channels_controllers.cpp index 0c887749a..4c444db79 100644 --- a/Telegram/SourceFiles/info/feed/info_feed_channels_controllers.cpp +++ b/Telegram/SourceFiles/info/feed/info_feed_channels_controllers.cpp @@ -160,9 +160,11 @@ std::unique_ptr ChannelsController::saveState() const { auto result = PeerListController::saveState(); auto my = std::make_unique(); using Flag = Data::FeedUpdateFlag; + + // Must not capture `this` here, because it dies before my->lifetime. Auth().data().feedUpdated( - ) | rpl::filter([=](const Data::FeedUpdate &update) { - return (update.feed == _feed) && (update.flag == Flag::Channels); + ) | rpl::filter([feed = _feed](const Data::FeedUpdate &update) { + return (update.feed == feed) && (update.flag == Flag::Channels); }) | rpl::start_with_next([state = result.get()] { state->controllerState = nullptr; }, my->lifetime);