diff --git a/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp b/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp index 8b24df18a..1a18f7071 100644 --- a/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp +++ b/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp @@ -810,6 +810,10 @@ bool FieldAutocomplete::eventFilter(QObject *obj, QEvent *e) { ? _moderateKeyActivateCallback(key) : false; } + } else if (ev->modifiers() & Qt::ControlModifier) { + if (ev->key() == Qt::Key_Enter || ev->key() == Qt::Key_Return) { + return _inner->chooseSelected(ChooseMethod::ByCtrlEnter); + } } } return QWidget::eventFilter(obj, e); @@ -1230,7 +1234,7 @@ void FieldAutocomplete::Inner::setRecentInlineBotsInRows(int32 bots) { void FieldAutocomplete::Inner::mousePressEvent(QMouseEvent *e) { selectByMouse(e->globalPos()); - if (e->button() == Qt::LeftButton) { + if (e->button() == Qt::LeftButton || e->button() == Qt::RightButton) { if (_overDelete && _sel >= 0 && _sel < (_mrows->empty() ? _hrows->size() : _recentInlineBotsInRows)) { bool removed = false; if (_mrows->empty()) { @@ -1260,7 +1264,15 @@ void FieldAutocomplete::Inner::mousePressEvent(QMouseEvent *e) { selectByMouse(e->globalPos()); } else if (_srows->empty()) { - chooseSelected(FieldAutocomplete::ChooseMethod::ByClick); + if (e->button() == Qt::LeftButton) { + if (e->modifiers() & Qt::ControlModifier) { + chooseSelected(FieldAutocomplete::ChooseMethod::ByCtrlClick); + } else { + chooseSelected(FieldAutocomplete::ChooseMethod::ByClick); + } + } else if (e->button() == Qt::RightButton) { + chooseSelected(FieldAutocomplete::ChooseMethod::ByRightClick); + } } else { _down = _sel; _previewTimer.callOnce(QApplication::startDragTime()); @@ -1283,7 +1295,15 @@ void FieldAutocomplete::Inner::mouseReleaseEvent(QMouseEvent *e) { if (_sel < 0 || _sel != pressed || _srows->empty()) return; - chooseSelected(FieldAutocomplete::ChooseMethod::ByClick); + if (e->button() == Qt::LeftButton) { + if (e->modifiers() & Qt::ControlModifier) { + chooseSelected(FieldAutocomplete::ChooseMethod::ByCtrlClick); + } else { + chooseSelected(FieldAutocomplete::ChooseMethod::ByClick); + } + } else if (e->button() == Qt::RightButton) { + chooseSelected(FieldAutocomplete::ChooseMethod::ByRightClick); + } } void FieldAutocomplete::Inner::contextMenuEvent(QContextMenuEvent *e) { diff --git a/Telegram/SourceFiles/chat_helpers/field_autocomplete.h b/Telegram/SourceFiles/chat_helpers/field_autocomplete.h index 1bb75f122..37c7b5b43 100644 --- a/Telegram/SourceFiles/chat_helpers/field_autocomplete.h +++ b/Telegram/SourceFiles/chat_helpers/field_autocomplete.h @@ -80,6 +80,9 @@ public: ByEnter, ByTab, ByClick, + ByRightClick, + ByCtrlEnter, + ByCtrlClick, }; struct MentionChosen { not_null user; diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 366b79186..eaf432bf5 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -398,7 +398,10 @@ HistoryWidget::HistoryWidget( ) | rpl::start_with_next([=](FieldAutocomplete::MentionChosen data) { auto replacement = QString(); auto entityTag = QString(); - if (data.mention.isEmpty()) { + if (data.mention.isEmpty() + || data.method == FieldAutocomplete::ChooseMethod::ByRightClick + || data.method == FieldAutocomplete::ChooseMethod::ByCtrlEnter + || data.method == FieldAutocomplete::ChooseMethod::ByCtrlClick) { replacement = data.user->firstName; if (replacement.isEmpty()) { replacement = data.user->name(); @@ -7130,14 +7133,14 @@ void HistoryWidget::mentionUser(PeerData *peer) { const auto user = peer->asUser(); QString replacement, entityTag; - if (user->username.isEmpty()) { + if (user->username().isEmpty()) { replacement = user->firstName; if (replacement.isEmpty()) { - replacement = user->name; + replacement = user->name(); } entityTag = PrepareMentionTag(user); } else { - replacement = '@' + user->username; + replacement = '@' + user->username(); } _field->insertTag(replacement, entityTag); } diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp index 8f4dbc38a..6f7c1581e 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp @@ -1662,7 +1662,10 @@ void ComposeControls::initAutocomplete() { _autocomplete->mentionChosen( ) | rpl::start_with_next([=](FieldAutocomplete::MentionChosen data) { const auto user = data.user; - if (data.mention.isEmpty()) { + if (data.mention.isEmpty() + || data.method == FieldAutocomplete::ChooseMethod::ByRightClick + || data.method == FieldAutocomplete::ChooseMethod::ByCtrlEnter + || data.method == FieldAutocomplete::ChooseMethod::ByCtrlClick) { _field->insertTag( user->firstName.isEmpty() ? user->name() : user->firstName, PrepareMentionTag(user)); diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 1e399cbac..e8a7e0de4 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -2702,7 +2702,7 @@ void MainWidget::searchInChat(Dialogs::Key chat) { searchMessages(QString(), chat); } void MainWidget::mentionUser(PeerData *peer) { - if (!_history->peer() || !_history->peer()->canWrite()) { + if (!_history->peer() || !Data::CanSendTexts(_history->peer())) { return; }