From dfb334609675a54ed3cf6308722fee88b7d59d94 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 8 Aug 2022 15:34:04 +0300 Subject: [PATCH] Better replace many same emoji at once. --- .../chat_helpers/emoji_suggestions_widget.cpp | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/Telegram/SourceFiles/chat_helpers/emoji_suggestions_widget.cpp b/Telegram/SourceFiles/chat_helpers/emoji_suggestions_widget.cpp index 77e10d817..a73ff0f8e 100644 --- a/Telegram/SourceFiles/chat_helpers/emoji_suggestions_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/emoji_suggestions_widget.cpp @@ -798,27 +798,41 @@ SuggestionsQuery SuggestionsController::getEmojiQuery() { const auto legacyLimit = GetSuggestionMaxLength(); const auto position = cursor.position(); const auto findTextPart = [&]() -> SuggestionsQuery { + auto previousFragmentStart = 0; + auto previousFragmentName = QString(); auto document = _field->document(); auto block = document->findBlock(position); for (auto i = block.begin(); !i.atEnd(); ++i) { auto fragment = i.fragment(); - if (!fragment.isValid()) continue; + if (!fragment.isValid()) { + continue; + } auto from = fragment.position(); auto till = from + fragment.length(); - if (from >= position || till < position) { - continue; - } const auto format = fragment.charFormat(); if (format.objectType() == InputField::kCustomEmojiFormat) { + previousFragmentName = QString(); continue; } else if (format.isImageFormat()) { const auto imageName = format.toImageFormat().name(); - if (const auto emoji = Emoji::FromUrl(imageName)) { + if (from >= position || till < position) { + previousFragmentStart = from; + previousFragmentName = imageName; + continue; + } else if (const auto emoji = Emoji::FromUrl(imageName)) { _queryStartPosition = position - 1; - _emojiQueryLength = (position - from); + const auto start = (previousFragmentName == imageName) + ? previousFragmentStart + : from; + _emojiQueryLength = (position - start); return emoji; + } else { + continue; } + } + if (from >= position || till < position) { + previousFragmentName = QString(); continue; } _queryStartPosition = from;