diff --git a/Telegram/SourceFiles/data/data_forum.cpp b/Telegram/SourceFiles/data/data_forum.cpp index 6d3622e4e..8a6ba9f3b 100644 --- a/Telegram/SourceFiles/data/data_forum.cpp +++ b/Telegram/SourceFiles/data/data_forum.cpp @@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_histories.h" #include "data/data_session.h" #include "data/data_forum_topic.h" +#include "data/notify/data_notify_settings.h" #include "history/history.h" #include "history/history_item.h" #include "history/history_unread_things.h" @@ -285,6 +286,12 @@ void Forum::clearAllUnreadReactions() { } } +void Forum::enumerateTopics(Fn)> action) const { + for (const auto &[rootId, topic] : _topics) { + action(topic.get()); + } +} + ForumTopic *Forum::topicFor(MsgId rootId) { if (!rootId) { return nullptr; diff --git a/Telegram/SourceFiles/data/data_forum.h b/Telegram/SourceFiles/data/data_forum.h index b3eb61274..1bc79e1ec 100644 --- a/Telegram/SourceFiles/data/data_forum.h +++ b/Telegram/SourceFiles/data/data_forum.h @@ -65,6 +65,7 @@ public: void clearAllUnreadMentions(); void clearAllUnreadReactions(); + void enumerateTopics(Fn)> action) const; private: struct TopicRequest { diff --git a/Telegram/SourceFiles/data/notify/data_notify_settings.cpp b/Telegram/SourceFiles/data/notify/data_notify_settings.cpp index 77f3bf207..a84d48144 100644 --- a/Telegram/SourceFiles/data/notify/data_notify_settings.cpp +++ b/Telegram/SourceFiles/data/notify/data_notify_settings.cpp @@ -17,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_document.h" #include "data/data_file_origin.h" #include "data/data_peer.h" +#include "data/data_forum.h" #include "data/data_forum_topic.h" #include "data/data_session.h" #include "data/data_user.h" @@ -221,6 +222,14 @@ void NotifySettings::resetToDefault(not_null peer) { } } +void NotifySettings::forumParentMuteUpdated(not_null forum) { + forum->enumerateTopics([&](not_null topic) { + if (!topic->notify().settingsUnknown()) { + updateLocal(topic); + } + }); +} + auto NotifySettings::defaultValue(DefaultNotify type) -> DefaultValue & { const auto index = static_cast(type); diff --git a/Telegram/SourceFiles/data/notify/data_notify_settings.h b/Telegram/SourceFiles/data/notify/data_notify_settings.h index 4de0a8d96..be41ce8dc 100644 --- a/Telegram/SourceFiles/data/notify/data_notify_settings.h +++ b/Telegram/SourceFiles/data/notify/data_notify_settings.h @@ -18,6 +18,7 @@ namespace Data { class DocumentMedia; class Session; class Thread; +class Forum; class ForumTopic; enum class DefaultNotify { @@ -65,6 +66,8 @@ public: std::optional sound = std::nullopt); void resetToDefault(not_null peer); + void forumParentMuteUpdated(not_null forum); + void cacheSound(DocumentId id); void cacheSound(not_null document); [[nodiscard]] std::shared_ptr lookupRingtone( diff --git a/Telegram/SourceFiles/history/history.cpp b/Telegram/SourceFiles/history/history.cpp index 8a6749325..25e1bb00a 100644 --- a/Telegram/SourceFiles/history/history.cpp +++ b/Telegram/SourceFiles/history/history.cpp @@ -1764,6 +1764,9 @@ void History::setMuted(bool muted) { const auto notify = (unreadCountForBadge() > 0); const auto notifier = unreadStateChangeNotifier(notify); Thread::setMuted(muted); + if (const auto forum = peer->forum()) { + owner().notifySettings().forumParentMuteUpdated(forum); + } } void History::getNextFirstUnreadMessage() { diff --git a/Telegram/SourceFiles/info/profile/info_profile_actions.cpp b/Telegram/SourceFiles/info/profile/info_profile_actions.cpp index bde6109e9..71071689c 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_actions.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_actions.cpp @@ -452,8 +452,19 @@ object_ptr DetailsFiller::setupMuteToggle() { if (button == Qt::RightButton) { return true; } - if (notifySettings->isMuted(peer)) { - notifySettings->update(peer, { .unmute = true }); + const auto topic = topicRootId + ? peer->forumTopicFor(topicRootId) + : nullptr; + Assert(!topicRootId || topic != nullptr); + const auto is = topic + ? notifySettings->isMuted(topic) + : notifySettings->isMuted(peer); + if (is) { + if (topic) { + notifySettings->update(topic, { .unmute = true }); + } else { + notifySettings->update(peer, { .unmute = true }); + } return false; } else { return true;