get completion string based on trigger position instead of current word

This commit is contained in:
Jussi Kuokkanen 2020-08-31 18:04:59 +03:00
parent 254b7549eb
commit beec2607fc
2 changed files with 19 additions and 10 deletions

View file

@ -129,10 +129,10 @@ void
FilteredTextEdit::insertCompletion(QString completion) FilteredTextEdit::insertCompletion(QString completion)
{ {
// Paint the current word and replace it with 'completion' // Paint the current word and replace it with 'completion'
auto cur_word = wordUnderCursor(); auto cur_text = textAfterPosition(trigger_pos_);
auto tc = textCursor(); auto tc = textCursor();
tc.movePosition(QTextCursor::Left, QTextCursor::MoveAnchor, cur_word.length()); tc.movePosition(QTextCursor::Left, QTextCursor::MoveAnchor, cur_text.length());
tc.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, cur_word.length()); tc.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, cur_text.length());
tc.insertText(completion); tc.insertText(completion);
setTextCursor(tc); setTextCursor(tc);
} }
@ -248,8 +248,8 @@ FilteredTextEdit::keyPressEvent(QKeyEvent *event)
} }
case Qt::Key_Colon: { case Qt::Key_Colon: {
QTextEdit::keyPressEvent(event); QTextEdit::keyPressEvent(event);
trigger_pos_ = textCursor().position() - 1;
emoji_popup_open_ = true; emoji_popup_open_ = true;
emoji_completion_model_->setFilterRegExp(wordUnderCursor());
break; break;
} }
case Qt::Key_Return: case Qt::Key_Return:
@ -311,15 +311,15 @@ FilteredTextEdit::keyPressEvent(QKeyEvent *event)
if (isModifier) if (isModifier)
return; return;
if (emoji_popup_open_ && wordUnderCursor().length() > 2) { if (emoji_popup_open_ && textAfterPosition(trigger_pos_).length() > 2) {
// Update completion // Update completion
emoji_completion_model_->setFilterRegExp(wordUnderCursor()); emoji_completion_model_->setFilterRegExp(textAfterPosition(trigger_pos_));
completer_->complete(completerRect()); completer_->complete(completerRect());
} }
if (emoji_popup_open_ && if (emoji_popup_open_ &&
(completer_->completionCount() < 1 || (completer_->completionCount() < 1 ||
!wordUnderCursor().contains(QRegExp(":[^\r\n\t\f\v :]+$")))) { !textAfterPosition(trigger_pos_).contains(QRegExp(":[^\r\n\t\f\v :]+$")))) {
// No completions for this word or another word than the completer was // No completions for this word or another word than the completer was
// started with // started with
emoji_popup_open_ = false; emoji_popup_open_ = false;
@ -441,7 +441,8 @@ FilteredTextEdit::completerRect()
// Move left edge to the beginning of the word // Move left edge to the beginning of the word
auto cursor = textCursor(); auto cursor = textCursor();
auto rect = cursorRect(); auto rect = cursorRect();
cursor.movePosition(QTextCursor::Left, QTextCursor::MoveAnchor, wordUnderCursor().length()); cursor.movePosition(QTextCursor::Left, QTextCursor::MoveAnchor,
textAfterPosition(trigger_pos_).length());
auto cursor_global_x = viewport()->mapToGlobal(cursorRect(cursor).topLeft()).x(); auto cursor_global_x = viewport()->mapToGlobal(cursorRect(cursor).topLeft()).x();
auto rect_global_left = viewport()->mapToGlobal(rect.bottomLeft()).x(); auto rect_global_left = viewport()->mapToGlobal(rect.bottomLeft()).x();
auto dx = qAbs(rect_global_left - cursor_global_x); auto dx = qAbs(rect_global_left - cursor_global_x);

View file

@ -86,6 +86,7 @@ private:
bool emoji_popup_open_ = false; bool emoji_popup_open_ = false;
CompletionModel *emoji_completion_model_; CompletionModel *emoji_completion_model_;
std::deque<QString> true_history_, working_history_; std::deque<QString> true_history_, working_history_;
int trigger_pos_; // Where emoji completer was triggered
size_t history_index_; size_t history_index_;
QCompleter *completer_; QCompleter *completer_;
QTimer *typingTimer_; QTimer *typingTimer_;
@ -116,7 +117,14 @@ private:
cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor); cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor);
return cursor.selectedText(); return cursor.selectedText();
} }
QString wordUnderCursor() QString textAfterPosition(int pos)
{
auto tc = textCursor();
tc.setPosition(pos);
tc.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);
return tc.selectedText();
}
/*QString wordUnderCursor()
{ {
auto tc = textCursor(); auto tc = textCursor();
auto editor_text = toPlainText(); auto editor_text = toPlainText();
@ -130,7 +138,7 @@ private:
// Revert back // Revert back
std::reverse(text.begin(), text.end()); std::reverse(text.begin(), text.end());
return text; return text;
} }*/
dialogs::PreviewUploadOverlay previewDialog_; dialogs::PreviewUploadOverlay previewDialog_;