diff --git a/Telegram/Resources/icons/menu/forwarded_status.png b/Telegram/Resources/icons/menu/forwarded_status.png new file mode 100644 index 000000000..66d08a835 Binary files /dev/null and b/Telegram/Resources/icons/menu/forwarded_status.png differ diff --git a/Telegram/Resources/icons/menu/forwarded_status@2x.png b/Telegram/Resources/icons/menu/forwarded_status@2x.png new file mode 100644 index 000000000..8892f4ce3 Binary files /dev/null and b/Telegram/Resources/icons/menu/forwarded_status@2x.png differ diff --git a/Telegram/Resources/icons/menu/forwarded_status@3x.png b/Telegram/Resources/icons/menu/forwarded_status@3x.png new file mode 100644 index 000000000..e2940b163 Binary files /dev/null and b/Telegram/Resources/icons/menu/forwarded_status@3x.png differ diff --git a/Telegram/SourceFiles/api/api_who_reacted.cpp b/Telegram/SourceFiles/api/api_who_reacted.cpp index b0e44cfc9..a5186fc6b 100644 --- a/Telegram/SourceFiles/api/api_who_reacted.cpp +++ b/Telegram/SourceFiles/api/api_who_reacted.cpp @@ -756,19 +756,32 @@ rpl::producer WhoReacted( const style::WhoRead &st) { return WhoReacted(item, reaction, context, st, nullptr); } -rpl::producer WhenEdited( + +[[nodiscard]] rpl::producer WhenDate( not_null author, - TimeId date) { + TimeId date, + Ui::WhoReadType type) { return rpl::single(Ui::WhoReadContent{ .participants = { Ui::WhoReadParticipant{ .name = author->name(), .date = FormatReadDate(date, QDateTime::currentDateTime()), .id = author->id.value, } }, - .type = Ui::WhoReadType::Edited, + .type = type, .fullReadCount = 1, }); } +rpl::producer WhenEdited( + not_null author, + TimeId date) { + return WhenDate(author, date, Ui::WhoReadType::Edited); +} + +rpl::producer WhenOriginal( + not_null author, + TimeId date) { + return WhenDate(author, date, Ui::WhoReadType::Original); +} } // namespace Api diff --git a/Telegram/SourceFiles/api/api_who_reacted.h b/Telegram/SourceFiles/api/api_who_reacted.h index 0d1cf7234..8e1bc9a3b 100644 --- a/Telegram/SourceFiles/api/api_who_reacted.h +++ b/Telegram/SourceFiles/api/api_who_reacted.h @@ -64,5 +64,8 @@ struct WhoReadList { [[nodiscard]] rpl::producer WhenEdited( not_null author, TimeId date); +[[nodiscard]] rpl::producer WhenOriginal( + 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 f239ff276..79534bbb9 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -2918,7 +2918,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { leaderOrSelf, _controller); } else if (leaderOrSelf) { - HistoryView::MaybeAddWhenEditedAction(_menu, leaderOrSelf); + HistoryView::MaybeAddWhenEditedForwardedAction(_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 50ffc31b3..f14dcbe7f 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp @@ -1286,7 +1286,7 @@ base::unique_qptr FillContextMenu( if (hasWhoReactedItem) { AddWhoReactedAction(result, list, item, list->controller()); } else if (item) { - MaybeAddWhenEditedAction(result, item); + MaybeAddWhenEditedForwardedAction(result, item); } return result; @@ -1457,20 +1457,28 @@ void AddSaveSoundForNotifications( }, &st::menuIconSoundAdd); } -void AddWhenEditedActionHelper( +void AddWhenEditedForwardedActionHelper( 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))); + 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))); + } + } else if (const auto forwarded = item->Get()) { + if (!forwarded->story && forwarded->psaType.isEmpty()) { + if (insertSeparator && !menu->empty()) { + menu->addSeparator(&st::expandedMenuSeparator); + } + menu->addAction(Ui::WhenReadContextAction( + menu.get(), + Api::WhenOriginal(item->from(), forwarded->originalDate))); + forwarded->originalDate; } } } @@ -1522,8 +1530,8 @@ void AddWhoReactedAction( if (!menu->empty()) { menu->addSeparator(&st::expandedMenuSeparator); } - AddWhenEditedActionHelper(menu, item, false); if (item->history()->peer->isUser()) { + AddWhenEditedForwardedActionHelper(menu, item, false); menu->addAction(Ui::WhenReadContextAction( menu.get(), Api::WhoReacted(item, context, st::defaultWhoRead, whoReadIds), @@ -1535,13 +1543,14 @@ void AddWhoReactedAction( Data::ReactedMenuFactory(&controller->session()), participantChosen, showAllChosen)); + AddWhenEditedForwardedActionHelper(menu, item, true); } } -void MaybeAddWhenEditedAction( +void MaybeAddWhenEditedForwardedAction( not_null menu, not_null item) { - AddWhenEditedActionHelper(menu, item, true); + AddWhenEditedForwardedActionHelper(menu, item, true); } void AddEditTagAction( diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.h b/Telegram/SourceFiles/history/view/history_view_context_menu.h index 1d02e64c2..1dac246bb 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.h +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.h @@ -84,7 +84,7 @@ void AddWhoReactedAction( not_null context, not_null item, not_null controller); -void MaybeAddWhenEditedAction( +void MaybeAddWhenEditedForwardedAction( not_null menu, not_null item); void ShowWhoReactedMenu( diff --git a/Telegram/SourceFiles/ui/chat/chat.style b/Telegram/SourceFiles/ui/chat/chat.style index 50eb1074b..5ca540b99 100644 --- a/Telegram/SourceFiles/ui/chat/chat.style +++ b/Telegram/SourceFiles/ui/chat/chat.style @@ -810,6 +810,8 @@ whoReadReactionsOver: icon{{ "menu/read_reactions", windowBoldFg }}; whoReadReactionsDisabled: icon{{ "menu/read_reactions", menuFgDisabled }}; whenEdited: icon {{ "menu/edited_status", windowBoldFg }}; whenEditedOver: icon {{ "menu/edited_status", windowBoldFg }}; +whenOriginal: icon {{ "menu/forwarded_status", windowBoldFg }}; +whenOriginalOver: icon {{ "menu/forwarded_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 3aeb48253..9834489b1 100644 --- a/Telegram/SourceFiles/ui/controls/who_reacted_context_action.cpp +++ b/Telegram/SourceFiles/ui/controls/who_reacted_context_action.cpp @@ -602,6 +602,8 @@ void WhenAction::paint(Painter &p) { p.fillRect(0, 0, width(), _height, _st.itemBg); const auto &icon = (_content.type == WhoReadType::Edited) ? (selected ? st::whenEditedOver : st::whenEdited) + : (_content.type == WhoReadType::Original) + ? (selected ? st::whenOriginalOver : st::whenOriginal) : loading ? st::whoReadChecksDisabled : selected diff --git a/Telegram/SourceFiles/ui/controls/who_reacted_context_action.h b/Telegram/SourceFiles/ui/controls/who_reacted_context_action.h index 2aad54dd2..919bb4489 100644 --- a/Telegram/SourceFiles/ui/controls/who_reacted_context_action.h +++ b/Telegram/SourceFiles/ui/controls/who_reacted_context_action.h @@ -37,6 +37,7 @@ enum class WhoReadType { Watched, Reacted, Edited, + Original, }; enum class WhoReadState : uchar {