diff --git a/Telegram/Resources/icons/menu/mention.png b/Telegram/Resources/icons/menu/mention.png new file mode 100644 index 000000000..bf6e9f6c5 Binary files /dev/null and b/Telegram/Resources/icons/menu/mention.png differ diff --git a/Telegram/Resources/icons/menu/mention@2x.png b/Telegram/Resources/icons/menu/mention@2x.png new file mode 100644 index 000000000..f82cb39d7 Binary files /dev/null and b/Telegram/Resources/icons/menu/mention@2x.png differ diff --git a/Telegram/Resources/icons/menu/mention@3x.png b/Telegram/Resources/icons/menu/mention@3x.png new file mode 100644 index 000000000..0b0dcb6f5 Binary files /dev/null and b/Telegram/Resources/icons/menu/mention@3x.png differ diff --git a/Telegram/Resources/langs/rewrites/en.json b/Telegram/Resources/langs/rewrites/en.json index e2cd9b5e2..cd8644a7b 100644 --- a/Telegram/Resources/langs/rewrites/en.json +++ b/Telegram/Resources/langs/rewrites/en.json @@ -147,6 +147,7 @@ "ktg_forward_subtitle_uncaptioned": "uncaptioned", "ktg_forward_subtitle_group_all_media": "as albums", "ktg_forward_subtitle_separate_messages": "one by one", + "ktg_profile_mention_user": "Mention user", "ktg_filters_exclude_not_owned": "Not owned", "ktg_filters_exclude_not_admin": "Not administrated", "ktg_filters_exclude_owned": "Owned", diff --git a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp index b8942fc36..ea841eb27 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp @@ -1614,6 +1614,14 @@ base::unique_qptr ParticipantsBoxController::rowContextMenu( : Dialogs::Key(), user); }), &st::menuIconSearch); + if (const auto openedPeer = mainwidget->peer()) { + if (Data::CanSendTexts(openedPeer) && participant->isUser()) { + result->addAction( + ktr("ktg_profile_mention_user"), + crl::guard(this, [=] { mainwidget->mentionUser(user); }), + &st::menuIconMention); + } + } } } if (_role == Role::Kicked) { diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index badb84e72..a0b14583d 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -7101,6 +7101,25 @@ bool HistoryWidget::sendExistingPhoto( return true; } +void HistoryWidget::mentionUser(PeerData *peer) { + if (!peer || !peer->isUser()) { + return; + } + + const auto user = peer->asUser(); + QString replacement, entityTag; + if (user->username.isEmpty()) { + replacement = user->firstName; + if (replacement.isEmpty()) { + replacement = user->name; + } + entityTag = PrepareMentionTag(user); + } else { + replacement = '@' + user->username; + } + _field->insertTag(replacement, entityTag); +} + void HistoryWidget::showInfoTooltip( const TextWithEntities &text, Fn hiddenCallback) { diff --git a/Telegram/SourceFiles/history/history_widget.h b/Telegram/SourceFiles/history/history_widget.h index cd3f560cb..05535711c 100644 --- a/Telegram/SourceFiles/history/history_widget.h +++ b/Telegram/SourceFiles/history/history_widget.h @@ -261,6 +261,8 @@ public: not_null photo, Api::SendOptions options); + void mentionUser(PeerData *peer); + void showInfoTooltip( const TextWithEntities &text, Fn hiddenCallback); diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index f793762e5..1e399cbac 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -2701,6 +2701,13 @@ int MainWidget::backgroundFromY() const { void MainWidget::searchInChat(Dialogs::Key chat) { searchMessages(QString(), chat); } +void MainWidget::mentionUser(PeerData *peer) { + if (!_history->peer() || !_history->peer()->canWrite()) { + return; + } + + _history->mentionUser(peer); +} bool MainWidget::contentOverlapped(const QRect &globalRect) { return _history->contentOverlapped(globalRect) diff --git a/Telegram/SourceFiles/mainwidget.h b/Telegram/SourceFiles/mainwidget.h index 8feb62dce..d3125a1c1 100644 --- a/Telegram/SourceFiles/mainwidget.h +++ b/Telegram/SourceFiles/mainwidget.h @@ -209,6 +209,8 @@ public: void searchInChat(Dialogs::Key chat); + void mentionUser(PeerData *peer); + void showChooseReportMessages( not_null peer, Ui::ReportReason reason, diff --git a/Telegram/SourceFiles/ui/menu_icons.style b/Telegram/SourceFiles/ui/menu_icons.style index 1edca85ee..f474b3c68 100644 --- a/Telegram/SourceFiles/ui/menu_icons.style +++ b/Telegram/SourceFiles/ui/menu_icons.style @@ -78,6 +78,7 @@ menuIconPersonal: icon {{ "menu/personal", menuIconColor }}; menuIconPorn: icon {{ "menu/porn", menuIconColor }}; menuIconViolence: icon {{ "menu/violence", menuIconColor }}; menuIconHide: icon {{ "menu/hide", menuIconColor }}; +menuIconMention: icon {{ "menu/mention", menuSubmenuArrowFg }}; menuIconMuteFor: icon {{ "menu/mute_for", menuIconColor }}; menuIconSilent: icon {{ "menu/silent", menuIconColor }}; menuIconCustomize: icon {{ "menu/customize", menuIconColor }};