std::unique_ptr<HistoryMedia> CreateAttach( not_null<HistoryView::Element*> parent, DocumentData *document, PhotoData *photo, const std::vector<std::unique_ptr<Data::Media>> &collage, const QString &webpageUrl) { if (!collage.empty()) { return std::make_unique<HistoryGroupedMedia>(parent, collage); } else if (document) { if (document->sticker()) { return std::make_unique<HistorySticker>(parent, document); } else if (document->isAnimation()) { return std::make_unique<HistoryGif>(parent, document); } else if (document->isVideoFile()) { return std::make_unique<HistoryVideo>( parent, parent->data(), document); } else if (document->isWallPaper()) { return std::make_unique<HistoryWallPaper>( parent, document, webpageUrl); } return std::make_unique<HistoryDocument>(parent, document); } else if (photo) { return std::make_unique<HistoryPhoto>( parent, parent->data(), photo); } return nullptr; }
HistoryPhoto::HistoryPhoto( not_null<Element*> parent, not_null<PeerData*> chat, not_null<PhotoData*> photo, int width) : HistoryFileMedia(parent, parent->data()) , _data(photo) , _serviceWidth(width) { create(parent->data()->fullId(), chat); }
HistoryGame::HistoryGame( not_null<Element*> parent, not_null<GameData*> data, const TextWithEntities &consumed) : HistoryMedia(parent) , _data(data) , _title(st::msgMinWidth - st::webPageLeft) , _description(st::msgMinWidth - st::webPageLeft) { if (!consumed.text.isEmpty()) { _description.setMarkedText( st::webPageDescriptionStyle, consumed, Ui::ItemTextOptions(parent->data())); } history()->owner().registerGameView(_data, _parent); }
bool Element::computeIsAttachToPrevious(not_null<Element*> previous) { const auto item = data(); if (!Has<DateBadge>() && !Has<UnreadBar>()) { const auto prev = previous->data(); const auto possible = !item->serviceMsg() && !prev->serviceMsg() && !item->isEmpty() && !prev->isEmpty() && (std::abs(prev->date() - item->date()) < kAttachMessageToPreviousSecondsDelta) && (_context == Context::Feed || (!item->isPost() && !prev->isPost())); if (possible) { if (item->history()->peer->isSelf()) { return prev->senderOriginal() == item->senderOriginal() && (prev->Has<HistoryMessageForwarded>() == item->Has<HistoryMessageForwarded>()); } else { return prev->from() == item->from(); } } } return false; }