mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Remove accidentally added files from git.
This commit is contained in:
parent
fb8f3ad26c
commit
126fd89bb7
2 changed files with 0 additions and 1795 deletions
File diff suppressed because it is too large
Load diff
|
@ -1,373 +0,0 @@
|
||||||
/*
|
|
||||||
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/effects/animations.h"
|
|
||||||
#include "ui/effects/round_area_with_shadow.h"
|
|
||||||
#include "ui/widgets/scroll_area.h"
|
|
||||||
#include "data/data_message_reaction_id.h"
|
|
||||||
#include "ui/chat/chat_style.h"
|
|
||||||
|
|
||||||
namespace Ui {
|
|
||||||
struct ChatPaintContext;
|
|
||||||
class PopupMenu;
|
|
||||||
} // namespace Ui
|
|
||||||
|
|
||||||
namespace Data {
|
|
||||||
struct Reaction;
|
|
||||||
class DocumentMedia;
|
|
||||||
} // namespace Data
|
|
||||||
|
|
||||||
namespace HistoryView {
|
|
||||||
using PaintContext = Ui::ChatPaintContext;
|
|
||||||
struct TextState;
|
|
||||||
} // namespace HistoryView
|
|
||||||
|
|
||||||
namespace Main {
|
|
||||||
class Session;
|
|
||||||
} // namespace Main
|
|
||||||
|
|
||||||
namespace Lottie {
|
|
||||||
class Icon;
|
|
||||||
} // namespace Lottie
|
|
||||||
|
|
||||||
namespace HistoryView::Reactions {
|
|
||||||
|
|
||||||
enum class ExpandDirection {
|
|
||||||
Up,
|
|
||||||
Down,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ButtonParameters {
|
|
||||||
[[nodiscard]] ButtonParameters translated(QPoint delta) const {
|
|
||||||
auto result = *this;
|
|
||||||
result.center += delta;
|
|
||||||
result.pointer += delta;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
FullMsgId context;
|
|
||||||
QPoint center;
|
|
||||||
QPoint pointer;
|
|
||||||
QPoint globalPointer;
|
|
||||||
int reactionsCount = 1;
|
|
||||||
int visibleTop = 0;
|
|
||||||
int visibleBottom = 0;
|
|
||||||
bool outside = false;
|
|
||||||
bool cursorLeft = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class ButtonState {
|
|
||||||
Hidden,
|
|
||||||
Shown,
|
|
||||||
Active,
|
|
||||||
Inside,
|
|
||||||
};
|
|
||||||
|
|
||||||
class Button final {
|
|
||||||
public:
|
|
||||||
Button(
|
|
||||||
Fn<void(QRect)> update,
|
|
||||||
ButtonParameters parameters,
|
|
||||||
Fn<void(bool)> toggleExpanded,
|
|
||||||
Fn<void()> hide);
|
|
||||||
~Button();
|
|
||||||
|
|
||||||
void applyParameters(ButtonParameters parameters);
|
|
||||||
void expandWithoutCustom();
|
|
||||||
|
|
||||||
using State = ButtonState;
|
|
||||||
void applyState(State state);
|
|
||||||
|
|
||||||
[[nodiscard]] bool expandUp() const;
|
|
||||||
[[nodiscard]] bool isHidden() const;
|
|
||||||
[[nodiscard]] QRect geometry() const;
|
|
||||||
[[nodiscard]] int expandedHeight() const;
|
|
||||||
[[nodiscard]] int scroll() const;
|
|
||||||
[[nodiscard]] int scrollMax() const;
|
|
||||||
[[nodiscard]] float64 currentScale() const;
|
|
||||||
[[nodiscard]] float64 currentOpacity() const;
|
|
||||||
[[nodiscard]] float64 expandAnimationOpacity(float64 expandRatio) const;
|
|
||||||
[[nodiscard]] int expandAnimationScroll(float64 expandRatio) const;
|
|
||||||
[[nodiscard]] bool consumeWheelEvent(not_null<QWheelEvent*> e);
|
|
||||||
|
|
||||||
[[nodiscard]] static float64 ScaleForState(State state);
|
|
||||||
[[nodiscard]] static float64 OpacityForScale(float64 scale);
|
|
||||||
|
|
||||||
private:
|
|
||||||
enum class CollapseType {
|
|
||||||
Scroll,
|
|
||||||
Fade,
|
|
||||||
};
|
|
||||||
|
|
||||||
void updateGeometry(Fn<void(QRect)> update);
|
|
||||||
void applyState(State satte, Fn<void(QRect)> update);
|
|
||||||
void applyParameters(
|
|
||||||
ButtonParameters parameters,
|
|
||||||
Fn<void(QRect)> update);
|
|
||||||
void updateExpandDirection(const ButtonParameters ¶meters);
|
|
||||||
|
|
||||||
const Fn<void(QRect)> _update;
|
|
||||||
const Fn<void(bool)> _toggleExpanded;
|
|
||||||
|
|
||||||
State _state = State::Hidden;
|
|
||||||
float64 _finalScale = 0.;
|
|
||||||
Ui::Animations::Simple _scaleAnimation;
|
|
||||||
Ui::Animations::Simple _opacityAnimation;
|
|
||||||
Ui::Animations::Simple _heightAnimation;
|
|
||||||
|
|
||||||
QRect _collapsed;
|
|
||||||
QRect _geometry;
|
|
||||||
int _expandedInnerHeight = 0;
|
|
||||||
int _expandedHeight = 0;
|
|
||||||
int _finalHeight = 0;
|
|
||||||
int _scroll = 0;
|
|
||||||
ExpandDirection _expandDirection = ExpandDirection::Up;
|
|
||||||
CollapseType _collapseType = CollapseType::Scroll;
|
|
||||||
|
|
||||||
base::Timer _expandTimer;
|
|
||||||
base::Timer _hideTimer;
|
|
||||||
std::optional<QPoint> _lastGlobalPosition;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ChosenReaction {
|
|
||||||
FullMsgId context;
|
|
||||||
Data::ReactionId id;
|
|
||||||
std::shared_ptr<Lottie::Icon> icon;
|
|
||||||
QRect geometry;
|
|
||||||
|
|
||||||
explicit operator bool() const {
|
|
||||||
return context && !id.empty();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ExpandRequest {
|
|
||||||
FullMsgId context;
|
|
||||||
QRect button;
|
|
||||||
bool expanded = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
using IconFactory = Fn<std::shared_ptr<Lottie::Icon>(
|
|
||||||
not_null<Data::DocumentMedia*>,
|
|
||||||
int)>;
|
|
||||||
|
|
||||||
class Manager final : public base::has_weak_ptr {
|
|
||||||
public:
|
|
||||||
Manager(
|
|
||||||
QWidget *wheelEventsTarget,
|
|
||||||
rpl::producer<int> uniqueLimitValue,
|
|
||||||
Fn<void(QRect)> buttonUpdate,
|
|
||||||
IconFactory iconFactory);
|
|
||||||
~Manager();
|
|
||||||
|
|
||||||
using ReactionId = ::Data::ReactionId;
|
|
||||||
|
|
||||||
void applyList(
|
|
||||||
const std::vector<Data::Reaction> &list,
|
|
||||||
const ReactionId &favorite,
|
|
||||||
bool premiumPossible);
|
|
||||||
void updateFilter(Data::ReactionsFilter filter);
|
|
||||||
void updateAllowSendingPremium(bool allow);
|
|
||||||
[[nodiscard]] const Data::ReactionsFilter &filter() const;
|
|
||||||
void updateUniqueLimit(not_null<HistoryItem*> item);
|
|
||||||
|
|
||||||
void updateButton(ButtonParameters parameters);
|
|
||||||
void paint(Painter &p, const PaintContext &context);
|
|
||||||
[[nodiscard]] TextState buttonTextState(QPoint position) const;
|
|
||||||
void remove(FullMsgId context);
|
|
||||||
|
|
||||||
[[nodiscard]] bool consumeWheelEvent(not_null<QWheelEvent*> e);
|
|
||||||
|
|
||||||
[[nodiscard]] rpl::producer<ChosenReaction> chosen() const {
|
|
||||||
return _chosen.events();
|
|
||||||
}
|
|
||||||
[[nodiscard]] auto expandSelectorRequests() const
|
|
||||||
-> rpl::producer<ExpandRequest> {
|
|
||||||
return _expandSelectorRequests.events();
|
|
||||||
}
|
|
||||||
void setExternalSelectorShown(rpl::producer<bool> shown);
|
|
||||||
|
|
||||||
[[nodiscard]] std::optional<QRect> lookupEffectArea(
|
|
||||||
FullMsgId itemId) const;
|
|
||||||
void startEffectsCollection();
|
|
||||||
[[nodiscard]] auto currentReactionPaintInfo()
|
|
||||||
-> not_null<Ui::ReactionPaintInfo*>;
|
|
||||||
void recordCurrentReactionEffect(FullMsgId itemId, QPoint origin);
|
|
||||||
|
|
||||||
bool showContextMenu(
|
|
||||||
QWidget *parent,
|
|
||||||
QContextMenuEvent *e,
|
|
||||||
const ReactionId &favorite);
|
|
||||||
[[nodiscard]] rpl::producer<ReactionId> faveRequests() const;
|
|
||||||
|
|
||||||
[[nodiscard]] rpl::lifetime &lifetime() {
|
|
||||||
return _lifetime;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
struct ReactionDocument {
|
|
||||||
std::shared_ptr<Data::DocumentMedia> media;
|
|
||||||
std::shared_ptr<Lottie::Icon> icon;
|
|
||||||
};
|
|
||||||
struct ReactionIcons {
|
|
||||||
ReactionId id;
|
|
||||||
not_null<DocumentData*> appearAnimation;
|
|
||||||
not_null<DocumentData*> selectAnimation;
|
|
||||||
std::shared_ptr<Lottie::Icon> appear;
|
|
||||||
std::shared_ptr<Lottie::Icon> select;
|
|
||||||
mutable ClickHandlerPtr link;
|
|
||||||
mutable Ui::Animations::Simple selectedScale;
|
|
||||||
bool appearAnimated = false;
|
|
||||||
bool premium = false;
|
|
||||||
bool premiumLock = false;
|
|
||||||
mutable bool selected = false;
|
|
||||||
mutable bool selectAnimated = false;
|
|
||||||
};
|
|
||||||
static constexpr auto kFramesCount = Ui::RoundAreaWithShadow::kFramesCount;
|
|
||||||
|
|
||||||
void applyListFilters();
|
|
||||||
void showButtonDelayed();
|
|
||||||
void stealWheelEvents(not_null<QWidget*> target);
|
|
||||||
|
|
||||||
[[nodiscard]] ChosenReaction lookupChosen(const ReactionId &id) const;
|
|
||||||
[[nodiscard]] bool overCurrentButton(QPoint position) const;
|
|
||||||
[[nodiscard]] bool applyUniqueLimit() const;
|
|
||||||
void toggleExpanded(bool expanded);
|
|
||||||
|
|
||||||
void removeStaleButtons();
|
|
||||||
void paintButton(
|
|
||||||
Painter &p,
|
|
||||||
const PaintContext &context,
|
|
||||||
not_null<Button*> button);
|
|
||||||
void paintButton(
|
|
||||||
Painter &p,
|
|
||||||
const PaintContext &context,
|
|
||||||
not_null<Button*> button,
|
|
||||||
int frame,
|
|
||||||
float64 scale);
|
|
||||||
void paintAllEmoji(
|
|
||||||
Painter &p,
|
|
||||||
not_null<Button*> button,
|
|
||||||
int scroll,
|
|
||||||
float64 scale,
|
|
||||||
QPoint position,
|
|
||||||
QPoint mainEmojiPosition);
|
|
||||||
void paintPremiumIcon(QPainter &p, QPoint position, QRectF target) const;
|
|
||||||
void paintInnerGradients(
|
|
||||||
Painter &p,
|
|
||||||
const QColor &background,
|
|
||||||
not_null<Button*> button,
|
|
||||||
int scroll,
|
|
||||||
float64 expandRatio);
|
|
||||||
|
|
||||||
void resolveMainReactionIcon();
|
|
||||||
void setMainReactionIcon();
|
|
||||||
void clearAppearAnimations();
|
|
||||||
[[nodiscard]] QRect cacheRect(int frameIndex, int columnIndex) const;
|
|
||||||
QRect validateEmoji(int frameIndex, float64 scale);
|
|
||||||
|
|
||||||
void setSelectedIcon(int index) const;
|
|
||||||
void clearStateForHidden(ReactionIcons &icon);
|
|
||||||
void clearStateForSelectFinished(ReactionIcons &icon);
|
|
||||||
|
|
||||||
[[nodiscard]] QMargins innerMargins() const;
|
|
||||||
[[nodiscard]] QRect buttonInner() const;
|
|
||||||
[[nodiscard]] QRect buttonInner(not_null<Button*> button) const;
|
|
||||||
|
|
||||||
[[nodiscard]] ClickHandlerPtr computeButtonLink(QPoint position) const;
|
|
||||||
[[nodiscard]] ClickHandlerPtr resolveButtonLink(
|
|
||||||
const ReactionIcons &reaction) const;
|
|
||||||
|
|
||||||
void updateCurrentButton() const;
|
|
||||||
[[nodiscard]] bool onlyMainEmojiVisible() const;
|
|
||||||
[[nodiscard]] bool checkIconLoaded(ReactionDocument &entry) const;
|
|
||||||
void loadIcons();
|
|
||||||
void checkIcons();
|
|
||||||
|
|
||||||
const IconFactory _iconFactory;
|
|
||||||
rpl::event_stream<ChosenReaction> _chosen;
|
|
||||||
rpl::event_stream<ExpandRequest> _expandSelectorRequests;
|
|
||||||
std::vector<ReactionIcons> _list;
|
|
||||||
ReactionId _favorite;
|
|
||||||
Data::ReactionsFilter _filter;
|
|
||||||
QSize _outer;
|
|
||||||
QRect _inner;
|
|
||||||
Ui::RoundAreaWithShadow _cachedRound;
|
|
||||||
QImage _emojiParts;
|
|
||||||
QImage _expandedBuffer;
|
|
||||||
QColor _gradientBackground;
|
|
||||||
QImage _topGradient;
|
|
||||||
QImage _bottomGradient;
|
|
||||||
std::array<bool, kFramesCount> _validEmoji = { { false } };
|
|
||||||
QColor _gradient;
|
|
||||||
|
|
||||||
std::shared_ptr<Data::DocumentMedia> _mainReactionMedia;
|
|
||||||
std::shared_ptr<Lottie::Icon> _mainReactionIcon;
|
|
||||||
QImage _mainReactionImage;
|
|
||||||
rpl::lifetime _mainReactionLifetime;
|
|
||||||
|
|
||||||
rpl::variable<int> _uniqueLimit = 0;
|
|
||||||
base::flat_map<not_null<DocumentData*>, ReactionDocument> _loadCache;
|
|
||||||
std::vector<not_null<ReactionIcons*>> _icons;
|
|
||||||
std::optional<ReactionIcons> _premiumIcon;
|
|
||||||
rpl::lifetime _loadCacheLifetime;
|
|
||||||
bool _showingAll = false;
|
|
||||||
bool _allowSendingPremium = false;
|
|
||||||
bool _premiumPossible = false;
|
|
||||||
mutable int _selectedIcon = -1;
|
|
||||||
|
|
||||||
std::optional<ButtonParameters> _scheduledParameters;
|
|
||||||
base::Timer _buttonShowTimer;
|
|
||||||
const Fn<void(QRect)> _buttonUpdate;
|
|
||||||
std::unique_ptr<Button> _button;
|
|
||||||
std::vector<std::unique_ptr<Button>> _buttonHiding;
|
|
||||||
FullMsgId _buttonContext;
|
|
||||||
base::flat_set<ReactionId> _buttonAlreadyList;
|
|
||||||
int _buttonAlreadyNotMineCount = 0;
|
|
||||||
mutable base::flat_map<ReactionId, ClickHandlerPtr> _reactionsLinks;
|
|
||||||
Fn<Fn<void()>(ReactionId)> _createChooseCallback;
|
|
||||||
|
|
||||||
base::flat_map<FullMsgId, QRect> _activeEffectAreas;
|
|
||||||
|
|
||||||
Ui::ReactionPaintInfo _currentReactionInfo;
|
|
||||||
base::flat_map<FullMsgId, Ui::ReactionPaintInfo> _collectedEffects;
|
|
||||||
|
|
||||||
base::unique_qptr<Ui::PopupMenu> _menu;
|
|
||||||
rpl::event_stream<ReactionId> _faveRequests;
|
|
||||||
bool _externalSelectorShown = false;
|
|
||||||
|
|
||||||
rpl::lifetime _lifetime;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
class CachedIconFactory final {
|
|
||||||
public:
|
|
||||||
CachedIconFactory() = default;
|
|
||||||
CachedIconFactory(const CachedIconFactory &other) = delete;
|
|
||||||
CachedIconFactory &operator=(const CachedIconFactory &other) = delete;
|
|
||||||
|
|
||||||
[[nodiscard]] IconFactory createMethod();
|
|
||||||
|
|
||||||
private:
|
|
||||||
base::flat_map<
|
|
||||||
std::shared_ptr<Data::DocumentMedia>,
|
|
||||||
std::shared_ptr<Lottie::Icon>> _cache;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
void SetupManagerList(
|
|
||||||
not_null<Manager*> manager,
|
|
||||||
not_null<Main::Session*> session,
|
|
||||||
rpl::producer<Data::ReactionsFilter> filter);
|
|
||||||
|
|
||||||
[[nodiscard]] std::shared_ptr<Lottie::Icon> DefaultIconFactory(
|
|
||||||
not_null<Data::DocumentMedia*> media,
|
|
||||||
int size);
|
|
||||||
|
|
||||||
} // namespace HistoryView
|
|
Loading…
Add table
Reference in a new issue