From 226a43c8dde16948209864025cc10edffadfbf84 Mon Sep 17 00:00:00 2001 From: trafficlunar Date: Wed, 15 Oct 2025 22:30:56 +0100 Subject: [PATCH] feat: search filter for options toggle list --- .../gui/OptionsToggleList.java | 32 ++++++++++++++++--- .../gui/OptionsToggleScreen.java | 21 ++++++++++-- .../optionsprofiles/gui/ProfilesList.java | 13 -------- .../optionsprofiles/profiles/Profiles.java | 3 +- .../assets/optionsprofiles/lang/en_us.json | 1 + settings.gradle | 2 +- 6 files changed, 49 insertions(+), 23 deletions(-) diff --git a/common/src/main/java/net/trafficlunar/optionsprofiles/gui/OptionsToggleList.java b/common/src/main/java/net/trafficlunar/optionsprofiles/gui/OptionsToggleList.java index 8baf833..3800a19 100644 --- a/common/src/main/java/net/trafficlunar/optionsprofiles/gui/OptionsToggleList.java +++ b/common/src/main/java/net/trafficlunar/optionsprofiles/gui/OptionsToggleList.java @@ -10,6 +10,7 @@ import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.ContainerObjectSelectionList; import net.minecraft.client.gui.components.CycleButton; +import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.Tooltip; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.narration.NarratableEntry; @@ -25,18 +26,37 @@ import java.util.stream.Stream; public class OptionsToggleList extends ContainerObjectSelectionList { private final String profileName; private final ProfileConfiguration profileConfiguration; + private final EditBox searchBox; + private final List allEntries = new ArrayList<>(); - public OptionsToggleList(OptionsToggleScreen optionsToggleScreen, Minecraft minecraft, String profileName, ProfileConfiguration profileConfiguration) { + public OptionsToggleList(OptionsToggleScreen optionsToggleScreen, Minecraft minecraft, String profileName, ProfileConfiguration profileConfiguration, EditBox searchBox) { super(minecraft, optionsToggleScreen.width, optionsToggleScreen.layout.getContentHeight(), optionsToggleScreen.layout.getHeaderHeight(), 20); this.profileConfiguration = profileConfiguration; this.profileName = profileName; + this.searchBox = searchBox; + + this.searchBox.setResponder(this::filterEntries); refreshEntries(false, false); } + private void filterEntries(String searchText) { + this.clearEntries(); + + if (searchText.isEmpty()) { + allEntries.forEach(this::addEntry); + return; + } + + String filter = searchText.toLowerCase(); + allEntries.stream() + .filter(entry -> entry.key.toLowerCase().contains(filter)) + .forEach(this::addEntry); + } + // If overriding boolean is set to true then this function will set every option in the list to overrideToggle (false or true) public void refreshEntries(boolean overriding, boolean overrideToggle) { - this.clearEntries(); + allEntries.clear(); Path profile = Profiles.PROFILES_DIRECTORY.resolve(profileName); Path optionsFile = profile.resolve("options.txt"); @@ -60,14 +80,16 @@ public class OptionsToggleList extends ContainerObjectSelectionList toggleButton; OptionEntry(String optionKey, String optionValue, boolean toggled) { + this.key = optionKey; this.optionKey = Component.literal(optionKey); this.toggleButton = CycleButton.onOffBuilder(toggled).displayOnlyValue().create(0, 0, 44, 20, Component.empty(), (button, boolean_) -> { diff --git a/common/src/main/java/net/trafficlunar/optionsprofiles/gui/OptionsToggleScreen.java b/common/src/main/java/net/trafficlunar/optionsprofiles/gui/OptionsToggleScreen.java index 2c99867..d483510 100644 --- a/common/src/main/java/net/trafficlunar/optionsprofiles/gui/OptionsToggleScreen.java +++ b/common/src/main/java/net/trafficlunar/optionsprofiles/gui/OptionsToggleScreen.java @@ -1,18 +1,22 @@ package net.trafficlunar.optionsprofiles.gui; -import net.trafficlunar.optionsprofiles.profiles.ProfileConfiguration; import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.components.StringWidget; import net.minecraft.client.gui.layouts.LinearLayout; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.options.OptionsSubScreen; import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; +import net.trafficlunar.optionsprofiles.profiles.ProfileConfiguration; public class OptionsToggleScreen extends OptionsSubScreen { private final Component profileName; private final ProfileConfiguration profileConfiguration; private OptionsToggleList optionsToggleList; + private EditBox searchBox; protected OptionsToggleScreen(Screen lastScreen, Component profileName, ProfileConfiguration profileConfiguration) { super(lastScreen, null, Component.literal(Component.translatable("gui.optionsprofiles.options-toggle").append(": ").getString() + profileName.getString())); @@ -20,11 +24,22 @@ public class OptionsToggleScreen extends OptionsSubScreen { this.profileConfiguration = profileConfiguration; } + protected void init() { + this.searchBox = new EditBox(this.minecraft.font, 0, 0, 200, 20, Component.empty()); + this.searchBox.setHint(Component.translatable("gui.optionsprofiles.options-search-hint")); + super.init(); + } + + protected void addTitle() { + this.layout.addToHeader(new StringWidget(this.title, this.font), (settings) -> settings.alignVerticallyTop().paddingTop(6)); + this.layout.addToHeader(this.searchBox, (settings) -> settings.alignVerticallyBottom().padding(4)); + } + protected void addOptions() {} protected void addContents() { - this.layout.setHeaderHeight(24); - this.optionsToggleList = this.layout.addToContents(new OptionsToggleList(this, this.minecraft, profileName.getString(), this.profileConfiguration)); + this.layout.setHeaderHeight(42); + this.optionsToggleList = this.layout.addToContents(new OptionsToggleList(this, this.minecraft, profileName.getString(), this.profileConfiguration, this.searchBox)); } protected void addFooter() { diff --git a/common/src/main/java/net/trafficlunar/optionsprofiles/gui/ProfilesList.java b/common/src/main/java/net/trafficlunar/optionsprofiles/gui/ProfilesList.java index 346f984..fe37ae0 100644 --- a/common/src/main/java/net/trafficlunar/optionsprofiles/gui/ProfilesList.java +++ b/common/src/main/java/net/trafficlunar/optionsprofiles/gui/ProfilesList.java @@ -50,12 +50,6 @@ public class ProfilesList extends ContainerObjectSelectionList { Profiles.loadProfile(profileName.getString()); OptionsProfilesMod.LOGGER.warn("[Profile '{}']: Loaded through button", profileName); - - ProfilesList.this.checkEntriesLoaded(); - button.active = false; }) .size(75, 20) .build(); @@ -116,9 +107,5 @@ public class ProfilesList extends ContainerObjectSelectionList narratables() { return ImmutableList.of(this.editButton, this.loadButton); } - - protected void checkLoaded() { - this.loadButton.active = !Profiles.isProfileLoaded(profileName.getString()); - } } } \ No newline at end of file diff --git a/common/src/main/java/net/trafficlunar/optionsprofiles/profiles/Profiles.java b/common/src/main/java/net/trafficlunar/optionsprofiles/profiles/Profiles.java index 483158b..40a60ae 100644 --- a/common/src/main/java/net/trafficlunar/optionsprofiles/profiles/Profiles.java +++ b/common/src/main/java/net/trafficlunar/optionsprofiles/profiles/Profiles.java @@ -29,8 +29,6 @@ public class Profiles { public static final Path IRIS_OPTIONS_FILE = Paths.get("config/iris.properties"); public static final Path DISTANT_HORIZONS_OPTIONS_FILE = Paths.get("config/DistantHorizons.toml"); - private static final Minecraft minecraft = Minecraft.getInstance(); - public static void createProfile() { String profileName = "Profile 1"; Path profile = PROFILES_DIRECTORY.resolve(profileName); @@ -269,6 +267,7 @@ public class Profiles { } // Reload Minecraft options + Minecraft minecraft = Minecraft.getInstance(); minecraft.options.load(); if (ProfileConfiguration.get(profileName).getOptionsToLoad().contains("resourcePacks")) { diff --git a/common/src/main/resources/assets/optionsprofiles/lang/en_us.json b/common/src/main/resources/assets/optionsprofiles/lang/en_us.json index 972d17b..cfc7f86 100644 --- a/common/src/main/resources/assets/optionsprofiles/lang/en_us.json +++ b/common/src/main/resources/assets/optionsprofiles/lang/en_us.json @@ -19,6 +19,7 @@ "gui.optionsprofiles.load-on-startup": "Load on startup", "gui.optionsprofiles.options-toggle": "Select options to toggle", + "gui.optionsprofiles.options-search-hint": "Search options...", "gui.optionsprofiles.options-toggle.tooltip": "Select the options you want to load in this profile", "gui.optionsprofiles.all-on": "All ON", "gui.optionsprofiles.all-off": "All OFF", diff --git a/settings.gradle b/settings.gradle index c2b5263..5fb6faf 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,4 +11,4 @@ include("common") include("fabric") include("neoforge") -rootProject.name = "optionsprofiles-v1.4.3-1.21.9" +rootProject.name = "optionsprofiles-v1.4.3-1.21.6"