diff --git a/Telegram/Resources/icons/menu/edited_status.png b/Telegram/Resources/icons/menu/edited_status.png new file mode 100644 index 000000000..70fb24466 Binary files /dev/null and b/Telegram/Resources/icons/menu/edited_status.png differ diff --git a/Telegram/Resources/icons/menu/edited_status@2x.png b/Telegram/Resources/icons/menu/edited_status@2x.png new file mode 100644 index 000000000..004167a14 Binary files /dev/null and b/Telegram/Resources/icons/menu/edited_status@2x.png differ diff --git a/Telegram/Resources/icons/menu/edited_status@3x.png b/Telegram/Resources/icons/menu/edited_status@3x.png new file mode 100644 index 000000000..1acdf8ea9 Binary files /dev/null and b/Telegram/Resources/icons/menu/edited_status@3x.png differ diff --git a/Telegram/SourceFiles/api/api_who_reacted.cpp b/Telegram/SourceFiles/api/api_who_reacted.cpp index 6c9df39b2..b0e44cfc9 100644 --- a/Telegram/SourceFiles/api/api_who_reacted.cpp +++ b/Telegram/SourceFiles/api/api_who_reacted.cpp @@ -756,5 +756,19 @@ rpl::producer WhoReacted( const style::WhoRead &st) { return WhoReacted(item, reaction, context, st, nullptr); } +rpl::producer WhenEdited( + not_null author, + TimeId date) { + return rpl::single(Ui::WhoReadContent{ + .participants = { Ui::WhoReadParticipant{ + .name = author->name(), + .date = FormatReadDate(date, QDateTime::currentDateTime()), + .id = author->id.value, + } }, + .type = Ui::WhoReadType::Edited, + .fullReadCount = 1, + }); +} + } // namespace Api diff --git a/Telegram/SourceFiles/api/api_who_reacted.h b/Telegram/SourceFiles/api/api_who_reacted.h index 9a9100535..0d1cf7234 100644 --- a/Telegram/SourceFiles/api/api_who_reacted.h +++ b/Telegram/SourceFiles/api/api_who_reacted.h @@ -61,5 +61,8 @@ struct WhoReadList { const Data::ReactionId &reaction, not_null context, // Cache results for this lifetime. const style::WhoRead &st); +[[nodiscard]] rpl::producer WhenEdited( + not_null author, + TimeId date); } // namespace Api diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index dcc9d77e8..6df845885 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -2252,22 +2252,22 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { } return item; }; - const auto whoReactedItem = groupLeaderOrSelf(_dragStateItem); - const auto hasWhoReactedItem = whoReactedItem - && Api::WhoReactedExists(whoReactedItem, Api::WhoReactedList::All); + const auto leaderOrSelf = groupLeaderOrSelf(_dragStateItem); + const auto hasWhoReactedItem = leaderOrSelf + && Api::WhoReactedExists(leaderOrSelf, Api::WhoReactedList::All); const auto clickedReaction = link ? link->property( kReactionsCountEmojiProperty).value() : Data::ReactionId(); _whoReactedMenuLifetime.destroy(); if (!clickedReaction.empty() - && whoReactedItem - && Api::WhoReactedExists(whoReactedItem, Api::WhoReactedList::One)) { + && leaderOrSelf + && Api::WhoReactedExists(leaderOrSelf, Api::WhoReactedList::One)) { HistoryView::ShowWhoReactedMenu( &_menu, e->globalPos(), this, - whoReactedItem, + leaderOrSelf, clickedReaction, _controller, _whoReactedMenuLifetime); @@ -2954,8 +2954,10 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { HistoryView::AddWhoReactedAction( _menu, this, - whoReactedItem, + leaderOrSelf, _controller); + } else { + HistoryView::MaybeAddWhenEditedAction(_menu, leaderOrSelf); } if (_menu->empty()) { diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp index 82da069a7..e34cab589 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp @@ -22,6 +22,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/history_view_cursor_state.h" #include "history/history.h" #include "history/history_item.h" +#include "history/history_item_components.h" #include "history/history_item_text.h" #include "history/view/history_view_schedule_box.h" #include "history/view/media/history_view_media.h" @@ -1286,6 +1287,8 @@ base::unique_qptr FillContextMenu( } if (hasWhoReactedItem) { AddWhoReactedAction(result, list, item, list->controller()); + } else if (item) { + MaybeAddWhenEditedAction(result, item); } return result; @@ -1441,6 +1444,24 @@ void AddSaveSoundForNotifications( }, &st::menuIconSoundAdd); } +void AddWhenEditedActionHelper( + not_null menu, + not_null item, + bool insertSeparator) { + if (item->history()->peer->isUser()) { + if (const auto edited = item->Get()) { + if (!item->hideEditedBadge()) { + if (insertSeparator && !menu->empty()) { + menu->addSeparator(&st::expandedMenuSeparator); + } + menu->addAction(Ui::WhenReadContextAction( + menu.get(), + Api::WhenEdited(item->from(), edited->date))); + } + } + } +} + void AddWhoReactedAction( not_null menu, not_null context, @@ -1486,6 +1507,7 @@ void AddWhoReactedAction( if (!menu->empty()) { menu->addSeparator(&st::expandedMenuSeparator); } + AddWhenEditedActionHelper(menu, item, false); if (item->history()->peer->isUser()) { menu->addAction(Ui::WhenReadContextAction( menu.get(), @@ -1501,6 +1523,12 @@ void AddWhoReactedAction( } } +void MaybeAddWhenEditedAction( + not_null menu, + not_null item) { + AddWhenEditedActionHelper(menu, item, true); +} + void AddEditTagAction( not_null menu, const Data::ReactionId &id, diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.h b/Telegram/SourceFiles/history/view/history_view_context_menu.h index 1b14804aa..1d02e64c2 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.h +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.h @@ -84,6 +84,9 @@ void AddWhoReactedAction( not_null context, not_null item, not_null controller); +void MaybeAddWhenEditedAction( + not_null menu, + not_null item); void ShowWhoReactedMenu( not_null*> menu, QPoint position, diff --git a/Telegram/SourceFiles/ui/chat/chat.style b/Telegram/SourceFiles/ui/chat/chat.style index 7633eed08..53b2ef183 100644 --- a/Telegram/SourceFiles/ui/chat/chat.style +++ b/Telegram/SourceFiles/ui/chat/chat.style @@ -808,6 +808,8 @@ whoReadPlayedDisabled: icon {{ "menu/read_audio", menuFgDisabled }}; whoReadReactions: icon{{ "menu/read_reactions", windowBoldFg }}; whoReadReactionsOver: icon{{ "menu/read_reactions", windowBoldFg }}; whoReadReactionsDisabled: icon{{ "menu/read_reactions", menuFgDisabled }}; +whenEdited: icon {{ "menu/edited_status", windowBoldFg }}; +whenEditedOver: icon {{ "menu/edited_status", windowBoldFg }}; reactionsTabAll: icon {{ "menu/read_reactions", windowFg }}; reactionsTabAllSelected: icon {{ "menu/read_reactions", activeButtonFg }}; diff --git a/Telegram/SourceFiles/ui/controls/who_reacted_context_action.cpp b/Telegram/SourceFiles/ui/controls/who_reacted_context_action.cpp index 37a15de62..a2f8f7229 100644 --- a/Telegram/SourceFiles/ui/controls/who_reacted_context_action.cpp +++ b/Telegram/SourceFiles/ui/controls/who_reacted_context_action.cpp @@ -597,7 +597,9 @@ void WhenAction::paint(Painter &p) { p.fillRect(0, 0, width(), _height, _st.itemBg); } p.fillRect(0, 0, width(), _height, _st.itemBg); - const auto &icon = loading + const auto &icon = (_content.type == WhoReadType::Edited) + ? (selected ? st::whenEditedOver : st::whenEdited) + : loading ? st::whoReadChecksDisabled : selected ? st::whoReadChecksOver diff --git a/Telegram/SourceFiles/ui/controls/who_reacted_context_action.h b/Telegram/SourceFiles/ui/controls/who_reacted_context_action.h index 74e3f0d54..f0b2545f5 100644 --- a/Telegram/SourceFiles/ui/controls/who_reacted_context_action.h +++ b/Telegram/SourceFiles/ui/controls/who_reacted_context_action.h @@ -36,6 +36,7 @@ enum class WhoReadType { Listened, Watched, Reacted, + Edited, }; enum class WhoReadState : uchar { @@ -65,7 +66,7 @@ struct WhoReadContent { [[nodiscard]] base::unique_qptr WhenReadContextAction( not_null menu, rpl::producer content, - Fn showOrPremium); + Fn showOrPremium = nullptr); enum class WhoReactedType : uchar { Viewed,