tdesktop/Telegram/SourceFiles/history/view/reactions/history_view_reactions.h

118 lines
2.8 KiB
C++

/*
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"
#include "data/data_message_reaction_id.h"
namespace Data {
class CloudImageView;
class Reactions;
} // namespace Data
namespace Ui {
struct ChatPaintContext;
} // namespace Ui
namespace HistoryView {
using PaintContext = Ui::ChatPaintContext;
class Message;
struct TextState;
struct UserpicInRow;
struct ReactionAnimationArgs;
} // namespace HistoryView
namespace HistoryView::Reactions {
using ::Data::ReactionId;
using ::Data::MessageReaction;
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<Flag>;
std::vector<MessageReaction> reactions;
base::flat_map<ReactionId, std::vector<not_null<PeerData*>>> recent;
Flags flags = {};
};
class InlineList final : public Object {
public:
using Data = InlineListData;
InlineList(
not_null<::Data::Reactions*> owner,
Fn<ClickHandlerPtr(ReactionId)> 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<TextState*> outResult) const;
void animate(
ReactionAnimationArgs &&args,
Fn<void()> repaint);
[[nodiscard]] auto takeAnimations()
-> base::flat_map<ReactionId, std::unique_ptr<Reactions::Animation>>;
void continueAnimations(base::flat_map<
ReactionId,
std::unique_ptr<Reactions::Animation>> animations);
private:
struct Userpics {
QImage image;
std::vector<UserpicInRow> list;
bool someNotLoaded = false;
};
struct Button;
void layout();
void layoutButtons();
void setButtonCount(Button &button, int count);
void setButtonUserpics(
Button &button,
const std::vector<not_null<PeerData*>> &peers);
[[nodiscard]] Button prepareButtonWithId(const ReactionId &id);
void resolveUserpicsImage(const Button &button) const;
QSize countOptimalSize() override;
const not_null<::Data::Reactions*> _owner;
const Fn<ClickHandlerPtr(ReactionId)> _handlerFactory;
Data _data;
std::vector<Button> _buttons;
QSize _skipBlock;
};
[[nodiscard]] InlineListData InlineListDataFromMessage(
not_null<Message*> message);
} // namespace HistoryView