diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index e6bda28ce..0d7275e3d 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -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()) { - 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()) { dateText += '\n' + lng_forwarded_date(lt_date, forwarded->_originalDate.toString(QLocale::system().dateTimeFormat(QLocale::LongFormat))); diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index a24af6159..fe5db1e24 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -1198,8 +1198,8 @@ void HistoryItem::makeGroupLeader( const auto group = Get(); 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(); } diff --git a/Telegram/SourceFiles/history/history_item.h b/Telegram/SourceFiles/history/history_item.h index 718c9660f..4c387f357 100644 --- a/Telegram/SourceFiles/history/history_item.h +++ b/Telegram/SourceFiles/history/history_item.h @@ -149,11 +149,11 @@ struct HistoryMessageSigned : public RuntimeComponent { }; struct HistoryMessageEdited : public RuntimeComponent { - 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 { @@ -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, diff --git a/Telegram/SourceFiles/history/history_media.h b/Telegram/SourceFiles/history/history_media.h index 3ed31ca8e..1b1362be8 100644 --- a/Telegram/SourceFiles/history/history_media.h +++ b/Telegram/SourceFiles/history/history_media.h @@ -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. diff --git a/Telegram/SourceFiles/history/history_media_grouped.cpp b/Telegram/SourceFiles/history/history_media_grouped.cpp index 57122e962..79dc80655 100644 --- a/Telegram/SourceFiles/history/history_media_grouped.cpp +++ b/Telegram/SourceFiles/history/history_media_grouped.cpp @@ -401,6 +401,13 @@ Storage::SharedMediaTypesMask HistoryGroupedMedia::sharedMediaTypes() const { return main()->sharedMediaTypes(); } +HistoryMessageEdited *HistoryGroupedMedia::displayedEditBadge() const { + if (!_caption.isEmpty()) { + return _elements.front().item->Get(); + } + return nullptr; +} + void HistoryGroupedMedia::updateNeedBubbleState() { const auto getItemCaption = [](const Element &element) { if (const auto media = element.item->getMedia()) { diff --git a/Telegram/SourceFiles/history/history_media_grouped.h b/Telegram/SourceFiles/history/history_media_grouped.h index bf9dfbc84..6e642cd84 100644 --- a/Telegram/SourceFiles/history/history_media_grouped.h +++ b/Telegram/SourceFiles/history/history_media_grouped.h @@ -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; } diff --git a/Telegram/SourceFiles/history/history_media_types.cpp b/Telegram/SourceFiles/history/history_media_types.cpp index c161b5f95..63e3eae70 100644 --- a/Telegram/SourceFiles/history/history_media_types.cpp +++ b/Telegram/SourceFiles/history/history_media_types.cpp @@ -1551,7 +1551,7 @@ void HistoryDocument::initDimensions() { } else { _minh = st::msgFilePadding.top() + st::msgFileSize + st::msgFilePadding.bottom(); } - if (!captioned && (_parent->Has() || _parent->Has())) { + if (!captioned && (_parent->Has() || _parent->displayEditedBadge())) { _minh += st::msgDateFont->height - st::msgDateDelta.y(); } if (!isBubbleTop()) { diff --git a/Telegram/SourceFiles/history/history_message.cpp b/Telegram/SourceFiles/history/history_message.cpp index a2a84b2cd..eb954bc75 100644 --- a/Telegram/SourceFiles/history/history_message.cpp +++ b/Telegram/SourceFiles/history/history_message.cpp @@ -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(); + 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(); +} + +const HistoryMessageEdited *HistoryMessage::displayedEditBadge() const { + if (_media && _media->overrideEditedDate()) { + return _media->displayedEditBadge(); + } + return Get(); } 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()) { - edited->create(config.editDate, date.toString(cTimeFormat())); - if (const auto msgsigned = Get()) { - msgsigned->create(config.author, edited->_edited.originalText()); - } - } else if (const auto msgsigned = Get()) { - msgsigned->create(config.author, date.toString(cTimeFormat())); + edited->date = config.editDate; } if (const auto forwarded = Get()) { 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()) { + if (const auto msgsigned = Get()) { _timeWidth = msgsigned->maxWidth(); - } else if (auto edited = Get()) { + } else if (const auto edited = displayedEditBadge()) { _timeWidth = edited->maxWidth(); } else { _timeText = date.toString(cTimeFormat()); _timeWidth = st::msgDateFont->width(_timeText); } - if (auto views = Get()) { + if (const auto views = Get()) { 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(); auto reply = Get(); @@ -1416,24 +1441,11 @@ void HistoryMessage::applyEdition(const MTPDmessage &message) { if (message.has_edit_date()) { _flags |= MTPDmessage::Flag::f_edit_date; - auto hasViaBotId = Has(); - auto hasInlineMarkup = (inlineReplyMarkup() != nullptr); - if (displayEditedBadge(hasViaBotId || hasInlineMarkup)) { - if (!Has()) { - AddComponents(HistoryMessageEdited::Bit()); - } - auto edited = Get(); - edited->create(::date(message.vedit_date), date.toString(cTimeFormat())); - if (auto msgsigned = Get()) { - msgsigned->create(msgsigned->_author, edited->_edited.originalText()); - } - } else if (Has()) { - RemoveComponents(HistoryMessageEdited::Bit()); - if (auto msgsigned = Get()) { - msgsigned->create(msgsigned->_author, date.toString(cTimeFormat())); - } + if (!Has()) { + AddComponents(HistoryMessageEdited::Bit()); } - initTime(); + auto edited = Get(); + 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()) { + const auto text = (!edited || editDate.isNull()) + ? dateText + : edited->text.originalText(); + msgsigned->create(msgsigned->_author, text); + } + initTime(); +} + bool HistoryMessage::displayForwardedFrom() const { if (auto forwarded = Get()) { 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()) { + if (const auto msgsigned = Get()) { msgsigned->_signature.drawElided(p, dateX, dateY, _timeWidth); - } else if (auto edited = Get()) { - 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); } diff --git a/Telegram/SourceFiles/history/history_message.h b/Telegram/SourceFiles/history/history_message.h index de4a0dbd5..63797a5f6 100644 --- a/Telegram/SourceFiles/history/history_message.h +++ b/Telegram/SourceFiles/history/history_message.h @@ -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, @@ -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;