Display right edited badge in group with caption.

This commit is contained in:
John Preston 2017-12-16 20:32:10 +04:00
parent 1f070da202
commit 89ccaccb88
9 changed files with 117 additions and 52 deletions

View File

@ -2774,8 +2774,9 @@ QString HistoryInner::tooltipText() const {
if (_mouseCursorState == HistoryInDateCursorState && _mouseAction == MouseAction::None) { if (_mouseCursorState == HistoryInDateCursorState && _mouseAction == MouseAction::None) {
if (App::hoveredItem()) { if (App::hoveredItem()) {
auto dateText = App::hoveredItem()->date.toString(QLocale::system().dateTimeFormat(QLocale::LongFormat)); auto dateText = App::hoveredItem()->date.toString(QLocale::system().dateTimeFormat(QLocale::LongFormat));
if (auto edited = App::hoveredItem()->Get<HistoryMessageEdited>()) { auto editedDate = App::hoveredItem()->displayedEditDate();
dateText += '\n' + lng_edited_date(lt_date, edited->_editDate.toString(QLocale::system().dateTimeFormat(QLocale::LongFormat))); if (!editedDate.isNull()) {
dateText += '\n' + lng_edited_date(lt_date, editedDate.toString(QLocale::system().dateTimeFormat(QLocale::LongFormat)));
} }
if (auto forwarded = App::hoveredItem()->Get<HistoryMessageForwarded>()) { if (auto forwarded = App::hoveredItem()->Get<HistoryMessageForwarded>()) {
dateText += '\n' + lng_forwarded_date(lt_date, forwarded->_originalDate.toString(QLocale::system().dateTimeFormat(QLocale::LongFormat))); dateText += '\n' + lng_forwarded_date(lt_date, forwarded->_originalDate.toString(QLocale::system().dateTimeFormat(QLocale::LongFormat)));

View File

@ -1198,8 +1198,8 @@ void HistoryItem::makeGroupLeader(
const auto group = Get<HistoryMessageGroup>(); const auto group = Get<HistoryMessageGroup>();
Assert(group != nullptr); Assert(group != nullptr);
if (group->leader != this) { const auto leaderChanged = (group->leader != this);
group->leader = this; if (leaderChanged) {
_flags &= ~MTPDmessage_ClientFlag::f_hidden_by_group; _flags &= ~MTPDmessage_ClientFlag::f_hidden_by_group;
setPendingInitDimensions(); setPendingInitDimensions();
} }

View File

@ -149,11 +149,11 @@ struct HistoryMessageSigned : public RuntimeComponent<HistoryMessageSigned> {
}; };
struct HistoryMessageEdited : public RuntimeComponent<HistoryMessageEdited> { struct HistoryMessageEdited : public RuntimeComponent<HistoryMessageEdited> {
void create(const QDateTime &editDate, const QString &date); void refresh(const QString &date, bool displayed);
int maxWidth() const; int maxWidth() const;
QDateTime _editDate; QDateTime date;
Text _edited; Text text;
}; };
struct HistoryMessageForwarded : public RuntimeComponent<HistoryMessageForwarded> { struct HistoryMessageForwarded : public RuntimeComponent<HistoryMessageForwarded> {
@ -776,6 +776,15 @@ public:
} }
virtual void setId(MsgId newId); virtual void setId(MsgId newId);
virtual bool displayEditedBadge() const {
return false;
}
virtual QDateTime displayedEditDate() const {
return QDateTime();
}
virtual void refreshEditedBadge() {
}
void drawInDialog( void drawInDialog(
Painter &p, Painter &p,
const QRect &r, const QRect &r,

View File

@ -227,6 +227,13 @@ public:
return false; 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 // An attach media in a web page can provide an
// additional text to be displayed below the attach. // additional text to be displayed below the attach.
// For example duration / progress for video messages. // For example duration / progress for video messages.

View File

@ -401,6 +401,13 @@ Storage::SharedMediaTypesMask HistoryGroupedMedia::sharedMediaTypes() const {
return main()->sharedMediaTypes(); return main()->sharedMediaTypes();
} }
HistoryMessageEdited *HistoryGroupedMedia::displayedEditBadge() const {
if (!_caption.isEmpty()) {
return _elements.front().item->Get<HistoryMessageEdited>();
}
return nullptr;
}
void HistoryGroupedMedia::updateNeedBubbleState() { void HistoryGroupedMedia::updateNeedBubbleState() {
const auto getItemCaption = [](const Element &element) { const auto getItemCaption = [](const Element &element) {
if (const auto media = element.item->getMedia()) { if (const auto media = element.item->getMedia()) {

View File

@ -94,6 +94,11 @@ public:
TextWithEntities getCaption() const override; TextWithEntities getCaption() const override;
Storage::SharedMediaTypesMask sharedMediaTypes() const override; Storage::SharedMediaTypesMask sharedMediaTypes() const override;
bool overrideEditedDate() const override {
return true;
}
HistoryMessageEdited *displayedEditBadge() const;
bool canBeGrouped() const override { bool canBeGrouped() const override {
return true; return true;
} }

View File

@ -1551,7 +1551,7 @@ void HistoryDocument::initDimensions() {
} else { } else {
_minh = st::msgFilePadding.top() + st::msgFileSize + st::msgFilePadding.bottom(); _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(); _minh += st::msgDateFont->height - st::msgDateDelta.y();
} }
if (!isBubbleTop()) { if (!isBubbleTop()) {

View File

@ -398,13 +398,13 @@ int HistoryMessageSigned::maxWidth() const {
return _signature.maxWidth(); return _signature.maxWidth();
} }
void HistoryMessageEdited::create(const QDateTime &editDate, const QString &date) { void HistoryMessageEdited::refresh(const QString &date, bool displayed) {
_editDate = editDate; const auto prefix = displayed ? (lang(lng_edited) + ' ') : QString();
_edited.setText(st::msgDateTextStyle, lang(lng_edited) + ' ' + date, _textNameOptions); text.setText(st::msgDateTextStyle, prefix + date, _textNameOptions);
} }
int HistoryMessageEdited::maxWidth() const { int HistoryMessageEdited::maxWidth() const {
return _edited.maxWidth(); return text.maxWidth();
} }
void HistoryMessageForwarded::create(const HistoryMessageVia *via) const { 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) { if (hasViaBotOrInlineMarkup) {
return false; return QDateTime();
} else if (!(_flags & MTPDmessage::Flag::f_edit_date)) { } else if (const auto fromUser = from()->asUser()) {
return false;
}
if (auto fromUser = from()->asUser()) {
if (fromUser->botInfo) { 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 { bool HistoryMessage::uploading() const {
@ -1016,7 +1041,7 @@ void HistoryMessage::createComponents(const CreateConfig &config) {
} }
return (config.inlineMarkup != nullptr); return (config.inlineMarkup != nullptr);
}; };
if (displayEditedBadge(hasViaBot || hasInlineMarkup())) { if (!config.editDate.isNull()) {
mask |= HistoryMessageEdited::Bit(); mask |= HistoryMessageEdited::Bit();
} }
if (config.senderOriginal) { if (config.senderOriginal) {
@ -1053,12 +1078,7 @@ void HistoryMessage::createComponents(const CreateConfig &config) {
views->_views = config.viewsCount; views->_views = config.viewsCount;
} }
if (const auto edited = Get<HistoryMessageEdited>()) { if (const auto edited = Get<HistoryMessageEdited>()) {
edited->create(config.editDate, date.toString(cTimeFormat())); edited->date = config.editDate;
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()));
} }
if (const auto forwarded = Get<HistoryMessageForwarded>()) { if (const auto forwarded = Get<HistoryMessageForwarded>()) {
forwarded->_originalDate = config.originalDate; forwarded->_originalDate = config.originalDate;
@ -1082,7 +1102,6 @@ void HistoryMessage::createComponents(const CreateConfig &config) {
group->groupId = config.groupId; group->groupId = config.groupId;
group->leader = this; group->leader = this;
} }
initTime();
_fromNameVersion = displayFrom()->nameVersion; _fromNameVersion = displayFrom()->nameVersion;
} }
@ -1106,18 +1125,23 @@ QString formatViewsCount(int32 views) {
} }
void HistoryMessage::initTime() { void HistoryMessage::initTime() {
if (auto msgsigned = Get<HistoryMessageSigned>()) { if (const auto msgsigned = Get<HistoryMessageSigned>()) {
_timeWidth = msgsigned->maxWidth(); _timeWidth = msgsigned->maxWidth();
} else if (auto edited = Get<HistoryMessageEdited>()) { } else if (const auto edited = displayedEditBadge()) {
_timeWidth = edited->maxWidth(); _timeWidth = edited->maxWidth();
} else { } else {
_timeText = date.toString(cTimeFormat()); _timeText = date.toString(cTimeFormat());
_timeWidth = st::msgDateFont->width(_timeText); _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->_viewsText = (views->_views >= 0) ? formatViewsCount(views->_views) : QString();
views->_viewsWidth = views->_viewsText.isEmpty() ? 0 : st::msgDateFont->width(views->_viewsText); 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) { void HistoryMessage::initMedia(const MTPMessageMedia *media) {
@ -1222,6 +1246,7 @@ int32 HistoryMessage::plainMaxWidth() const {
void HistoryMessage::initDimensions() { void HistoryMessage::initDimensions() {
updateMediaInBubbleState(); updateMediaInBubbleState();
refreshEditedBadge();
if (drawBubble()) { if (drawBubble()) {
auto forwarded = Get<HistoryMessageForwarded>(); auto forwarded = Get<HistoryMessageForwarded>();
auto reply = Get<HistoryMessageReply>(); auto reply = Get<HistoryMessageReply>();
@ -1416,24 +1441,11 @@ void HistoryMessage::applyEdition(const MTPDmessage &message) {
if (message.has_edit_date()) { if (message.has_edit_date()) {
_flags |= MTPDmessage::Flag::f_edit_date; _flags |= MTPDmessage::Flag::f_edit_date;
auto hasViaBotId = Has<HistoryMessageVia>();
auto hasInlineMarkup = (inlineReplyMarkup() != nullptr);
if (displayEditedBadge(hasViaBotId || hasInlineMarkup)) {
if (!Has<HistoryMessageEdited>()) { if (!Has<HistoryMessageEdited>()) {
AddComponents(HistoryMessageEdited::Bit()); AddComponents(HistoryMessageEdited::Bit());
} }
auto edited = Get<HistoryMessageEdited>(); auto edited = Get<HistoryMessageEdited>();
edited->create(::date(message.vedit_date), date.toString(cTimeFormat())); edited->date = ::date(message.vedit_date);
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()));
}
}
initTime();
} }
TextWithEntities textWithEntities = { qs(message.vmessage), EntitiesInText() }; TextWithEntities textWithEntities = { qs(message.vmessage), EntitiesInText() };
@ -1463,6 +1475,22 @@ void HistoryMessage::applyEditionToEmpty() {
finishEditionToEmpty(); 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 { bool HistoryMessage::displayForwardedFrom() const {
if (auto forwarded = Get<HistoryMessageForwarded>()) { if (auto forwarded = Get<HistoryMessageForwarded>()) {
if (history()->peer->isSelf()) { if (history()->peer->isSelf()) {
@ -1762,10 +1790,10 @@ void HistoryMessage::drawInfo(Painter &p, int32 right, int32 bottom, int32 width
} }
dateX += HistoryMessage::timeLeft(); dateX += HistoryMessage::timeLeft();
if (auto msgsigned = Get<HistoryMessageSigned>()) { if (const auto msgsigned = Get<HistoryMessageSigned>()) {
msgsigned->_signature.drawElided(p, dateX, dateY, _timeWidth); msgsigned->_signature.drawElided(p, dateX, dateY, _timeWidth);
} else if (auto edited = Get<HistoryMessageEdited>()) { } else if (const auto edited = displayedEditBadge()) {
edited->_edited.drawElided(p, dateX, dateY, _timeWidth); edited->text.drawElided(p, dateX, dateY, _timeWidth);
} else { } else {
p.drawText(dateX, dateY + st::msgDateFont->ascent, _timeText); p.drawText(dateX, dateY + st::msgDateFont->ascent, _timeText);
} }

View File

@ -164,7 +164,6 @@ public:
return true; return true;
} }
bool displayForwardedFrom() const; bool displayForwardedFrom() const;
bool displayEditedBadge(bool hasViaBotOrInlineMarkup) const;
bool uploading() const; bool uploading() const;
bool displayRightAction() const override; bool displayRightAction() const override;
@ -210,6 +209,9 @@ public:
TextWithEntities originalText() const override; TextWithEntities originalText() const override;
bool textHasLinks() const override; bool textHasLinks() const override;
bool displayEditedBadge() const override;
QDateTime displayedEditDate() const override;
int infoWidth() const override; int infoWidth() const override;
int timeLeft() const override; int timeLeft() const override;
int timeWidth() const override { int timeWidth() const override {
@ -249,6 +251,9 @@ public:
~HistoryMessage(); ~HistoryMessage();
protected:
void refreshEditedBadge() override;
private: private:
HistoryMessage( HistoryMessage(
not_null<History*> history, not_null<History*> history,
@ -321,6 +326,9 @@ private:
int resizeContentGetHeight() override; int resizeContentGetHeight() override;
int performResizeGetHeight(); int performResizeGetHeight();
void applyEditionToEmpty(); void applyEditionToEmpty();
QDateTime displayedEditDate(bool hasViaBotOrInlineMarkup) const;
const HistoryMessageEdited *displayedEditBadge() const;
HistoryMessageEdited *displayedEditBadge();
void paintFromName(Painter &p, QRect &trect, bool selected) const; void paintFromName(Painter &p, QRect &trect, bool selected) const;
void paintForwardedInfo(Painter &p, QRect &trect, bool selected) const; void paintForwardedInfo(Painter &p, QRect &trect, bool selected) const;