[Improvement] Allow to mention by name from autocomplete

This commit is contained in:
Eric Kotato 2022-09-11 05:46:53 +03:00 committed by Eric Kotato
parent 0acba992fb
commit ef78f27f86
5 changed files with 38 additions and 9 deletions

View file

@ -837,6 +837,10 @@ bool FieldAutocomplete::eventFilter(QObject *obj, QEvent *e) {
? _moderateKeyActivateCallback(key) ? _moderateKeyActivateCallback(key)
: false; : 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); return QWidget::eventFilter(obj, e);
@ -1260,7 +1264,7 @@ void FieldAutocomplete::Inner::setRecentInlineBotsInRows(int32 bots) {
void FieldAutocomplete::Inner::mousePressEvent(QMouseEvent *e) { void FieldAutocomplete::Inner::mousePressEvent(QMouseEvent *e) {
selectByMouse(e->globalPos()); 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)) { if (_overDelete && _sel >= 0 && _sel < (_mrows->empty() ? _hrows->size() : _recentInlineBotsInRows)) {
bool removed = false; bool removed = false;
if (_mrows->empty()) { if (_mrows->empty()) {
@ -1290,7 +1294,15 @@ void FieldAutocomplete::Inner::mousePressEvent(QMouseEvent *e) {
selectByMouse(e->globalPos()); selectByMouse(e->globalPos());
} else if (_srows->empty()) { } else if (_srows->empty()) {
if (e->button() == Qt::LeftButton) {
if (e->modifiers() & Qt::ControlModifier) {
chooseSelected(FieldAutocomplete::ChooseMethod::ByCtrlClick);
} else {
chooseSelected(FieldAutocomplete::ChooseMethod::ByClick); chooseSelected(FieldAutocomplete::ChooseMethod::ByClick);
}
} else if (e->button() == Qt::RightButton) {
chooseSelected(FieldAutocomplete::ChooseMethod::ByRightClick);
}
} else { } else {
_down = _sel; _down = _sel;
_previewTimer.callOnce(QApplication::startDragTime()); _previewTimer.callOnce(QApplication::startDragTime());
@ -1313,8 +1325,16 @@ void FieldAutocomplete::Inner::mouseReleaseEvent(QMouseEvent *e) {
if (_sel < 0 || _sel != pressed || _srows->empty()) return; if (_sel < 0 || _sel != pressed || _srows->empty()) return;
if (e->button() == Qt::LeftButton) {
if (e->modifiers() & Qt::ControlModifier) {
chooseSelected(FieldAutocomplete::ChooseMethod::ByCtrlClick);
} else {
chooseSelected(FieldAutocomplete::ChooseMethod::ByClick); chooseSelected(FieldAutocomplete::ChooseMethod::ByClick);
} }
} else if (e->button() == Qt::RightButton) {
chooseSelected(FieldAutocomplete::ChooseMethod::ByRightClick);
}
}
void FieldAutocomplete::Inner::contextMenuEvent(QContextMenuEvent *e) { void FieldAutocomplete::Inner::contextMenuEvent(QContextMenuEvent *e) {
if (_sel < 0 || _srows->empty() || _down >= 0) { if (_sel < 0 || _srows->empty() || _down >= 0) {

View file

@ -85,6 +85,9 @@ public:
ByEnter, ByEnter,
ByTab, ByTab,
ByClick, ByClick,
ByRightClick,
ByCtrlEnter,
ByCtrlClick,
}; };
struct MentionChosen { struct MentionChosen {
not_null<UserData*> user; not_null<UserData*> user;

View file

@ -411,7 +411,10 @@ HistoryWidget::HistoryWidget(
) | rpl::start_with_next([=](FieldAutocomplete::MentionChosen data) { ) | rpl::start_with_next([=](FieldAutocomplete::MentionChosen data) {
auto replacement = QString(); auto replacement = QString();
auto entityTag = 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; replacement = data.user->firstName;
if (replacement.isEmpty()) { if (replacement.isEmpty()) {
replacement = data.user->name(); replacement = data.user->name();
@ -7509,14 +7512,14 @@ void HistoryWidget::mentionUser(PeerData *peer) {
const auto user = peer->asUser(); const auto user = peer->asUser();
QString replacement, entityTag; QString replacement, entityTag;
if (user->username.isEmpty()) { if (user->username().isEmpty()) {
replacement = user->firstName; replacement = user->firstName;
if (replacement.isEmpty()) { if (replacement.isEmpty()) {
replacement = user->name; replacement = user->name();
} }
entityTag = PrepareMentionTag(user); entityTag = PrepareMentionTag(user);
} else { } else {
replacement = '@' + user->username; replacement = '@' + user->username();
} }
_field->insertTag(replacement, entityTag); _field->insertTag(replacement, entityTag);
} }

View file

@ -1630,7 +1630,10 @@ void ComposeControls::initAutocomplete() {
_autocomplete->mentionChosen( _autocomplete->mentionChosen(
) | rpl::start_with_next([=](FieldAutocomplete::MentionChosen data) { ) | rpl::start_with_next([=](FieldAutocomplete::MentionChosen data) {
const auto user = data.user; 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( _field->insertTag(
user->firstName.isEmpty() ? user->name() : user->firstName, user->firstName.isEmpty() ? user->name() : user->firstName,
PrepareMentionTag(user)); PrepareMentionTag(user));

View file

@ -2698,7 +2698,7 @@ int MainWidget::backgroundFromY() const {
} }
void MainWidget::mentionUser(PeerData *peer) { void MainWidget::mentionUser(PeerData *peer) {
if (!_history->peer() || !_history->peer()->canWrite()) { if (!_history->peer() || !Data::CanSendTexts(_history->peer())) {
return; return;
} }