mirror of
https://github.com/vale981/tdesktop
synced 2025-03-05 09:41:41 -05:00
Display right edited badge in group with caption.
This commit is contained in:
parent
1f070da202
commit
89ccaccb88
9 changed files with 117 additions and 52 deletions
|
@ -2774,8 +2774,9 @@ QString HistoryInner::tooltipText() const {
|
|||
if (_mouseCursorState == HistoryInDateCursorState && _mouseAction == MouseAction::None) {
|
||||
if (App::hoveredItem()) {
|
||||
auto dateText = App::hoveredItem()->date.toString(QLocale::system().dateTimeFormat(QLocale::LongFormat));
|
||||
if (auto edited = App::hoveredItem()->Get<HistoryMessageEdited>()) {
|
||||
dateText += '\n' + lng_edited_date(lt_date, edited->_editDate.toString(QLocale::system().dateTimeFormat(QLocale::LongFormat)));
|
||||
auto editedDate = App::hoveredItem()->displayedEditDate();
|
||||
if (!editedDate.isNull()) {
|
||||
dateText += '\n' + lng_edited_date(lt_date, editedDate.toString(QLocale::system().dateTimeFormat(QLocale::LongFormat)));
|
||||
}
|
||||
if (auto forwarded = App::hoveredItem()->Get<HistoryMessageForwarded>()) {
|
||||
dateText += '\n' + lng_forwarded_date(lt_date, forwarded->_originalDate.toString(QLocale::system().dateTimeFormat(QLocale::LongFormat)));
|
||||
|
|
|
@ -1198,8 +1198,8 @@ void HistoryItem::makeGroupLeader(
|
|||
const auto group = Get<HistoryMessageGroup>();
|
||||
Assert(group != nullptr);
|
||||
|
||||
if (group->leader != this) {
|
||||
group->leader = this;
|
||||
const auto leaderChanged = (group->leader != this);
|
||||
if (leaderChanged) {
|
||||
_flags &= ~MTPDmessage_ClientFlag::f_hidden_by_group;
|
||||
setPendingInitDimensions();
|
||||
}
|
||||
|
|
|
@ -149,11 +149,11 @@ struct HistoryMessageSigned : public RuntimeComponent<HistoryMessageSigned> {
|
|||
};
|
||||
|
||||
struct HistoryMessageEdited : public RuntimeComponent<HistoryMessageEdited> {
|
||||
void create(const QDateTime &editDate, const QString &date);
|
||||
void refresh(const QString &date, bool displayed);
|
||||
int maxWidth() const;
|
||||
|
||||
QDateTime _editDate;
|
||||
Text _edited;
|
||||
QDateTime date;
|
||||
Text text;
|
||||
};
|
||||
|
||||
struct HistoryMessageForwarded : public RuntimeComponent<HistoryMessageForwarded> {
|
||||
|
@ -776,6 +776,15 @@ public:
|
|||
}
|
||||
virtual void setId(MsgId newId);
|
||||
|
||||
virtual bool displayEditedBadge() const {
|
||||
return false;
|
||||
}
|
||||
virtual QDateTime displayedEditDate() const {
|
||||
return QDateTime();
|
||||
}
|
||||
virtual void refreshEditedBadge() {
|
||||
}
|
||||
|
||||
void drawInDialog(
|
||||
Painter &p,
|
||||
const QRect &r,
|
||||
|
|
|
@ -227,6 +227,13 @@ public:
|
|||
return false;
|
||||
}
|
||||
|
||||
virtual bool overrideEditedDate() const {
|
||||
return false;
|
||||
}
|
||||
virtual HistoryMessageEdited *displayedEditBadge() const {
|
||||
Unexpected("displayedEditBadge() on non-grouped media.");
|
||||
}
|
||||
|
||||
// An attach media in a web page can provide an
|
||||
// additional text to be displayed below the attach.
|
||||
// For example duration / progress for video messages.
|
||||
|
|
|
@ -401,6 +401,13 @@ Storage::SharedMediaTypesMask HistoryGroupedMedia::sharedMediaTypes() const {
|
|||
return main()->sharedMediaTypes();
|
||||
}
|
||||
|
||||
HistoryMessageEdited *HistoryGroupedMedia::displayedEditBadge() const {
|
||||
if (!_caption.isEmpty()) {
|
||||
return _elements.front().item->Get<HistoryMessageEdited>();
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void HistoryGroupedMedia::updateNeedBubbleState() {
|
||||
const auto getItemCaption = [](const Element &element) {
|
||||
if (const auto media = element.item->getMedia()) {
|
||||
|
|
|
@ -94,6 +94,11 @@ public:
|
|||
TextWithEntities getCaption() const override;
|
||||
Storage::SharedMediaTypesMask sharedMediaTypes() const override;
|
||||
|
||||
bool overrideEditedDate() const override {
|
||||
return true;
|
||||
}
|
||||
HistoryMessageEdited *displayedEditBadge() const;
|
||||
|
||||
bool canBeGrouped() const override {
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1551,7 +1551,7 @@ void HistoryDocument::initDimensions() {
|
|||
} else {
|
||||
_minh = st::msgFilePadding.top() + st::msgFileSize + st::msgFilePadding.bottom();
|
||||
}
|
||||
if (!captioned && (_parent->Has<HistoryMessageSigned>() || _parent->Has<HistoryMessageEdited>())) {
|
||||
if (!captioned && (_parent->Has<HistoryMessageSigned>() || _parent->displayEditedBadge())) {
|
||||
_minh += st::msgDateFont->height - st::msgDateDelta.y();
|
||||
}
|
||||
if (!isBubbleTop()) {
|
||||
|
|
|
@ -398,13 +398,13 @@ int HistoryMessageSigned::maxWidth() const {
|
|||
return _signature.maxWidth();
|
||||
}
|
||||
|
||||
void HistoryMessageEdited::create(const QDateTime &editDate, const QString &date) {
|
||||
_editDate = editDate;
|
||||
_edited.setText(st::msgDateTextStyle, lang(lng_edited) + ' ' + date, _textNameOptions);
|
||||
void HistoryMessageEdited::refresh(const QString &date, bool displayed) {
|
||||
const auto prefix = displayed ? (lang(lng_edited) + ' ') : QString();
|
||||
text.setText(st::msgDateTextStyle, prefix + date, _textNameOptions);
|
||||
}
|
||||
|
||||
int HistoryMessageEdited::maxWidth() const {
|
||||
return _edited.maxWidth();
|
||||
return text.maxWidth();
|
||||
}
|
||||
|
||||
void HistoryMessageForwarded::create(const HistoryMessageVia *via) const {
|
||||
|
@ -953,18 +953,43 @@ void HistoryMessage::applyGroupAdminChanges(
|
|||
}
|
||||
}
|
||||
|
||||
bool HistoryMessage::displayEditedBadge(bool hasViaBotOrInlineMarkup) const {
|
||||
bool HistoryMessage::displayEditedBadge() const {
|
||||
return !displayedEditDate().isNull();
|
||||
}
|
||||
|
||||
QDateTime HistoryMessage::displayedEditDate() const {
|
||||
auto hasViaBotId = Has<HistoryMessageVia>();
|
||||
auto hasInlineMarkup = (inlineReplyMarkup() != nullptr);
|
||||
return displayedEditDate(hasViaBotId || hasInlineMarkup);
|
||||
}
|
||||
|
||||
QDateTime HistoryMessage::displayedEditDate(
|
||||
bool hasViaBotOrInlineMarkup) const {
|
||||
if (hasViaBotOrInlineMarkup) {
|
||||
return false;
|
||||
} else if (!(_flags & MTPDmessage::Flag::f_edit_date)) {
|
||||
return false;
|
||||
}
|
||||
if (auto fromUser = from()->asUser()) {
|
||||
return QDateTime();
|
||||
} else if (const auto fromUser = from()->asUser()) {
|
||||
if (fromUser->botInfo) {
|
||||
return false;
|
||||
return QDateTime();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
if (const auto edited = displayedEditBadge()) {
|
||||
return edited->date;
|
||||
}
|
||||
return QDateTime();
|
||||
}
|
||||
|
||||
HistoryMessageEdited *HistoryMessage::displayedEditBadge() {
|
||||
if (_media && _media->overrideEditedDate()) {
|
||||
return _media->displayedEditBadge();
|
||||
}
|
||||
return Get<HistoryMessageEdited>();
|
||||
}
|
||||
|
||||
const HistoryMessageEdited *HistoryMessage::displayedEditBadge() const {
|
||||
if (_media && _media->overrideEditedDate()) {
|
||||
return _media->displayedEditBadge();
|
||||
}
|
||||
return Get<HistoryMessageEdited>();
|
||||
}
|
||||
|
||||
bool HistoryMessage::uploading() const {
|
||||
|
@ -1016,7 +1041,7 @@ void HistoryMessage::createComponents(const CreateConfig &config) {
|
|||
}
|
||||
return (config.inlineMarkup != nullptr);
|
||||
};
|
||||
if (displayEditedBadge(hasViaBot || hasInlineMarkup())) {
|
||||
if (!config.editDate.isNull()) {
|
||||
mask |= HistoryMessageEdited::Bit();
|
||||
}
|
||||
if (config.senderOriginal) {
|
||||
|
@ -1053,12 +1078,7 @@ void HistoryMessage::createComponents(const CreateConfig &config) {
|
|||
views->_views = config.viewsCount;
|
||||
}
|
||||
if (const auto edited = Get<HistoryMessageEdited>()) {
|
||||
edited->create(config.editDate, date.toString(cTimeFormat()));
|
||||
if (const auto msgsigned = Get<HistoryMessageSigned>()) {
|
||||
msgsigned->create(config.author, edited->_edited.originalText());
|
||||
}
|
||||
} else if (const auto msgsigned = Get<HistoryMessageSigned>()) {
|
||||
msgsigned->create(config.author, date.toString(cTimeFormat()));
|
||||
edited->date = config.editDate;
|
||||
}
|
||||
if (const auto forwarded = Get<HistoryMessageForwarded>()) {
|
||||
forwarded->_originalDate = config.originalDate;
|
||||
|
@ -1082,7 +1102,6 @@ void HistoryMessage::createComponents(const CreateConfig &config) {
|
|||
group->groupId = config.groupId;
|
||||
group->leader = this;
|
||||
}
|
||||
initTime();
|
||||
_fromNameVersion = displayFrom()->nameVersion;
|
||||
}
|
||||
|
||||
|
@ -1106,18 +1125,23 @@ QString formatViewsCount(int32 views) {
|
|||
}
|
||||
|
||||
void HistoryMessage::initTime() {
|
||||
if (auto msgsigned = Get<HistoryMessageSigned>()) {
|
||||
if (const auto msgsigned = Get<HistoryMessageSigned>()) {
|
||||
_timeWidth = msgsigned->maxWidth();
|
||||
} else if (auto edited = Get<HistoryMessageEdited>()) {
|
||||
} else if (const auto edited = displayedEditBadge()) {
|
||||
_timeWidth = edited->maxWidth();
|
||||
} else {
|
||||
_timeText = date.toString(cTimeFormat());
|
||||
_timeWidth = st::msgDateFont->width(_timeText);
|
||||
}
|
||||
if (auto views = Get<HistoryMessageViews>()) {
|
||||
if (const auto views = Get<HistoryMessageViews>()) {
|
||||
views->_viewsText = (views->_views >= 0) ? formatViewsCount(views->_views) : QString();
|
||||
views->_viewsWidth = views->_viewsText.isEmpty() ? 0 : st::msgDateFont->width(views->_viewsText);
|
||||
}
|
||||
if (_text.hasSkipBlock()) {
|
||||
_text.setSkipBlock(skipBlockWidth(), skipBlockHeight());
|
||||
_textWidth = -1;
|
||||
_textHeight = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void HistoryMessage::initMedia(const MTPMessageMedia *media) {
|
||||
|
@ -1222,6 +1246,7 @@ int32 HistoryMessage::plainMaxWidth() const {
|
|||
|
||||
void HistoryMessage::initDimensions() {
|
||||
updateMediaInBubbleState();
|
||||
refreshEditedBadge();
|
||||
if (drawBubble()) {
|
||||
auto forwarded = Get<HistoryMessageForwarded>();
|
||||
auto reply = Get<HistoryMessageReply>();
|
||||
|
@ -1416,24 +1441,11 @@ void HistoryMessage::applyEdition(const MTPDmessage &message) {
|
|||
|
||||
if (message.has_edit_date()) {
|
||||
_flags |= MTPDmessage::Flag::f_edit_date;
|
||||
auto hasViaBotId = Has<HistoryMessageVia>();
|
||||
auto hasInlineMarkup = (inlineReplyMarkup() != nullptr);
|
||||
if (displayEditedBadge(hasViaBotId || hasInlineMarkup)) {
|
||||
if (!Has<HistoryMessageEdited>()) {
|
||||
AddComponents(HistoryMessageEdited::Bit());
|
||||
}
|
||||
auto edited = Get<HistoryMessageEdited>();
|
||||
edited->create(::date(message.vedit_date), date.toString(cTimeFormat()));
|
||||
if (auto msgsigned = Get<HistoryMessageSigned>()) {
|
||||
msgsigned->create(msgsigned->_author, edited->_edited.originalText());
|
||||
}
|
||||
} else if (Has<HistoryMessageEdited>()) {
|
||||
RemoveComponents(HistoryMessageEdited::Bit());
|
||||
if (auto msgsigned = Get<HistoryMessageSigned>()) {
|
||||
msgsigned->create(msgsigned->_author, date.toString(cTimeFormat()));
|
||||
}
|
||||
if (!Has<HistoryMessageEdited>()) {
|
||||
AddComponents(HistoryMessageEdited::Bit());
|
||||
}
|
||||
initTime();
|
||||
auto edited = Get<HistoryMessageEdited>();
|
||||
edited->date = ::date(message.vedit_date);
|
||||
}
|
||||
|
||||
TextWithEntities textWithEntities = { qs(message.vmessage), EntitiesInText() };
|
||||
|
@ -1463,6 +1475,22 @@ void HistoryMessage::applyEditionToEmpty() {
|
|||
finishEditionToEmpty();
|
||||
}
|
||||
|
||||
void HistoryMessage::refreshEditedBadge() {
|
||||
const auto edited = displayedEditBadge();
|
||||
const auto editDate = displayedEditDate();
|
||||
const auto dateText = date.toString(cTimeFormat());
|
||||
if (edited) {
|
||||
edited->refresh(dateText, !editDate.isNull());
|
||||
}
|
||||
if (auto msgsigned = Get<HistoryMessageSigned>()) {
|
||||
const auto text = (!edited || editDate.isNull())
|
||||
? dateText
|
||||
: edited->text.originalText();
|
||||
msgsigned->create(msgsigned->_author, text);
|
||||
}
|
||||
initTime();
|
||||
}
|
||||
|
||||
bool HistoryMessage::displayForwardedFrom() const {
|
||||
if (auto forwarded = Get<HistoryMessageForwarded>()) {
|
||||
if (history()->peer->isSelf()) {
|
||||
|
@ -1762,10 +1790,10 @@ void HistoryMessage::drawInfo(Painter &p, int32 right, int32 bottom, int32 width
|
|||
}
|
||||
dateX += HistoryMessage::timeLeft();
|
||||
|
||||
if (auto msgsigned = Get<HistoryMessageSigned>()) {
|
||||
if (const auto msgsigned = Get<HistoryMessageSigned>()) {
|
||||
msgsigned->_signature.drawElided(p, dateX, dateY, _timeWidth);
|
||||
} else if (auto edited = Get<HistoryMessageEdited>()) {
|
||||
edited->_edited.drawElided(p, dateX, dateY, _timeWidth);
|
||||
} else if (const auto edited = displayedEditBadge()) {
|
||||
edited->text.drawElided(p, dateX, dateY, _timeWidth);
|
||||
} else {
|
||||
p.drawText(dateX, dateY + st::msgDateFont->ascent, _timeText);
|
||||
}
|
||||
|
|
|
@ -164,7 +164,6 @@ public:
|
|||
return true;
|
||||
}
|
||||
bool displayForwardedFrom() const;
|
||||
bool displayEditedBadge(bool hasViaBotOrInlineMarkup) const;
|
||||
bool uploading() const;
|
||||
bool displayRightAction() const override;
|
||||
|
||||
|
@ -210,6 +209,9 @@ public:
|
|||
TextWithEntities originalText() const override;
|
||||
bool textHasLinks() const override;
|
||||
|
||||
bool displayEditedBadge() const override;
|
||||
QDateTime displayedEditDate() const override;
|
||||
|
||||
int infoWidth() const override;
|
||||
int timeLeft() const override;
|
||||
int timeWidth() const override {
|
||||
|
@ -249,6 +251,9 @@ public:
|
|||
|
||||
~HistoryMessage();
|
||||
|
||||
protected:
|
||||
void refreshEditedBadge() override;
|
||||
|
||||
private:
|
||||
HistoryMessage(
|
||||
not_null<History*> history,
|
||||
|
@ -321,6 +326,9 @@ private:
|
|||
int resizeContentGetHeight() override;
|
||||
int performResizeGetHeight();
|
||||
void applyEditionToEmpty();
|
||||
QDateTime displayedEditDate(bool hasViaBotOrInlineMarkup) const;
|
||||
const HistoryMessageEdited *displayedEditBadge() const;
|
||||
HistoryMessageEdited *displayedEditBadge();
|
||||
|
||||
void paintFromName(Painter &p, QRect &trect, bool selected) const;
|
||||
void paintForwardedInfo(Painter &p, QRect &trect, bool selected) const;
|
||||
|
|
Loading…
Add table
Reference in a new issue