/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once #include "ui/text/text_isolated_emoji.h" #include "base/timer.h" #include class HistoryItem; class DocumentData; namespace Main { class Session; } // namespace Main namespace Lottie { struct ColorReplacements; } // namespace Lottie namespace Ui { namespace Text { class String; } // namespace Text namespace Emoji { class UniversalImages; } // namespace Emoji } // namespace Ui namespace Stickers { namespace details { class EmojiImageLoader; } // namespace details using IsolatedEmoji = Ui::Text::IsolatedEmoji; class EmojiPack final { public: struct Sticker { DocumentData *document = nullptr; const Lottie::ColorReplacements *replacements = nullptr; [[nodiscard]] bool empty() const { return (document == nullptr); } [[nodiscard]] explicit operator bool() const { return !empty(); } }; explicit EmojiPack(not_null session); ~EmojiPack(); bool add(not_null item); void remove(not_null item); [[nodiscard]] Sticker stickerForEmoji(const IsolatedEmoji &emoji); [[nodiscard]] std::shared_ptr image(EmojiPtr emoji); private: class ImageLoader; void refresh(); void refreshDelayed(); void applySet(const MTPDmessages_stickerSet &data); void applyPack( const MTPDstickerPack &data, const base::flat_map> &map); base::flat_map> collectStickers( const QVector &list) const; void refreshAll(); void refreshItems(EmojiPtr emoji); void refreshItems(const base::flat_set> &list); std::shared_ptr prepareSourceImages(); void clearSourceImages(); not_null _session; base::flat_map> _map; base::flat_map< IsolatedEmoji, base::flat_set>> _items; base::flat_map> _images; mtpRequestId _requestId = 0; crl::object_on_queue _imageLoader; base::Timer _clearTimer; rpl::lifetime _lifetime; }; } // namespace Stickers