aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2022-11-12 13:26:56 +0800
committershedaniel <daniel@shedaniel.me>2022-11-27 17:55:48 +0800
commit9c865aff50b8c49e89ee1a7d6319d52cdcdd229a (patch)
tree02414a4aecf3b2f5b1ec033544ae72cd89ae4f02
parente24dc179b48ae842a26170dd775201bb80ce4f1d (diff)
downloadRoughlyEnoughItems-9c865aff50b8c49e89ee1a7d6319d52cdcdd229a.tar.gz
RoughlyEnoughItems-9c865aff50b8c49e89ee1a7d6319d52cdcdd229a.tar.bz2
RoughlyEnoughItems-9c865aff50b8c49e89ee1a7d6319d52cdcdd229a.zip
Add filtering rule screen if there isn't one
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java50
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java7
2 files changed, 50 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 a0d53ccd5..624ba0315 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,13 +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 +51,8 @@ import net.minecraft.network.chat.FormattedText;
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 +191,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));
@@ -249,4 +257,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 ebea083b7..65cdf4508 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;
@@ -118,7 +119,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
@@ -135,10 +136,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;
}