Improved search of emoji from emoji list widget.

This commit is contained in:
23rd
2026-04-20 08:31:47 +03:00
parent 22449a0913
commit 252bf3e363
4 changed files with 12 additions and 9 deletions
@@ -670,12 +670,13 @@ void EmojiListWidget::applyNextSearchQuery() {
} }
const auto guard = gsl::finally([&] { finish(); }); const auto guard = gsl::finally([&] { finish(); });
auto plain = collectPlainSearchResults(); auto plain = collectPlainSearchResults();
if (_searchEmoji == _searchEmojiPrevious) {
return;
}
_searchEmoticon = QString(); _searchEmoticon = QString();
for (const auto emoji : plain) { {
_searchEmoticon += emoji->text(); auto exactSet = base::flat_set<EmojiPtr>();
const auto exact = SearchEmoji(_searchQuery, exactSet, true);
for (const auto emoji : exact) {
_searchEmoticon += emoji->text();
}
} }
_searchResults.clear(); _searchResults.clear();
_searchCustomIds.clear(); _searchCustomIds.clear();
@@ -146,7 +146,8 @@ rpl::producer<std::vector<GifSection>> GifSectionsValue(
[[nodiscard]] std::vector<EmojiPtr> SearchEmoji( [[nodiscard]] std::vector<EmojiPtr> SearchEmoji(
const std::vector<QString> &query, const std::vector<QString> &query,
base::flat_set<EmojiPtr> &outResultSet) { base::flat_set<EmojiPtr> &outResultSet,
bool exact) {
auto result = std::vector<EmojiPtr>(); auto result = std::vector<EmojiPtr>();
const auto pushPlain = [&](EmojiPtr emoji) { const auto pushPlain = [&](EmojiPtr emoji) {
if (result.size() < kEmojiSearchLimit if (result.size() < kEmojiSearchLimit
@@ -170,7 +171,7 @@ rpl::producer<std::vector<GifSection>> GifSectionsValue(
refreshed = true; refreshed = true;
keywords.refresh(); keywords.refresh();
} }
const auto list = keywords.queryMine(entry); const auto list = keywords.queryMine(entry, exact);
for (const auto &entry : list) { for (const auto &entry : list) {
pushPlain(entry.emoji); pushPlain(entry.emoji);
if (result.size() >= kEmojiSearchLimit) { if (result.size() >= kEmojiSearchLimit) {
@@ -70,7 +70,8 @@ struct GifSection {
[[nodiscard]] std::vector<EmojiPtr> SearchEmoji( [[nodiscard]] std::vector<EmojiPtr> SearchEmoji(
const std::vector<QString> &query, const std::vector<QString> &query,
base::flat_set<EmojiPtr> &outResultSet); base::flat_set<EmojiPtr> &outResultSet,
bool exact = false);
struct StickerIcon { struct StickerIcon {
explicit StickerIcon(uint64 setId); explicit StickerIcon(uint64 setId);
@@ -80,7 +80,7 @@ private:
}; };
[[nodiscard]] std::vector<QString> FieldQuery(not_null<InputField*> field) { [[nodiscard]] std::vector<QString> FieldQuery(not_null<InputField*> field) {
if (const auto last = field->getLastText(); !last.isEmpty()) { if (const auto last = field->getLastText().trimmed(); !last.isEmpty()) {
return { last }; return { last };
} }
return {}; return {};