From 31da11dce6925d6832a7015f13bde088c8c17c6d Mon Sep 17 00:00:00 2001 From: Fallen_Breath Date: Wed, 17 Nov 2021 00:38:09 +0800 Subject: [PATCH] Smart rule name auto-completion Search in substrings only if no rule name starts with the query string --- .../java/carpet/settings/SettingsManager.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/carpet/settings/SettingsManager.java b/src/main/java/carpet/settings/SettingsManager.java index 745c5505..ce8711ac 100644 --- a/src/main/java/carpet/settings/SettingsManager.java +++ b/src/main/java/carpet/settings/SettingsManager.java @@ -17,6 +17,7 @@ import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.command.CommandSource; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.MinecraftServer; import net.minecraft.server.ServerTask; @@ -550,14 +551,24 @@ public class SettingsManager } static CompletableFuture suggestMatchingContains(Stream stream, SuggestionsBuilder suggestionsBuilder) { + List regularSuggestionList = new ArrayList<>(); + List smartSuggestionList = new ArrayList<>(); String query = suggestionsBuilder.getRemaining().toLowerCase(Locale.ROOT); - var filteredSuggestionList = stream.filter((listItem) -> { //Regex camelCase Search + stream.forEach((listItem) -> { + // Regex camelCase Search var words = Arrays.stream(listItem.split("(? s.toLowerCase(Locale.ROOT)).collect(Collectors.toList()); var prefixes = new ArrayList(words.size()); for (int i = 0; i < words.size(); i++) prefixes.add(String.join("",words.subList(i, words.size()))); - return prefixes.stream().anyMatch(s -> s.startsWith(query)); + if (prefixes.stream().anyMatch(s -> s.startsWith(query))) { + smartSuggestionList.add(listItem); + } + // Regular prefix matching, reference: CommandSource.suggestMatching + if (CommandSource.method_27136(query, listItem.toLowerCase())) { + regularSuggestionList.add(listItem); + } }); + var filteredSuggestionList = regularSuggestionList.isEmpty() ? smartSuggestionList : regularSuggestionList; Objects.requireNonNull(suggestionsBuilder); filteredSuggestionList.forEach(suggestionsBuilder::suggest); return suggestionsBuilder.buildFuture();