Fix reply-to-media timestamps in captions.
This commit is contained in:
parent
0fa458737a
commit
db0c57a186
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 ×tampLinkBase) 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()) {
|
||||||
|
|
|
@ -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 ×tampLinkBase = QString()) const;
|
|
||||||
|
|
||||||
virtual void playAnimation(bool autoplay) {
|
virtual void playAnimation(bool autoplay) {
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue