diff --git a/Telegram/SourceFiles/data/data_document.cpp b/Telegram/SourceFiles/data/data_document.cpp index d29c99828e..34d3a7304c 100644 --- a/Telegram/SourceFiles/data/data_document.cpp +++ b/Telegram/SourceFiles/data/data_document.cpp @@ -1084,13 +1084,19 @@ bool DocumentData::isStickerSetInstalled() const { } } -Image *DocumentData::getReplyPreview(Data::FileOrigin origin) { +Image *DocumentData::getReplyPreview( + Data::FileOrigin origin, + not_null context) { if (!hasThumbnail()) { return nullptr; } else if (!_replyPreview) { _replyPreview = std::make_unique(this); } - return _replyPreview->image(origin); + return _replyPreview->image(origin, context); +} + +Image *DocumentData::getReplyPreview(not_null item) { + return getReplyPreview(item->fullId(), item->history()->peer); } bool DocumentData::replyPreviewLoaded() const { diff --git a/Telegram/SourceFiles/data/data_document.h b/Telegram/SourceFiles/data/data_document.h index 1b8c3da61e..2275094b27 100644 --- a/Telegram/SourceFiles/data/data_document.h +++ b/Telegram/SourceFiles/data/data_document.h @@ -115,7 +115,8 @@ public: void setWaitingForAlbum(); [[nodiscard]] bool waitingForAlbum() const; - [[nodiscard]] const Core::FileLocation &location(bool check = false) const; + [[nodiscard]] const Core::FileLocation &location( + bool check = false) const; void setLocation(const Core::FileLocation &loc); bool saveFromData(); @@ -124,7 +125,10 @@ public: [[nodiscard]] bool saveToCache() const; - [[nodiscard]] Image *getReplyPreview(Data::FileOrigin origin); + [[nodiscard]] Image *getReplyPreview( + Data::FileOrigin origin, + not_null context); + [[nodiscard]] Image *getReplyPreview(not_null item); [[nodiscard]] bool replyPreviewLoaded() const; [[nodiscard]] StickerData *sticker() const; diff --git a/Telegram/SourceFiles/data/data_media_types.cpp b/Telegram/SourceFiles/data/data_media_types.cpp index ae4d3c25ab..4be34f0f09 100644 --- a/Telegram/SourceFiles/data/data_media_types.cpp +++ b/Telegram/SourceFiles/data/data_media_types.cpp @@ -164,18 +164,8 @@ using ItemPreviewImage = HistoryView::ItemPreviewImage; } else if (const auto large = media->image(PhotoSize::Large)) { return { PreparePreviewImage(large, radius), readyCacheKey }; } - const auto allowedToDownload = [&] { - const auto photo = media->owner(); - if (media->loaded() || photo->cancelled()) { - return false; - } - return photo->hasExact(PhotoSize::Small) - || photo->hasExact(PhotoSize::Thumbnail) - || AutoDownload::Should( - photo->session().settings().autoDownload(), - item->history()->peer, - photo); - }(); + const auto allowedToDownload = media->autoLoadThumbnailAllowed( + item->history()->peer); const auto cacheKey = allowedToDownload ? 0 : readyCacheKey; if (allowedToDownload) { media->owner()->load(PhotoSize::Small, item->fullId()); @@ -533,7 +523,7 @@ bool MediaPhoto::hasReplyPreview() const { } Image *MediaPhoto::replyPreview() const { - return _photo->getReplyPreview(parent()->fullId()); + return _photo->getReplyPreview(parent()); } bool MediaPhoto::replyPreviewLoaded() const { @@ -738,7 +728,7 @@ bool MediaFile::hasReplyPreview() const { } Image *MediaFile::replyPreview() const { - return _document->getReplyPreview(parent()->fullId()); + return _document->getReplyPreview(parent()); } bool MediaFile::replyPreviewLoaded() const { @@ -1295,9 +1285,9 @@ bool MediaWebPage::hasReplyPreview() const { Image *MediaWebPage::replyPreview() const { if (const auto document = MediaWebPage::document()) { - return document->getReplyPreview(parent()->fullId()); + return document->getReplyPreview(parent()); } else if (const auto photo = MediaWebPage::photo()) { - return photo->getReplyPreview(parent()->fullId()); + return photo->getReplyPreview(parent()); } return nullptr; } @@ -1368,9 +1358,9 @@ bool MediaGame::hasReplyPreview() const { Image *MediaGame::replyPreview() const { if (const auto document = _game->document) { - return document->getReplyPreview(parent()->fullId()); + return document->getReplyPreview(parent()); } else if (const auto photo = _game->photo) { - return photo->getReplyPreview(parent()->fullId()); + return photo->getReplyPreview(parent()); } return nullptr; } @@ -1478,7 +1468,7 @@ bool MediaInvoice::hasReplyPreview() const { Image *MediaInvoice::replyPreview() const { if (const auto photo = _invoice.photo) { - return photo->getReplyPreview(parent()->fullId()); + return photo->getReplyPreview(parent()); } return nullptr; } diff --git a/Telegram/SourceFiles/data/data_photo.cpp b/Telegram/SourceFiles/data/data_photo.cpp index 08676cad0b..153456d523 100644 --- a/Telegram/SourceFiles/data/data_photo.cpp +++ b/Telegram/SourceFiles/data/data_photo.cpp @@ -13,6 +13,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_photo_media.h" #include "ui/image/image.h" #include "main/main_session.h" +#include "history/history.h" +#include "history/history_item.h" #include "media/streaming/media_streaming_loader_local.h" #include "media/streaming/media_streaming_loader_mtproto.h" #include "mainwidget.h" @@ -206,11 +208,17 @@ bool PhotoData::uploading() const { return (uploadingData != nullptr); } -Image *PhotoData::getReplyPreview(Data::FileOrigin origin) { +Image *PhotoData::getReplyPreview( + Data::FileOrigin origin, + not_null context) { if (!_replyPreview) { _replyPreview = std::make_unique(this); } - return _replyPreview->image(origin); + return _replyPreview->image(origin, context); +} + +Image *PhotoData::getReplyPreview(not_null item) { + return getReplyPreview(item->fullId(), item->history()->peer); } bool PhotoData::replyPreviewLoaded() const { diff --git a/Telegram/SourceFiles/data/data_photo.h b/Telegram/SourceFiles/data/data_photo.h index 4922b28d37..4e61279656 100644 --- a/Telegram/SourceFiles/data/data_photo.h +++ b/Telegram/SourceFiles/data/data_photo.h @@ -64,7 +64,10 @@ public: void setWaitingForAlbum(); [[nodiscard]] bool waitingForAlbum() const; - [[nodiscard]] Image *getReplyPreview(Data::FileOrigin origin); + [[nodiscard]] Image *getReplyPreview( + Data::FileOrigin origin, + not_null context); + [[nodiscard]] Image *getReplyPreview(not_null item); [[nodiscard]] bool replyPreviewLoaded() const; void setRemoteLocation( diff --git a/Telegram/SourceFiles/data/data_photo_media.cpp b/Telegram/SourceFiles/data/data_photo_media.cpp index 19035b346f..620d7429e0 100644 --- a/Telegram/SourceFiles/data/data_photo_media.cpp +++ b/Telegram/SourceFiles/data/data_photo_media.cpp @@ -128,6 +128,18 @@ float64 PhotoMedia::progress() const { : (loaded() ? 1. : 0.); } +bool PhotoMedia::autoLoadThumbnailAllowed(not_null peer) const { + if (loaded() || _owner->cancelled()) { + return false; + } + return _owner->hasExact(PhotoSize::Small) + || _owner->hasExact(PhotoSize::Thumbnail) + || AutoDownload::Should( + _owner->session().settings().autoDownload(), + peer, + _owner); +} + void PhotoMedia::automaticLoad( Data::FileOrigin origin, const HistoryItem *item) { diff --git a/Telegram/SourceFiles/data/data_photo_media.h b/Telegram/SourceFiles/data/data_photo_media.h index 42f52b8051..7a8b095d93 100644 --- a/Telegram/SourceFiles/data/data_photo_media.h +++ b/Telegram/SourceFiles/data/data_photo_media.h @@ -36,6 +36,8 @@ public: [[nodiscard]] bool loaded() const; [[nodiscard]] float64 progress() const; + [[nodiscard]] bool autoLoadThumbnailAllowed( + not_null peer) const; void automaticLoad(Data::FileOrigin origin, const HistoryItem *item); void collectLocalData(not_null local); diff --git a/Telegram/SourceFiles/data/data_reply_preview.cpp b/Telegram/SourceFiles/data/data_reply_preview.cpp index 1067e2346b..39da244df4 100644 --- a/Telegram/SourceFiles/data/data_reply_preview.cpp +++ b/Telegram/SourceFiles/data/data_reply_preview.cpp @@ -55,7 +55,9 @@ void ReplyPreview::prepare(not_null image, Images::Options options) { _good = ((options & Images::Option::Blurred) == 0); } -Image *ReplyPreview::image(Data::FileOrigin origin) { +Image *ReplyPreview::image( + Data::FileOrigin origin, + not_null context) { if (_checked) { return _image.get(); } @@ -84,8 +86,14 @@ Image *ReplyPreview::image(Data::FileOrigin origin) { } else { Assert(_photo != nullptr); if (!_image || !_good) { + const auto createMedia = !_photoMedia; + const auto inlineThumbnailBytes = _photo->inlineThumbnailBytes(); if (!_photoMedia) { _photoMedia = _photo->createMediaView(); + } + const auto loadThumbnail = inlineThumbnailBytes.isEmpty() + || _photoMedia->autoLoadThumbnailAllowed(context); + if (loadThumbnail) { _photoMedia->wanted(PhotoSize::Small, origin); } if (const auto small = _photoMedia->image(PhotoSize::Small)) { diff --git a/Telegram/SourceFiles/data/data_reply_preview.h b/Telegram/SourceFiles/data/data_reply_preview.h index 01314e7efd..04abeb4331 100644 --- a/Telegram/SourceFiles/data/data_reply_preview.h +++ b/Telegram/SourceFiles/data/data_reply_preview.h @@ -23,7 +23,9 @@ public: explicit ReplyPreview(not_null photo); ~ReplyPreview(); - [[nodiscard]] Image *image(Data::FileOrigin origin); + [[nodiscard]] Image *image( + Data::FileOrigin origin, + not_null context); [[nodiscard]] bool loaded() const; private: diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 9eec7f22a9..863f8da9e1 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -7162,7 +7162,7 @@ void HistoryWidget::drawField(Painter &p, const QRect &rect) { textTop, st::msgReplyBarSize.height(), st::msgReplyBarSize.height()); - if (HistoryView::DrawWebPageDataPreview(p, _previewData, to)) { + if (HistoryView::DrawWebPageDataPreview(p, _previewData, _peer, to)) { previewLeft += st::msgReplyBarSize.height() + st::msgReplyBarSkip - st::msgReplyBarSize.width() diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp index 599a7cfe8f..fa34f92a83 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp @@ -105,6 +105,7 @@ class FieldHeader final : public Ui::RpWidget { public: FieldHeader(QWidget *parent, not_null data); + void setHistory(const SetHistoryArgs &args); void init(); void editMessage(FullMsgId id); @@ -142,7 +143,7 @@ private: void resolveMessageData(); void updateShownMessageText(); - void paintWebPage(Painter &p); + void paintWebPage(Painter &p, not_null peer); void paintEditOrReplyToMessage(Painter &p); struct Preview { @@ -152,6 +153,7 @@ private: bool cancelled = false; }; + History *_history = nullptr; rpl::variable _title; rpl::variable _description; @@ -188,6 +190,10 @@ FieldHeader::FieldHeader(QWidget *parent, not_null data) init(); } +void FieldHeader::setHistory(const SetHistoryArgs &args) { + _history = *args.history; +} + void FieldHeader::init() { sizeValue( ) | rpl::start_with_next([=](QSize size) { @@ -209,7 +215,9 @@ void FieldHeader::init() { (!ShowWebPagePreview(_preview.data) || *leftIconPressed) ? paintEditOrReplyToMessage(p) - : paintWebPage(p); + : paintWebPage( + p, + _history ? _history->peer : _data->session().user()); }, lifetime()); _editMsgId.value( @@ -415,7 +423,7 @@ void FieldHeader::previewRequested( } -void FieldHeader::paintWebPage(Painter &p) { +void FieldHeader::paintWebPage(Painter &p, not_null context) { Expects(ShowWebPagePreview(_preview.data)); const auto textTop = st::msgReplyPadding.top(); @@ -432,7 +440,7 @@ void FieldHeader::paintWebPage(Painter &p) { textTop, st::msgReplyBarSize.height(), st::msgReplyBarSize.height()); - if (HistoryView::DrawWebPageDataPreview(p, _preview.data, to)) { + if (HistoryView::DrawWebPageDataPreview(p, _preview.data, context, to)) { previewLeft += st::msgReplyBarSize.height() + st::msgReplyBarSkip - st::msgReplyBarSize.width() @@ -655,6 +663,7 @@ void ComposeControls::setHistory(SetHistoryArgs &&args) { //} unregisterDraftSources(); _history = history; + _header->setHistory(args); registerDraftSource(); _window->tabbedSelector()->setCurrentPeer( history ? history->peer.get() : nullptr); diff --git a/Telegram/SourceFiles/history/view/history_view_webpage_preview.cpp b/Telegram/SourceFiles/history/view/history_view_webpage_preview.cpp index d7d5398c9e..01b83838e9 100644 --- a/Telegram/SourceFiles/history/view/history_view_webpage_preview.cpp +++ b/Telegram/SourceFiles/history/view/history_view_webpage_preview.cpp @@ -56,9 +56,13 @@ WebPageText TitleAndDescriptionFromWebPage(not_null d) { return { resultTitle, resultDescription }; } -bool DrawWebPageDataPreview(Painter &p, not_null d, QRect to) { - const auto document = d->document; - const auto photo = d->photo; +bool DrawWebPageDataPreview( + Painter &p, + not_null webpage, + not_null context, + QRect to) { + const auto document = webpage->document; + const auto photo = webpage->photo; if ((!photo || photo->isNull()) && (!document || !document->hasThumbnail() @@ -67,8 +71,8 @@ bool DrawWebPageDataPreview(Painter &p, not_null d, QRect to) { } const auto preview = photo - ? photo->getReplyPreview(Data::FileOrigin()) - : document->getReplyPreview(Data::FileOrigin()); + ? photo->getReplyPreview(Data::FileOrigin(), context) + : document->getReplyPreview(Data::FileOrigin(), context); if (preview) { const auto w = preview->width(); const auto h = preview->height(); diff --git a/Telegram/SourceFiles/history/view/history_view_webpage_preview.h b/Telegram/SourceFiles/history/view/history_view_webpage_preview.h index 54594c28a6..e20ad9232f 100644 --- a/Telegram/SourceFiles/history/view/history_view_webpage_preview.h +++ b/Telegram/SourceFiles/history/view/history_view_webpage_preview.h @@ -15,6 +15,10 @@ struct WebPageText { }; WebPageText TitleAndDescriptionFromWebPage(not_null d); -bool DrawWebPageDataPreview(Painter &p, not_null d, QRect to); +bool DrawWebPageDataPreview( + Painter &p, + not_null webpage, + not_null context, + QRect to); } // namespace HistoryView