Better replace many same emoji at once.

This commit is contained in:
John Preston 2022-08-08 15:34:04 +03:00
parent a098abefd7
commit dfb3346096

View file

@ -798,27 +798,41 @@ SuggestionsQuery SuggestionsController::getEmojiQuery() {
const auto legacyLimit = GetSuggestionMaxLength(); const auto legacyLimit = GetSuggestionMaxLength();
const auto position = cursor.position(); const auto position = cursor.position();
const auto findTextPart = [&]() -> SuggestionsQuery { const auto findTextPart = [&]() -> SuggestionsQuery {
auto previousFragmentStart = 0;
auto previousFragmentName = QString();
auto document = _field->document(); auto document = _field->document();
auto block = document->findBlock(position); auto block = document->findBlock(position);
for (auto i = block.begin(); !i.atEnd(); ++i) { for (auto i = block.begin(); !i.atEnd(); ++i) {
auto fragment = i.fragment(); auto fragment = i.fragment();
if (!fragment.isValid()) continue; if (!fragment.isValid()) {
continue;
}
auto from = fragment.position(); auto from = fragment.position();
auto till = from + fragment.length(); auto till = from + fragment.length();
if (from >= position || till < position) {
continue;
}
const auto format = fragment.charFormat(); const auto format = fragment.charFormat();
if (format.objectType() == InputField::kCustomEmojiFormat) { if (format.objectType() == InputField::kCustomEmojiFormat) {
previousFragmentName = QString();
continue; continue;
} else if (format.isImageFormat()) { } else if (format.isImageFormat()) {
const auto imageName = format.toImageFormat().name(); 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; _queryStartPosition = position - 1;
_emojiQueryLength = (position - from); const auto start = (previousFragmentName == imageName)
? previousFragmentStart
: from;
_emojiQueryLength = (position - start);
return emoji; return emoji;
} else {
continue;
} }
}
if (from >= position || till < position) {
previousFragmentName = QString();
continue; continue;
} }
_queryStartPosition = from; _queryStartPosition = from;