Fix reply-to names in forwarded messages.

This commit is contained in:
John Preston 2022-03-16 11:02:45 +04:00
parent 03d9876c8a
commit efdc39a273
3 changed files with 60 additions and 20 deletions

View File

@ -244,7 +244,7 @@ bool HistoryMessageReply::updateData(
replyToMsg->inReplyText(), replyToMsg->inReplyText(),
Ui::DialogTextOptions()); Ui::DialogTextOptions());
updateName(); updateName(holder);
setReplyToLinkFrom(holder); setReplyToLinkFrom(holder);
if (!replyToMsg->Has<HistoryMessageForwarded>()) { if (!replyToMsg->Has<HistoryMessageForwarded>()) {
@ -283,25 +283,60 @@ void HistoryMessageReply::clearData(not_null<HistoryMessage*> holder) {
refreshReplyToMedia(); refreshReplyToMedia();
} }
bool HistoryMessageReply::isNameUpdated() const { PeerData *HistoryMessageReply::replyToFrom(
if (replyToMsg && replyToMsg->author()->nameVersion > replyToVersion) { not_null<HistoryMessage*> holder) const {
updateName(); if (!replyToMsg) {
return true; return nullptr;
} else if (holder->Has<HistoryMessageForwarded>()) {
if (const auto fwd = replyToMsg->Get<HistoryMessageForwarded>()) {
return fwd->originalSender;
}
}
if (const auto from = replyToMsg->displayFrom()) {
return from;
}
return replyToMsg->author().get();
}
QString HistoryMessageReply::replyToFromName(
not_null<HistoryMessage*> holder) const {
if (!replyToMsg) {
return QString();
} else if (holder->Has<HistoryMessageForwarded>()) {
if (const auto fwd = replyToMsg->Get<HistoryMessageForwarded>()) {
return fwd->originalSender
? replyToFromName(fwd->originalSender)
: fwd->hiddenSenderInfo->name;
}
}
if (const auto from = replyToMsg->displayFrom()) {
return replyToFromName(from);
}
return replyToFromName(replyToMsg->author());
}
QString HistoryMessageReply::replyToFromName(
not_null<PeerData*> peer) const {
if (const auto user = replyToVia ? peer->asUser() : nullptr) {
return user->firstName;
}
return peer->name;
}
bool HistoryMessageReply::isNameUpdated(
not_null<HistoryMessage*> holder) const {
if (const auto from = replyToFrom(holder)) {
if (from->nameVersion > replyToVersion) {
updateName(holder);
return true;
}
} }
return false; return false;
} }
void HistoryMessageReply::updateName() const { void HistoryMessageReply::updateName(
if (replyToMsg) { not_null<HistoryMessage*> holder) const {
const auto from = [&] { if (const auto name = replyToFromName(holder); !name.isEmpty()) {
if (const auto from = replyToMsg->displayFrom()) {
return from;
}
return replyToMsg->author().get();
}();
const auto name = (replyToVia && from->isUser())
? from->asUser()->firstName
: from->name;
replyToName.setText(st::fwdTextStyle, name, Ui::NameTextOptions()); replyToName.setText(st::fwdTextStyle, name, Ui::NameTextOptions());
replyToVersion = replyToMsg->author()->nameVersion; replyToVersion = replyToMsg->author()->nameVersion;
bool hasPreview = replyToMsg->media() ? replyToMsg->media()->hasReplyPreview() : false; bool hasPreview = replyToMsg->media() ? replyToMsg->media()->hasReplyPreview() : false;

View File

@ -154,8 +154,13 @@ struct HistoryMessageReply : public RuntimeComponent<HistoryMessageReply, Histor
// Must be called before destructor. // Must be called before destructor.
void clearData(not_null<HistoryMessage*> holder); void clearData(not_null<HistoryMessage*> holder);
bool isNameUpdated() const; [[nodiscard]] PeerData *replyToFrom(
void updateName() const; not_null<HistoryMessage*> holder) const;
[[nodiscard]] QString replyToFromName(
not_null<HistoryMessage*> holder) const;
[[nodiscard]] QString replyToFromName(not_null<PeerData*> peer) const;
[[nodiscard]] bool isNameUpdated(not_null<HistoryMessage*> holder) const;
void updateName(not_null<HistoryMessage*> holder) const;
void resize(int width) const; void resize(int width) const;
void itemRemoved(HistoryMessage *holder, HistoryItem *removed); void itemRemoved(HistoryMessage *holder, HistoryItem *removed);

View File

@ -460,7 +460,7 @@ QSize Message::performCountOptimalSize() {
forwarded->create(via); forwarded->create(via);
} }
if (reply) { if (reply) {
reply->updateName(); reply->updateName(item);
} }
auto mediaDisplayed = false; auto mediaDisplayed = false;
@ -931,7 +931,7 @@ void Message::draw(Painter &p, const PaintContext &context) const {
} }
if (const auto reply = displayedReply()) { if (const auto reply = displayedReply()) {
if (reply->isNameUpdated()) { if (reply->isNameUpdated(message())) {
const_cast<Message*>(this)->setPendingResize(); const_cast<Message*>(this)->setPendingResize();
} }
} }