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 d9cf5dc59..436083227 100644 --- a/Telegram/Resources/langs/rewrites/en.json +++ b/Telegram/Resources/langs/rewrites/en.json @@ -180,6 +180,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 92d6618f5..4146a5823 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp @@ -1553,6 +1553,14 @@ base::unique_qptr ParticipantsBoxController::rowContextMenu( : Dialogs::Key(), user); }), &st::menuIconSearch); + if (const auto openedPeer = mainwidget->peer()) { + if (openedPeer->canWrite() && 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 98e902548..aa5cfe3ad 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -6591,6 +6591,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 22ea26410..712774da8 100644 --- a/Telegram/SourceFiles/history/history_widget.h +++ b/Telegram/SourceFiles/history/history_widget.h @@ -269,6 +269,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 463985c9a..0452b13ec 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -2621,6 +2621,13 @@ void MainWidget::searchInChat(Dialogs::Key chat) { _dialogs->setInnerFocus(); } } +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 6b7360e58..e48bd18bc 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 3e7e41e3e..d7a7e0ee6 100644 --- a/Telegram/SourceFiles/ui/menu_icons.style +++ b/Telegram/SourceFiles/ui/menu_icons.style @@ -88,6 +88,7 @@ menuIconRestore: icon {{ "menu/restore", menuSubmenuArrowFg }}; menuIconSettings: icon {{ "menu/settings", menuSubmenuArrowFg }}; menuIconSearch: icon {{ "menu/search", menuSubmenuArrowFg }}; menuIconHide: icon {{ "menu/hide", menuSubmenuArrowFg }}; +menuIconMention: icon {{ "menu/mention", menuSubmenuArrowFg }}; mediaMenuIconStickers: icon {{ "menu/stickers", mediaviewMenuFg }}; mediaMenuIconCancel: icon {{ "menu/cancel", mediaviewMenuFg }};