Fix reply-to-media timestamps in captions.

This commit is contained in:
John Preston 2021-12-02 14:42:33 +04:00
parent 0fa458737a
commit db0c57a186
8 changed files with 32 additions and 57 deletions

View File

@ -343,6 +343,10 @@ public:
[[nodiscard]] virtual TextWithEntities originalText() const { [[nodiscard]] virtual TextWithEntities originalText() const {
return TextWithEntities(); return TextWithEntities();
} }
[[nodiscard]] virtual auto originalTextWithLocalEntities() const
-> TextWithEntities {
return TextWithEntities();
}
[[nodiscard]] virtual TextForMimeData clipboardText() const { [[nodiscard]] virtual TextForMimeData clipboardText() const {
return TextForMimeData(); return TextForMimeData();
} }

View File

@ -1536,19 +1536,31 @@ Storage::SharedMediaTypesMask HistoryMessage::sharedMediaTypes() const {
} }
bool HistoryMessage::generateLocalEntitiesByReply() const { bool HistoryMessage::generateLocalEntitiesByReply() const {
using namespace HistoryView;
if (!_media) { if (!_media) {
return true; return true;
} else if (const auto document = _media->document()) {
return !DurationForTimestampLinks(document);
} else if (const auto webpage = _media->webpage()) { } else if (const auto webpage = _media->webpage()) {
return !webpage->document && webpage->type != WebPageType::Video; return (webpage->type != WebPageType::Video)
&& !DurationForTimestampLinks(webpage);
} }
return false; return true;
} }
TextWithEntities HistoryMessage::withLocalEntities( TextWithEntities HistoryMessage::withLocalEntities(
const TextWithEntities &textWithEntities) const { const TextWithEntities &textWithEntities) const {
using namespace HistoryView; using namespace HistoryView;
if (!generateLocalEntitiesByReply()) { if (!generateLocalEntitiesByReply()) {
if (const auto webpage = _media ? _media->webpage() : nullptr) { if (!_media) {
} else if (const auto document = _media->document()) {
if (const auto duration = DurationForTimestampLinks(document)) {
return AddTimestampLinks(
textWithEntities,
duration,
TimestampLinkBase(document, fullId()));
}
} else if (const auto webpage = _media->webpage()) {
if (const auto duration = DurationForTimestampLinks(webpage)) { if (const auto duration = DurationForTimestampLinks(webpage)) {
return AddTimestampLinks( return AddTimestampLinks(
textWithEntities, textWithEntities,
@ -1712,6 +1724,10 @@ TextWithEntities HistoryMessage::originalText() const {
return _text.toTextWithEntities(); return _text.toTextWithEntities();
} }
TextWithEntities HistoryMessage::originalTextWithLocalEntities() const {
return withLocalEntities(originalText());
}
TextForMimeData HistoryMessage::clipboardText() const { TextForMimeData HistoryMessage::clipboardText() const {
if (emptyText()) { if (emptyText()) {
return TextForMimeData(); return TextForMimeData();

View File

@ -173,6 +173,8 @@ public:
void setText(const TextWithEntities &textWithEntities) override; void setText(const TextWithEntities &textWithEntities) override;
[[nodiscard]] Ui::Text::IsolatedEmoji isolatedEmoji() const override; [[nodiscard]] Ui::Text::IsolatedEmoji isolatedEmoji() const override;
[[nodiscard]] TextWithEntities originalText() const override; [[nodiscard]] TextWithEntities originalText() const override;
[[nodiscard]] auto originalTextWithLocalEntities() const
-> TextWithEntities override;
[[nodiscard]] TextForMimeData clipboardText() const override; [[nodiscard]] TextForMimeData clipboardText() const override;
[[nodiscard]] bool textHasLinks() const override; [[nodiscard]] bool textHasLinks() const override;

View File

@ -1084,14 +1084,7 @@ TextWithEntities Document::getCaption() const {
} }
Ui::Text::String Document::createCaption() { Ui::Text::String Document::createCaption() {
const auto timestampLinksDuration = DurationForTimestampLinks(_data); return File::createCaption(_realParent);
const auto timestampLinkBase = timestampLinksDuration
? TimestampLinkBase(_data, _realParent->fullId())
: QString();
return File::createCaption(
_realParent,
timestampLinksDuration,
timestampLinkBase);
} }
bool DrawThumbnailAsSongCover( bool DrawThumbnailAsSongCover(

View File

@ -1322,14 +1322,7 @@ void Gif::refreshParentId(not_null<HistoryItem*> realParent) {
} }
void Gif::refreshCaption() { void Gif::refreshCaption() {
const auto timestampLinksDuration = DurationForTimestampLinks(_data); _caption = createCaption(_parent->data());
const auto timestampLinkBase = timestampLinksDuration
? TimestampLinkBase(_data, _realParent->fullId())
: QString();
_caption = createCaption(
_parent->data(),
timestampLinksDuration,
timestampLinkBase);
} }
int Gif::additionalWidth(const HistoryMessageVia *via, const HistoryMessageReply *reply, const HistoryMessageForwarded *forwarded) const { int Gif::additionalWidth(const HistoryMessageVia *via, const HistoryMessageReply *reply, const HistoryMessageForwarded *forwarded) const {

View File

@ -64,7 +64,7 @@ QString TimestampLinkBase(
TimeId DurationForTimestampLinks(not_null<WebPageData*> webpage) { TimeId DurationForTimestampLinks(not_null<WebPageData*> webpage) {
if (!webpage->collage.items.empty()) { if (!webpage->collage.items.empty()) {
return false; return 0;
} else if (const auto document = webpage->document) { } else if (const auto document = webpage->document) {
return DurationForTimestampLinks(document); return DurationForTimestampLinks(document);
} else if (webpage->type != WebPageType::Video } else if (webpage->type != WebPageType::Video
@ -185,12 +185,7 @@ QSize Media::countCurrentSize(int newWidth) {
return QSize(qMin(newWidth, maxWidth()), minHeight()); return QSize(qMin(newWidth, maxWidth()), minHeight());
} }
Ui::Text::String Media::createCaption( Ui::Text::String Media::createCaption(not_null<HistoryItem*> item) const {
not_null<HistoryItem*> item,
TimeId timestampLinksDuration,
const QString &timestampLinkBase) const {
Expects(timestampLinksDuration >= 0);
if (item->emptyText()) { if (item->emptyText()) {
return {}; return {};
} }
@ -203,12 +198,7 @@ Ui::Text::String Media::createCaption(
}; };
result.setMarkedText( result.setMarkedText(
st::messageTextStyle, st::messageTextStyle,
(timestampLinksDuration item->originalTextWithLocalEntities(),
? AddTimestampLinks(
item->originalText(),
timestampLinksDuration,
timestampLinkBase)
: item->originalText()),
Ui::ItemTextOptions(item), Ui::ItemTextOptions(item),
context); context);
if (const auto width = _parent->skipBlockWidth()) { if (const auto width = _parent->skipBlockWidth()) {

View File

@ -297,9 +297,7 @@ public:
protected: protected:
[[nodiscard]] QSize countCurrentSize(int newWidth) override; [[nodiscard]] QSize countCurrentSize(int newWidth) override;
[[nodiscard]] Ui::Text::String createCaption( [[nodiscard]] Ui::Text::String createCaption(
not_null<HistoryItem*> item, not_null<HistoryItem*> item) const;
TimeId timestampLinksDuration = 0,
const QString &timestampLinkBase = QString()) const;
virtual void playAnimation(bool autoplay) { virtual void playAnimation(bool autoplay) {
} }

View File

@ -672,28 +672,7 @@ void GroupedMedia::updateNeedBubbleState() {
}(); }();
if (captionPart) { if (captionPart) {
const auto &part = (*captionPart); const auto &part = (*captionPart);
struct Timestamp { _caption = createCaption(part->item);
int duration = 0;
QString base;
};
const auto timestamp = [&]() -> Timestamp {
const auto document = part->content->getDocument();
const auto duration = document
? DurationForTimestampLinks(document)
: TimeId(0);
if (!duration) {
return {};
}
return {
.duration = duration,
.base = TimestampLinkBase(document, part->item->fullId()),
};
}();
_caption = createCaption(
part->item,
timestamp.duration,
timestamp.base);
_captionItem = part->item; _captionItem = part->item;
} else { } else {
_captionItem = nullptr; _captionItem = nullptr;