/* 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/media/history_view_file.h" #include "media/streaming/media_streaming_common.h" struct HistoryMessageVia; struct HistoryMessageReply; struct HistoryMessageForwarded; class Painter; namespace Media { namespace View { class PlaybackProgress; } // namespace View } // namespace Media namespace Media { namespace Streaming { class Instance; struct Update; struct Information; enum class Error; } // namespace Streaming } // namespace Media namespace HistoryView { class Gif final : public File { public: Gif( not_null parent, not_null realParent, not_null document); ~Gif(); void draw(Painter &p, const QRect &r, TextSelection selection, crl::time ms) const override; TextState textState(QPoint point, StateRequest request) const override; [[nodiscard]] TextSelection adjustSelection( TextSelection selection, TextSelectType type) const override { return _caption.adjustSelection(selection, type); } uint16 fullSelectionLength() const override { return _caption.length(); } bool hasTextForCopy() const override { return !_caption.isEmpty(); } TextForMimeData selectedText(TextSelection selection) const override; bool uploading() const override; DocumentData *getDocument() const override { return _data; } QSize sizeForGrouping() const override; void drawGrouped( Painter &p, const QRect &clip, TextSelection selection, crl::time ms, const QRect &geometry, RectParts corners, not_null cacheKey, not_null cache) const override; TextState getStateGrouped( const QRect &geometry, QPoint point, StateRequest request) const override; void stopAnimation() override; void checkAnimation() override; TextWithEntities getCaption() const override { return _caption.toTextWithEntities(); } bool needsBubble() const override; bool customInfoLayout() const override { return _caption.isEmpty(); } QString additionalInfoString() const override; bool skipBubbleTail() const override { return isBubbleBottom() && _caption.isEmpty(); } bool isReadyForOpen() const override; void parentTextUpdated() override; void unloadHeavyPart() override { stopAnimation(); } private: struct Streamed; float64 dataProgress() const override; bool dataFinished() const override; bool dataLoaded() const override; [[nodiscard]] bool autoplayEnabled() const; void playAnimation(bool autoplay) override; QSize countOptimalSize() override; QSize countCurrentSize(int newWidth) override; QSize videoSize() const; ::Media::Streaming::Instance *activeRoundStreamed() const; Streamed *activeOwnStreamed() const; ::Media::Streaming::Instance *activeCurrentStreamed() const; ::Media::View::PlaybackProgress *videoPlayback() const; void createStreamedPlayer(); void startStreamedPlayer() const; void setStreamed(std::unique_ptr value); void handleStreamingUpdate(::Media::Streaming::Update &&update); void handleStreamingError(::Media::Streaming::Error &&error); void streamingReady(::Media::Streaming::Information &&info); void repaintStreamedContent(); bool needInfoDisplay() const; int additionalWidth( const HistoryMessageVia *via, const HistoryMessageReply *reply, const HistoryMessageForwarded *forwarded) const; int additionalWidth() const; QString mediaTypeString() const; bool isSeparateRoundVideo() const; void validateGroupedCache( const QRect &geometry, RectParts corners, not_null cacheKey, not_null cache) const; void setStatusSize(int newSize) const; void updateStatusText() const; QSize sizeForAspectRatio() const; [[nodiscard]] bool downloadInCorner() const; void drawCornerStatus(Painter &p, bool selected) const; [[nodiscard]] TextState cornerStatusTextState( QPoint point, StateRequest request) const; not_null _data; int _thumbw = 1; int _thumbh = 1; Ui::Text::String _caption; std::unique_ptr _streamed; QString _downloadSize; }; } // namespace HistoryView