diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 39821e906c..70bc122edc 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -6912,6 +6912,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_polls_show_more#other" = "Show more ({count})"; "lng_polls_votes_collapse" = "Collapse"; "lng_polls_vote_yesterday" = "yesterday"; +"lng_polls_option_added_by" = "Added by {user}"; "lng_todo_title" = "Checklist"; "lng_todo_title_group" = "Group Checklist"; diff --git a/Telegram/SourceFiles/data/data_poll.cpp b/Telegram/SourceFiles/data/data_poll.cpp index 3973bab3ae..496d283d6f 100644 --- a/Telegram/SourceFiles/data/data_poll.cpp +++ b/Telegram/SourceFiles/data/data_poll.cpp @@ -121,6 +121,10 @@ bool PollData::applyChanges(const MTPDpoll &poll) { ProcessPollMedia(_owner, *media); result.media = PollMediaFromMTP(_owner, *media); } + if (const auto addedBy = answer.vadded_by()) { + result.addedBy = _owner->peer(peerFromMTP(*addedBy)); + result.addedDate = answer.vdate().value_or_empty(); + } return result; }, [&](const MTPDinputPollAnswer &answer) { auto result = PollAnswer(); diff --git a/Telegram/SourceFiles/data/data_poll.h b/Telegram/SourceFiles/data/data_poll.h index c2a4c09470..f371762c62 100644 --- a/Telegram/SourceFiles/data/data_poll.h +++ b/Telegram/SourceFiles/data/data_poll.h @@ -39,6 +39,8 @@ struct PollAnswer { QByteArray option; PollMedia media; std::vector> recentVoters; + PeerData *addedBy = nullptr; + TimeId addedDate = 0; int votes = 0; bool chosen = false; bool correct = false; diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 9fd5ab5284..17b2edac25 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -47,6 +47,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/boxes/edit_factcheck_box.h" #include "ui/boxes/report_box_graphics.h" #include "ui/controls/delete_message_context_action.h" +#include "ui/controls/who_reacted_context_action.h" +#include "ui/text/format_values.h" #include "ui/controls/swipe_handler.h" #include "ui/inactive_press.h" #include "ui/painter.h" @@ -110,6 +112,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_todo_list.h" #include "dialogs/ui/dialogs_video_userpic.h" #include "styles/style_chat.h" +#include "styles/style_chat_helpers.h" #include "styles/style_menu_icons.h" #include @@ -3372,6 +3375,48 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { textItem ? textItem : _dragStateItem, !added); } + if (!pollOptionLink.isEmpty() && leaderOrSelf) { + if (const auto media = leaderOrSelf->media()) { + if (const auto poll = media->poll()) { + if (const auto a = poll->answerByOption(pollOptionLink)) { + if (a->addedBy) { + if (!_menu->empty()) { + _menu->addSeparator( + &st::expandedMenuSeparator); + } + const auto photoSize + = st::defaultWhoRead.photoSize; + auto view = Ui::PeerUserpicView(); + auto userpic + = PeerData::GenerateUserpicImage( + a->addedBy, + view, + photoSize); + const auto date = a->addedDate + ? Ui::FormatDateTime( + base::unixtime::parse(a->addedDate)) + : QString(); + _menu->addAction( + base::make_unique_q< + Ui::WhoReactedEntryAction>( + _menu->menu(), + nullptr, + _menu->menu()->st(), + Ui::WhoReactedEntryData{ + .text = tr::lng_polls_option_added_by( + tr::now, + lt_user, + a->addedBy->shortName()), + .date = date, + .type = Ui::WhoReactedType + ::RefRecipient, + .userpic = std::move(userpic), + })); + } + } + } + } + } if (hasWhoReactedItem) { HistoryView::AddWhoReactedAction( _menu, diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp index ec9f9621cf..fb685245d4 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp @@ -38,6 +38,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/image/image.h" #include "ui/toast/toast.h" #include "ui/text/format_song_document_name.h" +#include "ui/text/format_values.h" #include "ui/text/text_utilities.h" #include "ui/controls/delete_message_context_action.h" #include "ui/controls/who_reacted_context_action.h" @@ -1428,6 +1429,41 @@ base::unique_qptr FillContextMenu( const auto added = (result->actions().size() > wasAmount); AddSelectRestrictionAction(result, item, !added); } + if (const auto pollOption = link + ? link->property(kPollOptionProperty).toByteArray() + : QByteArray(); !pollOption.isEmpty() && poll) { + if (const auto a = poll->answerByOption(pollOption)) { + if (a->addedBy) { + if (!result->empty()) { + result->addSeparator(&st::expandedMenuSeparator); + } + const auto photoSize = st::defaultWhoRead.photoSize; + auto view = Ui::PeerUserpicView(); + auto userpic = PeerData::GenerateUserpicImage( + a->addedBy, + view, + photoSize); + const auto date = a->addedDate + ? Ui::FormatDateTime( + base::unixtime::parse(a->addedDate)) + : QString(); + result->addAction( + base::make_unique_q( + result->menu(), + nullptr, + result->menu()->st(), + Ui::WhoReactedEntryData{ + .text = tr::lng_polls_option_added_by( + tr::now, + lt_user, + a->addedBy->shortName()), + .date = date, + .type = Ui::WhoReactedType::RefRecipient, + .userpic = std::move(userpic), + })); + } + } + } if (hasWhoReactedItem) { AddWhoReactedAction(result, list, item, list->controller()); } else if (item) {