From 81492b7d3a1f9339fd344d6a7f100f755245a130 Mon Sep 17 00:00:00 2001 From: John Preston <johnprestonmail@gmail.com> Date: Fri, 11 Oct 2024 14:08:04 +0400 Subject: [PATCH] Add "when edited" context menu information. --- .../Resources/icons/menu/edited_status.png | Bin 0 -> 586 bytes .../Resources/icons/menu/edited_status@2x.png | Bin 0 -> 1252 bytes .../Resources/icons/menu/edited_status@3x.png | Bin 0 -> 1825 bytes Telegram/SourceFiles/api/api_who_reacted.cpp | 14 +++++++++ Telegram/SourceFiles/api/api_who_reacted.h | 3 ++ .../history/history_inner_widget.cpp | 16 +++++----- .../view/history_view_context_menu.cpp | 28 ++++++++++++++++++ .../history/view/history_view_context_menu.h | 3 ++ Telegram/SourceFiles/ui/chat/chat.style | 2 ++ .../controls/who_reacted_context_action.cpp | 4 ++- .../ui/controls/who_reacted_context_action.h | 3 +- 11 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 Telegram/Resources/icons/menu/edited_status.png create mode 100644 Telegram/Resources/icons/menu/edited_status@2x.png create mode 100644 Telegram/Resources/icons/menu/edited_status@3x.png diff --git a/Telegram/Resources/icons/menu/edited_status.png b/Telegram/Resources/icons/menu/edited_status.png new file mode 100644 index 0000000000000000000000000000000000000000..70fb24466a33f9fb18ea1d76d62250f003eb566b GIT binary patch literal 586 zcmV-Q0=4~#P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00009a7bBm000XU z000XU0RWnu7ytkP{7FPXR7i=<RUxP<Q4k%!7=(+gHf_RV7jeUaCW{z0Xc4R?yUk+I zuEk_BD2VBzAS{>#Q8deL7Yt%hSu`zpUir%R>#q9w!W)>dGk509nc2D5MMR(v%CAo* z|9Jq6G4lC*Z-c-|RaFJ&9Q*wq7uoOk7z_r8#bS=JL<Cy~f*_ElX*3#*=x{htKA$H^ zl1Nb$Di(`mnkLQXbL#baBnZNL3<N=dVHnVL9r1YFwz_CEip64q$z%er*K2p~-l%CB zbX|7}x+!M4T%zCazXqVHDlE>-RaqLYCzlTR0qsWm!-Z<v9T79IaN%w&L}Ajchi1 zXXl)w-EKc0vZ|^y91b0a_DE{A8lBJQhrTNsV+;TwisIW0?DVZgOC%EH_xowL+dcG4 zl0>uFjAU89+HL@j$0HpM2m1Q@x(Rf-TvRTXX*?cNv)QD{WOA3BF-CzvfL5y&F~)9u zPlw#;bg<oSkxr*=TfsTU>2yLQ5_$hOO{G!@27|WAOQjM3fOG!;7cH4g!m=zFh5^Rd zYXE{EK-cxBS4Aik!e+C9X_}BE>9tM%6GYQASeAuWtA$J^15p&=cDq4D@OV6!PNx8X zTrTIt(zykHU)PmN1w@2uwF&^J*Xz&P_}aqI??t>YC=?24G#b}$J9S-9J|#cvP5u}8 Y28d4pK!e(vM*si-07*qoM6N<$f{Bs<3IG5A literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..004167a148f30c34abcc7441be3cff13cb27c7e1 GIT binary patch literal 1252 zcmV<A1RMK_P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00009a7bBm000XU z000XU0RWnu7ytkSmPtfGRA_<iS=}qUZy3KeW8^VKNs|_nlH@HT2l8^T6E7*L6{1$k zky?ub4(vam#7-pTK;i&J+453eOE@8^jZCw7SrPNrKHr1iZ%^NmJ<qde`%3xLRZG{) z=X3A6@7>o;LPVe+4C!|h5Q|>{-;G}Z-;EzHKo+UQ48xF8sU)dXN^ZBCJRT1LkvXvu z4$I5SLtkGXc6WDie}9jUczu1v#>NIrCKF0aOT$w0e-oELtJPwEfBzF<E^KXWp{c1! zv;c`;g;1!~YBHP6R8v#K{_XksnXFbTt*xz*!{H#O(@8#`k5W=nNTpIyWo0E*R8){c zp<rVy77OY1dOANp4}}I1AC(`iy1E*-x3}zS+H5wowY4EWKAtl+HZ~S|y&gwLM{NAV z!vpH->i$g&wYRt9?d=T!@bdBkgTa89m>9u@qoShF+uMuh=Vt)G+uIvjT3RA2pt`!6 zCGT>%P+ndxx`zu23UGCG1px5*e5kFhjf?=bTFthN%jH5wMuuqee#^?r!o|e}0Knt% z2+hsU(PFW%Z4-`_|7ay8C3tyx0RXJ8uZLHFR;y(<oWWoaL`<X6U}R(jnVFfKzTMs3 zY#jlcn%l{L&f9D@!5emYc^LpOI5^1ZE0f7^dU^@~I6OQIkAS?qJa$#u+S&xS#`g9$ z0AOrvjF*3FYb#qXKR=(-pYt-;(9l3c|NThK%*=4Pi^j~%3_U$P5fM>yb2Fzur-1tU zdLkmSTCMc>_$ZPdH=drJXl`zfh=_7?b2<GvZ=*RmIYdOXy1FWknE)7#Msm4aG(JAg z=^Io4!!X1!3=t7sUS5WU93MCw4(jgi=H(l-g_KGq``PJqiXs&$M06sP$z%aHPoa>@ z<zzOSX<%T0qNAg~^!xINVi<-!(sVkVpyN}eQekUri;eH??G=0k4-XHs@zc}Oq5Tf{ zrz@k;$h&Z3V<YbF?%3k<^Ye&}jTJ1QxVRW+XJ-HatJNBsfZg3)0Kme+0%t+FT#lik zA(r^->njWf10)iOAmT+uMVOqNL_$IWl9Q7$H8mCNDiS<dUtb>p!0Yt}9az%R(y+I; z7ck^#G#bIHo|KdXyWI`|I6gi`PEHP2Oz?z!uM!{oH8C+!FnOs|ilwC`{EhzpesKbb z_+93zs;aQQzK+h$PQk?eW-^%q$S*D~LMoMt7a-<3&DUycYvJ?x*gAH*9Z5+^d}8?( zh~z+{R;%Ihcv$jYuNQ@dg?!`r7m37385b9agM)*B*6HZz5R!v`u}BQ{6B82w<VQzG zh2{`eFkH_nM1-!ct^o2oJ3FD|5?)x$!<OI5%F5Uw9st~KH`3G7Ls^K>zIwG<&2H?! zH{Zg-0*po@bUGa>D=Wb;%%|9tloU7|4mR%n{T($mHKDelxE|(u+`YcO4iFI)6@`_R zl>ncfo*pqA#0l`*SI_Go1r!z*29TefofTU<JOVx%!!XFs&i>Rwsi~<f`ID0qC=?1& zbwYk#4;2!Lgu1%A=;GpnHa9ov=H^CRKKjQ3!i^vQPrhFP-;G}Z-;F=u^S}5#RJbz$ O0000<MNUMnLSTYz3r7C{ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1acdf8ea936009cb61fb51706d8d9aa69204759d GIT binary patch literal 1825 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 P00000NkvXXu0mjfzB-0{ literal 0 HcmV?d00001 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<Ui::WhoReadContent> WhoReacted( const style::WhoRead &st) { return WhoReacted(item, reaction, context, st, nullptr); } +rpl::producer<Ui::WhoReadContent> WhenEdited( + not_null<PeerData*> 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<QWidget*> context, // Cache results for this lifetime. const style::WhoRead &st); +[[nodiscard]] rpl::producer<Ui::WhoReadContent> WhenEdited( + not_null<PeerData*> 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>() : 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<Ui::PopupMenu> 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<Ui::PopupMenu*> menu, + not_null<HistoryItem*> item, + bool insertSeparator) { + if (item->history()->peer->isUser()) { + if (const auto edited = item->Get<HistoryMessageEdited>()) { + 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<Ui::PopupMenu*> menu, not_null<QWidget*> 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<Ui::PopupMenu*> menu, + not_null<HistoryItem*> item) { + AddWhenEditedActionHelper(menu, item, true); +} + void AddEditTagAction( not_null<Ui::PopupMenu*> 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<QWidget*> context, not_null<HistoryItem*> item, not_null<Window::SessionController*> controller); +void MaybeAddWhenEditedAction( + not_null<Ui::PopupMenu*> menu, + not_null<HistoryItem*> item); void ShowWhoReactedMenu( not_null<base::unique_qptr<Ui::PopupMenu>*> 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<Menu::ItemBase> WhenReadContextAction( not_null<PopupMenu*> menu, rpl::producer<WhoReadContent> content, - Fn<void()> showOrPremium); + Fn<void()> showOrPremium = nullptr); enum class WhoReactedType : uchar { Viewed,