aboutsummaryrefslogtreecommitdiff
path: root/runtime/src/main/java
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2022-11-12 13:26:56 +0800
committershedaniel <daniel@shedaniel.me>2023-05-29 21:20:18 +0800
commitd4550d29af7c3bbe0423cdefc8b8b1fe1a554e91 (patch)
treeb55b13465619af06890cdae5d8246e4c5ec3d162 /runtime/src/main/java
parentd094ed33138ca316927d677305073b3d7405bd29 (diff)
downloadRoughlyEnoughItems-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')
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java51
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java7
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;
}