/* 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 "history/view/history_view_object.h" namespace Data { class Reactions; class CloudImageView; } // namespace Data namespace Ui { struct ChatPaintContext; } // namespace Ui namespace HistoryView { using PaintContext = Ui::ChatPaintContext; class Message; struct TextState; struct ReactionAnimationArgs; struct UserpicInRow; } // namespace HistoryView namespace HistoryView::Reactions { class Animation; struct InlineListData { enum class Flag : uchar { InBubble = 0x01, OutLayout = 0x02, Flipped = 0x04, }; friend inline constexpr bool is_flag_type(Flag) { return true; }; using Flags = base::flags; base::flat_map reactions; base::flat_map>> recent; QString chosenReaction; Flags flags = {}; }; class InlineList final : public Object { public: using Data = InlineListData; InlineList( not_null<::Data::Reactions*> owner, Fn handlerFactory, Data &&data); ~InlineList(); void update(Data &&data, int availableWidth); QSize countCurrentSize(int newWidth) override; [[nodiscard]] int countNiceWidth() const; [[nodiscard]] int placeAndResizeGetHeight(QRect available); void flipToRight(); void updateSkipBlock(int width, int height); void removeSkipBlock(); void paint( Painter &p, const PaintContext &context, int outerWidth, const QRect &clip) const; [[nodiscard]] bool getState( QPoint point, not_null outResult) const; void animate( ReactionAnimationArgs &&args, Fn repaint); [[nodiscard]] auto takeAnimations() -> base::flat_map>; void continueAnimations(base::flat_map< QString, std::unique_ptr> animations); private: struct Userpics { QImage image; std::vector list; bool someNotLoaded = false; }; struct Button { QRect geometry; mutable std::unique_ptr animation; mutable QImage image; mutable ClickHandlerPtr link; std::unique_ptr userpics; QString emoji; QString countText; int count = 0; int countTextWidth = 0; }; void layout(); void layoutButtons(); void setButtonCount(Button &button, int count); void setButtonUserpics( Button &button, const std::vector> &peers); [[nodiscard]] Button prepareButtonWithEmoji(const QString &emoji); void resolveUserpicsImage(const Button &button) const; QSize countOptimalSize() override; const not_null<::Data::Reactions*> _owner; const Fn _handlerFactory; Data _data; std::vector