diff options
| author | shedaniel <daniel@shedaniel.me> | 2022-12-18 20:24:23 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2024-04-16 00:38:17 +0900 |
| commit | e6687c01b254bf903d4895aa0bb631b1679d465c (patch) | |
| tree | bc94913c98326dfcf4e8ef0e474419bb81698596 | |
| parent | 8f8db7a604a86d17b88a621a18656e0791d87aeb (diff) | |
| download | RoughlyEnoughItems-e6687c01b254bf903d4895aa0bb631b1679d465c.tar.gz RoughlyEnoughItems-e6687c01b254bf903d4895aa0bb631b1679d465c.tar.bz2 RoughlyEnoughItems-e6687c01b254bf903d4895aa0bb631b1679d465c.zip | |
Close #913
6 files changed, 40 insertions, 8 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/config/ConfigObject.java b/api/src/main/java/me/shedaniel/rei/api/client/config/ConfigObject.java index 02afcd7f4..94e119eae 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/config/ConfigObject.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/config/ConfigObject.java @@ -135,6 +135,9 @@ public interface ConfigObject { */ boolean isEntryListWidgetScrolled(); + @ApiStatus.Experimental + boolean isHidingEntryPanelIfIdle(); + /** * Returns whether REI should append mod names to tooltips. * diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java index 47f84a7c4..2ef46744b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java @@ -60,6 +60,7 @@ import java.util.Map; @ApiStatus.Internal @Config(name = "roughlyenoughitems/config") @Environment(EnvType.CLIENT) +@SuppressWarnings("FieldMayBeFinal") public class ConfigObjectImpl implements ConfigObject, ConfigData { @ConfigEntry.Category("basics") @ConfigEntry.Gui.TransitiveObject @DontApplyFieldName public Basics basics = new Basics(); @@ -140,6 +141,15 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { } @Override + public boolean isHidingEntryPanelIfIdle() { + return appearance.hideEntryPanelIfIdle; + } + + public void setHidingEntryPanelIfIdle(boolean hideEntryPanelIfIdle) { + appearance.hideEntryPanelIfIdle = hideEntryPanelIfIdle; + } + + @Override public boolean shouldAppendModNames() { return advanced.tooltips.appendModNames; } @@ -625,6 +635,7 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { @Comment("Declares the appearance of recipe's border.") @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) private RecipeBorderType recipeBorder = RecipeBorderType.DEFAULT; @Comment("Declares whether entry panel is scrolled.") private boolean scrollingEntryListWidget = false; + @Comment("Declares whether entry panel should be invisible when not searching") private boolean hideEntryPanelIfIdle = false; public static class Layout { @Comment("Declares the position of the search field.") @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java index a4926f524..d9e3f2531 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java @@ -28,6 +28,7 @@ import dev.architectury.platform.Platform; import dev.architectury.utils.value.BooleanValue; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; @@ -113,6 +114,13 @@ public class CraftableFilterButtonWidget { entries.add(new SubMenuEntry(Component.translatable("text.rei.config.menu.search_field.input_method"), createInputMethodEntries(access, applicableInputMethods))); } + entries.add(ToggleMenuEntry.of(new TranslatableComponent("text.rei.config.menu.search_field.hide_entry_panel_idle"), + config::isHidingEntryPanelIfIdle, + hideEntryPanelIfIdle -> { + config.setHidingEntryPanelIfIdle(hideEntryPanelIfIdle); + REIRuntime.getInstance().getOverlay().orElseThrow().queueReloadSearch(); + })); + return entries; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListSearchManager.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListSearchManager.java index 0b1bf2662..50fd71d78 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListSearchManager.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListSearchManager.java @@ -32,6 +32,7 @@ import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.EntryPanelOrdering; import me.shedaniel.rei.api.client.registry.entry.CollapsibleEntryRegistry; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; +import me.shedaniel.rei.api.client.search.SearchFilter; import me.shedaniel.rei.api.client.view.Views; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; @@ -67,7 +68,7 @@ public class EntryListSearchManager { public static final EntryListSearchManager INSTANCE = new EntryListSearchManager(); - private final AsyncSearchManager searchManager = new AsyncSearchManager(((EntryRegistryImpl) EntryRegistry.getInstance())::getPreFilteredComplexList, () -> { + private final AsyncSearchManager searchManager = new AsyncSearchManager(EntryListSearchManager::getAllEntriesContextually, () -> { boolean checkCraftable = ConfigManager.getInstance().isCraftableOnlyEnabled(); LongSet workingItems = checkCraftable ? new LongOpenHashSet() : null; if (checkCraftable) { @@ -78,6 +79,14 @@ public class EntryListSearchManager { return checkCraftable ? stack -> workingItems.contains(stack.hashExact()) : stack -> true; }, HashedEntryStackWrapper::normalize); + private static List<EntryStack<?>> getAllEntriesContextually(SearchFilter filter) { + if (ConfigObject.getInstance().isHidingEntryPanelIfIdle() && filter.getFilter().isEmpty()) { + return List.of(); + } + + return EntryRegistry.getInstance().getPreFilteredList(); + } + public void update(String searchTerm, boolean ignoreLastSearch, Consumer<List</*EntryStack<?> | CollapsedStack*/ Object>> update) { Stopwatch stopwatch = Stopwatch.createStarted(); if (ignoreLastSearch) searchManager.markDirty(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java index 8d1f6f056..381831c42 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java @@ -41,21 +41,18 @@ import java.util.List; import java.util.Map; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.BiConsumer; -import java.util.function.Predicate; -import java.util.function.Supplier; -import java.util.function.UnaryOperator; +import java.util.function.*; public class AsyncSearchManager { private static final ExecutorService EXECUTOR_SERVICE = new ThreadCreator("REI-AsyncSearchManager").asService(Math.min(3, Runtime.getRuntime().availableProcessors())); - private final Supplier<List<? extends HashedEntryStackWrapper>> stacksProvider; + private final Function<SearchFilter, List<? extends HashedEntryStackWrapper>> stacksProvider; private final Supplier<Predicate<HashedEntryStackWrapper>> additionalPredicateSupplier; private final UnaryOperator<HashedEntryStackWrapper> transformer; private volatile Map.Entry<List<HashedEntryStackWrapper>, SearchFilter> last; public volatile ExecutorTuple executor; public volatile SearchFilter filter; - public AsyncSearchManager(Supplier<List<? extends HashedEntryStackWrapper>> stacksProvider, Supplier<Predicate<HashedEntryStackWrapper>> additionalPredicateSupplier, UnaryOperator<HashedEntryStackWrapper> transformer) { + public AsyncSearchManager(Function<SearchFilter, List<? extends HashedEntryStackWrapper>> stacksProvider, Supplier<Predicate<HashedEntryStackWrapper>> additionalPredicateSupplier, UnaryOperator<HashedEntryStackWrapper> transformer) { this.stacksProvider = stacksProvider; this.additionalPredicateSupplier = additionalPredicateSupplier; this.transformer = transformer; @@ -123,7 +120,7 @@ public class AsyncSearchManager { Map.Entry<List<HashedEntryStackWrapper>, SearchFilter> last; last = this.last; return get(this.filter, this.additionalPredicateSupplier.get(), this.transformer, - this.stacksProvider.get(), last, this, executor, steps) + this.stacksProvider.apply(filter), last, this, executor, steps) .thenApply(entry -> { this.last = entry; return entry; diff --git a/runtime/src/main/resources/assets/roughlyenoughitems/lang/en_us.json b/runtime/src/main/resources/assets/roughlyenoughitems/lang/en_us.json index 1e3b150fa..54aa533c2 100755 --- a/runtime/src/main/resources/assets/roughlyenoughitems/lang/en_us.json +++ b/runtime/src/main/resources/assets/roughlyenoughitems/lang/en_us.json @@ -34,6 +34,7 @@ "text.rei.config.menu.config": "More Options...", "text.rei.config.menu.search_field.position": "Search Field Position...", "text.rei.config.menu.search_field.input_method": "Input Methods...", + "text.rei.config.menu.search_field.hide_entry_panel_idle": "Hide Entries when not Searching", "category.rei.crafting": "Crafting", "category.rei.smelting": "Smelting", "category.rei.smelting.fuel": "Fuel", @@ -334,6 +335,9 @@ "config.roughlyenoughitems.scrollingEntryListWidget": "Entry List Action:", "config.roughlyenoughitems.scrollingEntryListWidget.boolean.true": "Scrolled", "config.roughlyenoughitems.scrollingEntryListWidget.boolean.false": "Paginated", + "config.roughlyenoughitems.hideEntryPanelIfIdle": "Entry List When Not Searching:", + "config.roughlyenoughitems.hideEntryPanelIfIdle.boolean.true": "Invisible", + "config.roughlyenoughitems.hideEntryPanelIfIdle.boolean.false": "Visible", "config.roughlyenoughitems.horizontalEntriesBoundaries": "Horizontal Entries Boundaries:", "config.roughlyenoughitems.verticalEntriesBoundaries": "Vertical Entries Boundaries:", "config.roughlyenoughitems.horizontalEntriesBoundariesColumns": "Entries Columns Limit:", |
