diff options
| author | shedaniel <daniel@shedaniel.me> | 2022-11-12 13:26:56 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2023-05-29 21:20:18 +0800 |
| commit | d4550d29af7c3bbe0423cdefc8b8b1fe1a554e91 (patch) | |
| tree | b55b13465619af06890cdae5d8246e4c5ec3d162 /runtime/src/main/java | |
| parent | d094ed33138ca316927d677305073b3d7405bd29 (diff) | |
| download | RoughlyEnoughItems-d4550d29af7c3bbe0423cdefc8b8b1fe1a554e91.tar.gz RoughlyEnoughItems-d4550d29af7c3bbe0423cdefc8b8b1fe1a554e91.tar.bz2 RoughlyEnoughItems-d4550d29af7c3bbe0423cdefc8b8b1fe1a554e91.zip | |
Add filtering rule screen if there isn't one
Diffstat (limited to 'runtime/src/main/java')
2 files changed, 51 insertions, 7 deletions
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java index 300ba851a..9a7eeaedb 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java @@ -23,12 +23,22 @@ package me.shedaniel.rei.impl.client.config.entries; +import com.google.common.base.Suppliers; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.gui.widget.DynamicElementListWidget; +import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; import me.shedaniel.rei.api.client.entry.filtering.FilteringRuleType; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; +import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringContextImpl; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringResultImpl; import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule; +import me.shedaniel.rei.impl.client.entry.filtering.rules.SearchFilteringRuleType; import me.shedaniel.rei.impl.client.gui.InternalTextures; +import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.events.GuiEventListener; @@ -42,9 +52,8 @@ import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvents; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.util.*; +import java.util.function.Consumer; import java.util.function.Function; public class FilteringRulesScreen extends Screen { @@ -183,7 +192,7 @@ public class FilteringRulesScreen extends Screen { public DefaultRuleEntry(FilteringRule<?> rule, FilteringEntry entry, Function<Screen, Screen> screenFunction) { super(rule); - this.screenFunction = (screenFunction == null ? ((FilteringRuleType<FilteringRule<?>>) rule.getType()).createEntryScreen(rule) : screenFunction); + this.screenFunction = Objects.requireNonNullElseGet(screenFunction == null ? ((FilteringRuleType<FilteringRule<?>>) rule.getType()).createEntryScreen(rule) : screenFunction, () -> placeholderScreen(rule)); configureButton = new Button(0, 0, 20, 20, Component.nullToEmpty(null), button -> { entry.edited = true; Minecraft.getInstance().setScreen(this.screenFunction.apply(Minecraft.getInstance().screen)); @@ -244,4 +253,38 @@ public class FilteringRulesScreen extends Screen { return Arrays.asList(configureButton, deleteButton); } } + + private static <Cache> Function<Screen, Screen> placeholderScreen(FilteringRule<Cache> r) { + class PlaceholderScreen extends FilteringRuleOptionsScreen<FilteringRule<Cache>> { + public PlaceholderScreen(Screen parent) { + super(r, parent); + } + + @Override + public void addEntries(Consumer<RuleEntry> entryConsumer) { + addEmpty(entryConsumer, 10); + Function<Boolean, Component> function = bool -> { + return new TranslatableComponent("rule.roughlyenoughitems.filtering.search.show." + bool); + }; + FilteringContextImpl context = new FilteringContextImpl(EntryRegistry.getInstance().getEntryStacks().toList()); + rule.processFilteredStacks(context, () -> new FilteringResultImpl(new ArrayList<>(), new ArrayList<>()), + rule.prepareCache(false), false); + + entryConsumer.accept(new SubRulesEntry(rule, () -> function.apply(true), + Collections.singletonList(new SearchFilteringRuleType.EntryStacksRuleEntry(rule, + Suppliers.ofInstance(CollectionUtils.map(context.getShownStacks(), + stack -> (EntryWidget) Widgets.createSlot(new Rectangle(0, 0, 18, 18)).disableBackground().entry(stack.normalize()))))))); + addEmpty(entryConsumer, 10); + entryConsumer.accept(new SubRulesEntry(rule, () -> function.apply(false), + Collections.singletonList(new SearchFilteringRuleType.EntryStacksRuleEntry(rule, + Suppliers.ofInstance(CollectionUtils.map(context.getHiddenStacks(), + stack -> (EntryWidget) Widgets.createSlot(new Rectangle(0, 0, 18, 18)).disableBackground().entry(stack.normalize()))))))); + } + + @Override + public void save() { + } + } + return PlaceholderScreen::new; + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java index a230ac4b7..8982627f8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java @@ -26,6 +26,7 @@ package me.shedaniel.rei.impl.client.entry.filtering.rules; import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; import me.shedaniel.rei.api.client.entry.filtering.FilteringRuleType; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.client.search.SearchFilter; @@ -119,7 +120,7 @@ public enum SearchFilteringRuleType implements FilteringRuleType<SearchFiltering entryConsumer.accept(show = new BooleanRuleEntry(width - 36, show == null ? rule.show : show.getBoolean(), rule, function)); addEmpty(entryConsumer, 10); entryConsumer.accept(new SubRulesEntry(rule, () -> function.apply(show == null ? rule.show : show.getBoolean()), - Collections.singletonList(new EntryStacksRuleEntry(rule, () -> entryStacks, entry, show)))); + Collections.singletonList(new EntryStacksRuleEntry(rule, () -> entryStacks)))); } @Override @@ -136,10 +137,10 @@ public enum SearchFilteringRuleType implements FilteringRuleType<SearchFiltering } public static class EntryStacksRuleEntry extends FilteringRuleOptionsScreen.RuleEntry { - private final Supplier<List<EntryWidget>> entryStacks; + private final Supplier<Iterable<EntryWidget>> entryStacks; private int totalHeight; - public EntryStacksRuleEntry(SearchFilteringRule rule, Supplier<List<EntryWidget>> entryStacks, FilteringRuleOptionsScreen.TextFieldRuleEntry entry, FilteringRuleOptionsScreen.BooleanRuleEntry show) { + public EntryStacksRuleEntry(FilteringRule<?> rule, Supplier<Iterable<EntryWidget>> entryStacks) { super(rule); this.entryStacks = entryStacks; } |
