data_forum_topic.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #pragma once
  8. #include "data/data_thread.h"
  9. #include "data/notify/data_peer_notify_settings.h"
  10. #include "base/flags.h"
  11. class ChannelData;
  12. enum class ChatRestriction;
  13. namespace style {
  14. struct ForumTopicIcon;
  15. } // namespace style
  16. namespace Dialogs {
  17. class MainList;
  18. } // namespace Dialogs
  19. namespace Main {
  20. class Session;
  21. } // namespace Main
  22. namespace HistoryView {
  23. class SendActionPainter;
  24. class ListMemento;
  25. } // namespace HistoryView
  26. namespace Data {
  27. class RepliesList;
  28. class Session;
  29. class Forum;
  30. [[nodiscard]] const base::flat_map<int32, QString> &ForumTopicIcons();
  31. [[nodiscard]] const std::vector<int32> &ForumTopicColorIds();
  32. [[nodiscard]] const QString &ForumTopicIcon(int32 colorId);
  33. [[nodiscard]] QString ForumTopicIconPath(const QString &name);
  34. [[nodiscard]] QImage ForumTopicIconBackground(int32 colorId, int size);
  35. [[nodiscard]] QImage ForumTopicIconFrame(
  36. int32 colorId,
  37. const QString &title,
  38. const style::ForumTopicIcon &st);
  39. [[nodiscard]] QImage ForumTopicGeneralIconFrame(
  40. int size,
  41. const QColor &color);
  42. [[nodiscard]] TextWithEntities ForumTopicIconWithTitle(
  43. MsgId rootId,
  44. DocumentId iconId,
  45. const QString &title);
  46. [[nodiscard]] QString ForumGeneralIconTitle();
  47. [[nodiscard]] bool IsForumGeneralIconTitle(const QString &title);
  48. [[nodiscard]] int32 ForumGeneralIconColor(const QColor &color);
  49. [[nodiscard]] QColor ParseForumGeneralIconColor(int32 value);
  50. struct TopicIconDescriptor {
  51. QString title;
  52. int32 colorId = 0;
  53. [[nodiscard]] bool empty() const {
  54. return !colorId && title.isEmpty();
  55. }
  56. explicit operator bool() const {
  57. return !empty();
  58. }
  59. };
  60. [[nodiscard]] QString TopicIconEmojiEntity(TopicIconDescriptor descriptor);
  61. [[nodiscard]] TopicIconDescriptor ParseTopicIconEmojiEntity(
  62. QStringView entity);
  63. class ForumTopic final : public Thread {
  64. public:
  65. static constexpr auto kGeneralId = 1;
  66. ForumTopic(not_null<Forum*> forum, MsgId rootId);
  67. ~ForumTopic();
  68. not_null<History*> owningHistory() override {
  69. return history();
  70. }
  71. [[nodiscard]] bool isGeneral() const {
  72. return (_rootId == kGeneralId);
  73. }
  74. [[nodiscard]] std::shared_ptr<RepliesList> replies() const;
  75. [[nodiscard]] not_null<ChannelData*> channel() const;
  76. [[nodiscard]] not_null<History*> history() const;
  77. [[nodiscard]] not_null<Forum*> forum() const;
  78. [[nodiscard]] rpl::producer<> destroyed() const;
  79. [[nodiscard]] MsgId rootId() const;
  80. [[nodiscard]] PeerId creatorId() const;
  81. [[nodiscard]] TimeId creationDate() const;
  82. [[nodiscard]] not_null<HistoryView::ListMemento*> listMemento();
  83. [[nodiscard]] bool my() const;
  84. [[nodiscard]] bool canEdit() const;
  85. [[nodiscard]] bool canToggleClosed() const;
  86. [[nodiscard]] bool canTogglePinned() const;
  87. [[nodiscard]] bool canDelete() const;
  88. [[nodiscard]] bool closed() const;
  89. void setClosed(bool closed);
  90. void setClosedAndSave(bool closed);
  91. [[nodiscard]] bool hidden() const;
  92. void setHidden(bool hidden);
  93. [[nodiscard]] bool creating() const;
  94. void discard();
  95. void setRealRootId(MsgId realId);
  96. void readTillEnd();
  97. void requestChatListMessage();
  98. void applyTopic(const MTPDforumTopic &data);
  99. TimeId adjustedChatListTimeId() const override;
  100. int fixedOnTopIndex() const override;
  101. bool shouldBeInChatList() const override;
  102. Dialogs::UnreadState chatListUnreadState() const override;
  103. Dialogs::BadgesState chatListBadgesState() const override;
  104. HistoryItem *chatListMessage() const override;
  105. bool chatListMessageKnown() const override;
  106. const QString &chatListName() const override;
  107. const QString &chatListNameSortKey() const override;
  108. int chatListNameVersion() const override;
  109. const base::flat_set<QString> &chatListNameWords() const override;
  110. const base::flat_set<QChar> &chatListFirstLetters() const override;
  111. void hasUnreadMentionChanged(bool has) override;
  112. void hasUnreadReactionChanged(bool has) override;
  113. [[nodiscard]] HistoryItem *lastMessage() const;
  114. [[nodiscard]] HistoryItem *lastServerMessage() const;
  115. [[nodiscard]] bool lastMessageKnown() const;
  116. [[nodiscard]] bool lastServerMessageKnown() const;
  117. [[nodiscard]] MsgId lastKnownServerMessageId() const;
  118. [[nodiscard]] QString title() const;
  119. [[nodiscard]] TextWithEntities titleWithIcon() const;
  120. [[nodiscard]] int titleVersion() const;
  121. void applyTitle(const QString &title);
  122. [[nodiscard]] DocumentId iconId() const;
  123. void applyIconId(DocumentId iconId);
  124. [[nodiscard]] int32 colorId() const;
  125. void applyColorId(int32 colorId);
  126. void applyCreator(PeerId creatorId);
  127. void applyCreationDate(TimeId date);
  128. void applyIsMy(bool my);
  129. void applyItemAdded(not_null<HistoryItem*> item);
  130. void applyItemRemoved(MsgId id);
  131. void maybeSetLastMessage(not_null<HistoryItem*> item);
  132. [[nodiscard]] PeerNotifySettings &notify() {
  133. return _notify;
  134. }
  135. [[nodiscard]] const PeerNotifySettings &notify() const {
  136. return _notify;
  137. }
  138. void chatListPreloadData() override;
  139. void paintUserpic(
  140. Painter &p,
  141. Ui::PeerUserpicView &view,
  142. const Dialogs::Ui::PaintContext &context) const override;
  143. void clearUserpicLoops();
  144. [[nodiscard]] bool isServerSideUnread(
  145. not_null<const HistoryItem*> item) const override;
  146. void setMuted(bool muted) override;
  147. [[nodiscard]] auto sendActionPainter()
  148. ->not_null<HistoryView::SendActionPainter*> override;
  149. private:
  150. enum class Flag : uchar {
  151. Closed = (1 << 0),
  152. Hidden = (1 << 1),
  153. My = (1 << 2),
  154. HasPinnedMessages = (1 << 3),
  155. GeneralIconActive = (1 << 4),
  156. GeneralIconSelected = (1 << 5),
  157. ResolveChatListMessage = (1 << 6),
  158. };
  159. friend inline constexpr bool is_flag_type(Flag) { return true; }
  160. using Flags = base::flags<Flag>;
  161. void indexTitleParts();
  162. void validateDefaultIcon() const;
  163. void validateGeneralIcon(const Dialogs::Ui::PaintContext &context) const;
  164. void applyTopicTopMessage(MsgId topMessageId);
  165. void growLastKnownServerMessageId(MsgId id);
  166. void invalidateTitleWithIcon();
  167. void setLastMessage(HistoryItem *item);
  168. void setLastServerMessage(HistoryItem *item);
  169. void setChatListMessage(HistoryItem *item);
  170. void allowChatListMessageResolve();
  171. void resolveChatListMessageGroup();
  172. void subscribeToUnreadChanges();
  173. [[nodiscard]] Dialogs::UnreadState unreadStateFor(
  174. int count,
  175. bool known) const;
  176. const not_null<Forum*> _forum;
  177. const not_null<Dialogs::MainList*> _list;
  178. std::shared_ptr<RepliesList> _replies;
  179. std::unique_ptr<HistoryView::ListMemento> _listMemento;
  180. std::shared_ptr<HistoryView::SendActionPainter> _sendActionPainter;
  181. MsgId _rootId = 0;
  182. MsgId _lastKnownServerMessageId = 0;
  183. PeerNotifySettings _notify;
  184. QString _title;
  185. DocumentId _iconId = 0;
  186. base::flat_set<QString> _titleWords;
  187. base::flat_set<QChar> _titleFirstLetters;
  188. PeerId _creatorId = 0;
  189. TimeId _creationDate = 0;
  190. int _titleVersion = 0;
  191. int32 _colorId = 0;
  192. mutable Flags _flags;
  193. std::unique_ptr<Ui::Text::CustomEmoji> _icon;
  194. mutable QImage _defaultIcon; // on-demand
  195. std::optional<HistoryItem*> _lastMessage;
  196. std::optional<HistoryItem*> _lastServerMessage;
  197. std::optional<HistoryItem*> _chatListMessage;
  198. base::flat_set<FullMsgId> _requestedGroups;
  199. rpl::lifetime _lifetime;
  200. };
  201. } // namespace Data