[Improvement] Allow to mention by name from autocomplete
This commit is contained in:
		
							parent
							
								
									4116ef1895
								
							
						
					
					
						commit
						1431cbdc52
					
				
					 5 changed files with 38 additions and 9 deletions
				
			
		| 
						 | 
					@ -864,6 +864,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);
 | 
				
			||||||
| 
						 | 
					@ -1303,7 +1307,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()) {
 | 
				
			||||||
| 
						 | 
					@ -1333,7 +1337,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());
 | 
				
			||||||
| 
						 | 
					@ -1356,8 +1368,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) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -452,7 +452,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();
 | 
				
			||||||
| 
						 | 
					@ -7671,14 +7674,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);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1682,7 +1682,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));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2797,7 +2797,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;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue