tdesktop/Telegram/SourceFiles/media/stories/media_stories_reactions.h

150 lines
3.7 KiB
C
Raw Normal View History

/*
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
2023-08-08 08:55:12 +00:00
#include "data/data_message_reaction_id.h"
#include "ui/effects/animations.h"
namespace Data {
2023-08-08 08:55:12 +00:00
class DocumentMedia;
struct ReactionId;
2023-08-08 08:55:12 +00:00
class Session;
class Story;
struct SuggestedReaction;
2024-07-23 12:56:06 +00:00
struct WeatherArea;
} // namespace Data
namespace HistoryView::Reactions {
class Selector;
struct ChosenReaction;
enum class AttachSelectorResult;
} // namespace HistoryView::Reactions
namespace Ui {
class RpWidget;
2023-08-08 08:55:12 +00:00
struct ReactionFlyAnimationArgs;
struct ReactionFlyCenter;
class EmojiFlyAnimation;
class PopupMenu;
} // namespace Ui
namespace Media::Stories {
class Controller;
2023-08-08 08:55:12 +00:00
enum class ReactionsMode {
Message,
Reaction,
};
2024-07-23 12:56:06 +00:00
class StoryAreaView {
public:
2024-07-23 12:56:06 +00:00
virtual ~StoryAreaView() = default;
2024-07-23 12:56:06 +00:00
virtual void setAreaGeometry(QRect geometry, float64 radius) = 0;
virtual void updateReactionsCount(int count) = 0;
virtual void playEffect() = 0;
2024-07-23 12:56:06 +00:00
virtual bool contains(QPoint point) = 0;
};
class Reactions final {
public:
explicit Reactions(not_null<Controller*> controller);
~Reactions();
2023-08-08 08:55:12 +00:00
using Mode = ReactionsMode;
template <typename Reaction>
struct ChosenWrap {
Reaction reaction;
Mode mode;
};
using Chosen = ChosenWrap<HistoryView::Reactions::ChosenReaction>;
[[nodiscard]] rpl::producer<bool> activeValue() const;
[[nodiscard]] rpl::producer<Chosen> chosen() const;
[[nodiscard]] Data::ReactionId liked() const;
[[nodiscard]] rpl::producer<Data::ReactionId> likedValue() const;
void showLikeFrom(Data::Story *story);
void hide();
2023-08-08 08:55:12 +00:00
void outsidePressed();
void toggleLiked();
void applyLike(Data::ReactionId id);
2023-08-08 08:55:12 +00:00
void ready();
[[nodiscard]] auto makeSuggestedReactionWidget(
const Data::SuggestedReaction &reaction)
2024-07-23 12:56:06 +00:00
-> std::unique_ptr<StoryAreaView>;
2024-07-26 12:44:06 +00:00
[[nodiscard]] auto makeWeatherAreaWidget(
const Data::WeatherArea &data,
rpl::producer<bool> weatherInCelsius)
2024-07-23 12:56:06 +00:00
-> std::unique_ptr<StoryAreaView>;
2023-08-08 08:55:12 +00:00
void setReplyFieldState(
rpl::producer<bool> focused,
rpl::producer<bool> hasSendText);
void attachToReactionButton(not_null<Ui::RpWidget*> button);
void setReactionIconWidget(Ui::RpWidget *widget);
2024-02-12 09:15:08 +00:00
void animateAndProcess(Chosen &&chosen);
using AttachStripResult = HistoryView::Reactions::AttachSelectorResult;
[[nodiscard]] AttachStripResult attachToMenu(
not_null<Ui::PopupMenu*> menu,
QPoint desiredPosition);
2023-08-08 08:55:12 +00:00
private:
class Panel;
void assignLikedId(Data::ReactionId id);
[[nodiscard]] Fn<void(Ui::ReactionFlyCenter)> setLikedIdIconInit(
not_null<Data::Session*> owner,
Data::ReactionId id,
bool force = false);
void setLikedIdFrom(Data::Story *story);
void setLikedId(
not_null<Data::Session*> owner,
Data::ReactionId id,
bool force = false);
void startReactionAnimation(
Ui::ReactionFlyAnimationArgs from,
not_null<QWidget*> target,
Fn<void(Ui::ReactionFlyCenter)> done = nullptr);
void waitForLikeIcon(
not_null<Data::Session*> owner,
Data::ReactionId id);
void initLikeIcon(
not_null<Data::Session*> owner,
Data::ReactionId id,
Ui::ReactionFlyCenter center);
const not_null<Controller*> _controller;
2023-08-08 08:55:12 +00:00
const std::unique_ptr<Panel> _panel;
rpl::event_stream<Chosen> _chosen;
2023-08-08 08:55:12 +00:00
bool _replyFocused = false;
bool _hasSendText = false;
Ui::RpWidget *_likeIconWidget = nullptr;
2023-08-08 08:55:12 +00:00
rpl::variable<Data::ReactionId> _liked;
base::has_weak_ptr _likeIconGuard;
std::unique_ptr<Ui::RpWidget> _likeIcon;
std::shared_ptr<Data::DocumentMedia> _likeIconMedia;
std::unique_ptr<Ui::EmojiFlyAnimation> _reactionAnimation;
rpl::lifetime _likeIconWaitLifetime;
rpl::lifetime _likeFromLifetime;
rpl::lifetime _lifetime;
};
} // namespace Media::Stories