/* 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/history_media.h" #include "data/data_document.h" #include "data/data_photo.h" class HistoryGroupedMedia : public HistoryMedia { public: HistoryGroupedMedia( not_null parent, const std::vector> &others); HistoryMediaType type() const override { return MediaTypeGrouped; } std::unique_ptr clone( not_null newParent, not_null realParent) const override; void refreshParentId(not_null realParent) override; void updateSentMedia(const MTPMessageMedia &media) override; bool needReSetInlineResultMedia(const MTPMessageMedia &media) override; void draw( Painter &p, const QRect &clip, TextSelection selection, TimeMs ms) const override; HistoryTextState getState( QPoint point, HistoryStateRequest request) const override; bool toggleSelectionByHandlerClick( const ClickHandlerPtr &p) const override; bool dragItemByHandler(const ClickHandlerPtr &p) const override; [[nodiscard]] TextSelection adjustSelection( TextSelection selection, TextSelectType type) const override; uint16 fullSelectionLength() const override { return _caption.length(); } bool hasTextForCopy() const override { return !_caption.isEmpty(); } PhotoData *getPhoto() const override; DocumentData *getDocument() const override; QString notificationText() const override; QString inDialogsText() const override; TextWithEntities selectedText(TextSelection selection) const override; void clickHandlerActiveChanged( const ClickHandlerPtr &p, bool active) override; void clickHandlerPressedChanged( const ClickHandlerPtr &p, bool pressed) override; void attachToParent() override; void detachFromParent() override; std::unique_ptr takeLastFromGroup() override; bool applyGroup( const std::vector> &others) override; bool hasReplyPreview() const override; ImagePtr replyPreview() override; TextWithEntities getCaption() const override; Storage::SharedMediaTypesMask sharedMediaTypes() const override; bool overrideEditedDate() const override { return true; } HistoryMessageEdited *displayedEditBadge() const override; bool canBeGrouped() const override { return true; } bool skipBubbleTail() const override { return isBubbleBottom() && _caption.isEmpty(); } void updateNeedBubbleState() override; bool needsBubble() const override; bool customInfoLayout() const override { return _caption.isEmpty(); } bool canEditCaption() const override; bool allowsFastShare() const override { return true; } private: struct Element { Element(not_null item); not_null item; std::unique_ptr content; RectParts sides = RectPart::None; QRect initialGeometry; QRect geometry; mutable uint64 cacheKey = 0; mutable QPixmap cache; }; QSize countOptimalSize() override; QSize countCurrentSize(int newWidth) override; bool needInfoDisplay() const; bool computeNeedBubble() const; not_null main() const; bool validateGroupElements( const std::vector> &others) const; HistoryTextState getElementState( QPoint point, HistoryStateRequest request) const; Text _caption; std::vector _elements; bool _needBubble = false; };