aboutsummaryrefslogtreecommitdiff
path: root/runtime
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2022-10-28 20:03:11 +0800
committerGitHub <noreply@github.com>2022-10-28 20:03:11 +0800
commit651e6f10ced5fc042f72fdbb1750b573c6e0a3f8 (patch)
tree41f92b4013ac0638fc4fb421b30a6ff9452f7e29 /runtime
parentd2b4ef837faec468cd5d08f8a8df0ab5adc2b73f (diff)
downloadRoughlyEnoughItems-651e6f10ced5fc042f72fdbb1750b573c6e0a3f8.tar.gz
RoughlyEnoughItems-651e6f10ced5fc042f72fdbb1750b573c6e0a3f8.tar.bz2
RoughlyEnoughItems-651e6f10ced5fc042f72fdbb1750b573c6e0a3f8.zip
Add filtering rules to the API (#1169)
Diffstat (limited to 'runtime')
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java4
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java18
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringAddRuleScreen.java23
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringEntry.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRuleOptionsScreen.java6
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java21
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCache.java31
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContext.java47
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextImpl.java53
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringResult.java93
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringResultImpl.java27
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRule.java86
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/BasicFilteringRuleImpl.java156
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/BasicFilteringRuleType.java (renamed from runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCacheImpl.java)45
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/FilteringRuleTypeRegistryImpl.java87
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java45
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRuleType.java (renamed from runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/AbstractFilteringRule.java)41
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java153
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java179
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java6
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/PreFilteredEntryList.java22
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java20
-rwxr-xr-xruntime/src/main/resources/assets/roughlyenoughitems/lang/en_us.json2
24 files changed, 635 insertions, 534 deletions
diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java
index 0181a0267..ac3753e90 100644
--- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java
+++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java
@@ -35,6 +35,7 @@ import dev.architectury.networking.NetworkManager;
import me.shedaniel.math.Point;
import me.shedaniel.rei.api.client.REIRuntime;
import me.shedaniel.rei.api.client.config.ConfigObject;
+import me.shedaniel.rei.api.client.entry.filtering.FilteringRuleTypeRegistry;
import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer;
import me.shedaniel.rei.api.client.favorites.FavoriteEntry;
import me.shedaniel.rei.api.client.favorites.FavoriteEntryType;
@@ -59,6 +60,7 @@ import me.shedaniel.rei.impl.ClientInternals;
import me.shedaniel.rei.impl.client.REIRuntimeImpl;
import me.shedaniel.rei.impl.client.config.ConfigManagerImpl;
import me.shedaniel.rei.impl.client.config.addon.ConfigAddonRegistryImpl;
+import me.shedaniel.rei.impl.client.entry.filtering.rules.FilteringRuleTypeRegistryImpl;
import me.shedaniel.rei.impl.client.entry.renderer.EntryRendererRegistryImpl;
import me.shedaniel.rei.impl.client.favorites.DelegatingFavoriteEntryProviderImpl;
import me.shedaniel.rei.impl.client.favorites.FavoriteEntryTypeRegistryImpl;
@@ -204,6 +206,7 @@ public class RoughlyEnoughItemsCoreClient {
return categories.stream();
}
}, "clickAreaHandlerResult");
+ ClientInternals.attachInstanceSupplier(new FilteringRuleTypeRegistryImpl(), "filteringRuleTypeRegistry");
ClientInternals.attachInstanceSupplier(new PluginManagerImpl<>(
REIClientPlugin.class,
view -> view.then(PluginView.getInstance()),
@@ -214,6 +217,7 @@ public class RoughlyEnoughItemsCoreClient {
new ConfigManagerImpl(),
new EntryRegistryImpl(),
new CollapsibleEntryRegistryImpl(),
+ FilteringRuleTypeRegistry.getInstance().basic(),
new CategoryRegistryImpl(),
new DisplayRegistryImpl(),
new ScreenRegistryImpl(),
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java
index 2a1e99012..7ca73d683 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java
@@ -46,11 +46,13 @@ import me.shedaniel.clothconfig2.gui.AbstractConfigScreen;
import me.shedaniel.clothconfig2.gui.GlobalizedClothConfigScreen;
import me.shedaniel.clothconfig2.gui.entries.KeyCodeEntry;
import me.shedaniel.clothconfig2.gui.entries.TextListEntry;
-import me.shedaniel.rei.RoughlyEnoughItemsCore;
import me.shedaniel.rei.api.client.REIRuntime;
import me.shedaniel.rei.api.client.config.ConfigManager;
import me.shedaniel.rei.api.client.config.addon.ConfigAddonRegistry;
import me.shedaniel.rei.api.client.config.entry.EntryStackProvider;
+import me.shedaniel.rei.api.client.entry.filtering.FilteringRule;
+import me.shedaniel.rei.api.client.entry.filtering.FilteringRuleType;
+import me.shedaniel.rei.api.client.entry.filtering.FilteringRuleTypeRegistry;
import me.shedaniel.rei.api.client.favorites.FavoriteEntry;
import me.shedaniel.rei.api.client.gui.config.CheatingMode;
import me.shedaniel.rei.api.client.gui.config.DisplayScreenType;
@@ -63,8 +65,6 @@ import me.shedaniel.rei.api.common.util.ImmutableTextComponent;
import me.shedaniel.rei.impl.client.REIRuntimeImpl;
import me.shedaniel.rei.impl.client.config.addon.ConfigAddonRegistryImpl;
import me.shedaniel.rei.impl.client.config.entries.*;
-import me.shedaniel.rei.impl.client.entry.filtering.FilteringRule;
-import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule;
import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl;
import me.shedaniel.rei.impl.client.gui.credits.CreditsScreen;
import me.shedaniel.rei.impl.client.gui.performance.entry.PerformanceEntry;
@@ -235,7 +235,7 @@ public class ConfigManagerImpl implements ConfigManager {
// FilteringRule
builder.registerSerializer(FilteringRule.class, (value, marshaller) -> {
try {
- return marshaller.serialize(FilteringRule.save(value, new CompoundTag()));
+ return marshaller.serialize(FilteringRuleType.save(value, new CompoundTag()));
} catch (Exception e) {
e.printStackTrace();
return JsonNull.INSTANCE;
@@ -243,7 +243,7 @@ public class ConfigManagerImpl implements ConfigManager {
});
builder.registerDeserializer(Tag.class, FilteringRule.class, (value, marshaller) -> {
try {
- return FilteringRule.read((CompoundTag) value);
+ return FilteringRuleType.read((CompoundTag) value);
} catch (Exception e) {
e.printStackTrace();
return null;
@@ -251,7 +251,7 @@ public class ConfigManagerImpl implements ConfigManager {
});
builder.registerDeserializer(String.class, FilteringRule.class, (value, marshaller) -> {
try {
- return FilteringRule.read(TagParser.parseTag(value));
+ return FilteringRuleType.read(TagParser.parseTag(value));
} catch (Exception e) {
e.printStackTrace();
return null;
@@ -293,8 +293,10 @@ public class ConfigManagerImpl implements ConfigManager {
@Override
public void saveConfig() {
- if (getConfig().getFilteringRules().stream().noneMatch(filteringRule -> filteringRule instanceof ManualFilteringRule)) {
- getConfig().getFilteringRules().add(new ManualFilteringRule());
+ for (FilteringRuleType<?> type : FilteringRuleTypeRegistry.getInstance()) {
+ if (type.isSingular() && getConfig().getFilteringRules().stream().noneMatch(filteringRule -> filteringRule.getType().equals(type))) {
+ getConfig().getFilteringRules().add(type.createNew());
+ }
}
AutoConfig.getConfigHolder(ConfigObjectImpl.class).registerLoadListener((configHolder, configObject) -> {
object = configObject;
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 33c6e0490..7fc03b5a5 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
@@ -33,9 +33,9 @@ import me.shedaniel.clothconfig2.api.Modifier;
import me.shedaniel.clothconfig2.api.ModifierKeyCode;
import me.shedaniel.rei.api.client.config.ConfigObject;
import me.shedaniel.rei.api.client.config.entry.EntryStackProvider;
+import me.shedaniel.rei.api.client.entry.filtering.FilteringRule;
import me.shedaniel.rei.api.client.favorites.FavoriteEntry;
import me.shedaniel.rei.api.client.gui.config.*;
-import me.shedaniel.rei.impl.client.entry.filtering.FilteringRule;
import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesEntriesManager;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringAddRuleScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringAddRuleScreen.java
index 61f16508f..e1cbe7da6 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringAddRuleScreen.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringAddRuleScreen.java
@@ -25,8 +25,9 @@ package me.shedaniel.rei.impl.client.config.entries;
import com.mojang.blaze3d.vertex.PoseStack;
import me.shedaniel.clothconfig2.gui.widget.DynamicElementListWidget;
-import me.shedaniel.rei.impl.client.entry.filtering.FilteringRule;
-import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule;
+import me.shedaniel.rei.api.client.entry.filtering.FilteringRule;
+import me.shedaniel.rei.api.client.entry.filtering.FilteringRuleType;
+import me.shedaniel.rei.api.client.entry.filtering.FilteringRuleTypeRegistry;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.events.GuiEventListener;
@@ -42,7 +43,7 @@ import net.minecraft.resources.ResourceLocation;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
-import java.util.function.BiFunction;
+import java.util.function.Function;
public class FilteringAddRuleScreen extends Screen {
private final FilteringEntry entry;
@@ -65,8 +66,8 @@ public class FilteringAddRuleScreen extends Screen {
}));
}
rulesList = addWidget(new RulesList(minecraft, width, height, 30, height, BACKGROUND_LOCATION));
- for (FilteringRule<?> rule : FilteringRule.REGISTRY.values()) {
- if (!(rule instanceof ManualFilteringRule))
+ for (FilteringRuleType<?> rule : FilteringRuleTypeRegistry.getInstance()) {
+ if (!rule.isSingular())
rulesList.addItem(new DefaultRuleEntry(parent, entry, rule.createNew(), null));
}
rulesList.selectItem(rulesList.children().get(0));
@@ -147,14 +148,14 @@ public class FilteringAddRuleScreen extends Screen {
public static class DefaultRuleEntry extends RuleEntry {
private final Button addButton;
- private final BiFunction<FilteringEntry, Screen, Screen> screenFunction;
+ private final Function<Screen, Screen> screenFunction;
- public DefaultRuleEntry(Screen parent, FilteringEntry entry, FilteringRule<?> rule, BiFunction<FilteringEntry, Screen, Screen> screenFunction) {
+ public DefaultRuleEntry(Screen parent, FilteringEntry entry, FilteringRule<?> rule, Function<Screen, Screen> screenFunction) {
super(rule);
- this.screenFunction = (screenFunction == null ? rule.createEntryScreen().orElse(null) : screenFunction);
+ this.screenFunction = (screenFunction == null ? ((FilteringRuleType<FilteringRule<?>>) rule.getType()).createEntryScreen(rule) : screenFunction);
addButton = new Button(0, 0, 20, 20, Component.nullToEmpty(" + "), button -> {
entry.edited = true;
- Minecraft.getInstance().setScreen(this.screenFunction.apply(entry, parent));
+ Minecraft.getInstance().setScreen(this.screenFunction.apply(parent));
entry.rules.add(0, rule);
});
addButton.active = this.screenFunction != null;
@@ -164,7 +165,7 @@ public class FilteringAddRuleScreen extends Screen {
public void render(PoseStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isHovered, float delta) {
Minecraft client = Minecraft.getInstance();
{
- Component title = getRule().getTitle();
+ Component title = ((FilteringRuleType<FilteringRule<?>>) getRule().getType()).getTitle(getRule());
int i = client.font.width(title);
if (i > entryWidth - 28) {
FormattedText titleTrimmed = FormattedText.composite(client.font.substrByWidth(title, entryWidth - 28 - client.font.width("...")), FormattedText.of("..."));
@@ -174,7 +175,7 @@ public class FilteringAddRuleScreen extends Screen {
}
}
{
- Component subtitle = getRule().getSubtitle();
+ Component subtitle = ((FilteringRuleType<FilteringRule<?>>) getRule().getType()).getSubtitle(getRule());
int i = client.font.width(subtitle);
if (i > entryWidth - 28) {
FormattedText subtitleTrimmed = FormattedText.composite(client.font.substrByWidth(subtitle, entryWidth - 28 - client.font.width("...")), FormattedText.of("..."));
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringEntry.java
index 403f1e94d..c8d75ed77 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringEntry.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringEntry.java
@@ -28,9 +28,9 @@ import com.google.common.collect.Lists;
import com.mojang.blaze3d.platform.Window;
import com.mojang.blaze3d.vertex.PoseStack;
import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
+import me.shedaniel.rei.api.client.entry.filtering.FilteringRule;
import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.api.common.util.EntryStacks;
-import me.shedaniel.rei.impl.client.entry.filtering.FilteringRule;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.chat.NarratorChatListener;
import net.minecraft.client.gui.components.AbstractWidget;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRuleOptionsScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRuleOptionsScreen.java
index fac731ecf..0f69cdaa3 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRuleOptionsScreen.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRuleOptionsScreen.java
@@ -29,7 +29,7 @@ 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.impl.client.entry.filtering.FilteringRule;
+import me.shedaniel.rei.api.client.entry.filtering.FilteringRule;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.EditBox;
@@ -53,14 +53,12 @@ import java.util.function.Function;
import java.util.function.Supplier;
public abstract class FilteringRuleOptionsScreen<T extends FilteringRule<?>> extends Screen {
- private final FilteringEntry entry;
private RulesList rulesList;
Screen parent;
public T rule;
- public FilteringRuleOptionsScreen(FilteringEntry entry, T rule, Screen screen) {
+ public FilteringRuleOptionsScreen(T rule, Screen screen) {
super(new TranslatableComponent("config.roughlyenoughitems.filteringRulesScreen"));
- this.entry = entry;
this.rule = rule;
this.parent = screen;
}
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 0ed9f7129..2c60930bf 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
@@ -26,7 +26,8 @@ package me.shedaniel.rei.impl.client.config.entries;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import me.shedaniel.clothconfig2.gui.widget.DynamicElementListWidget;
-import me.shedaniel.rei.impl.client.entry.filtering.FilteringRule;
+import me.shedaniel.rei.api.client.entry.filtering.FilteringRule;
+import me.shedaniel.rei.api.client.entry.filtering.FilteringRuleType;
import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule;
import me.shedaniel.rei.impl.client.gui.InternalTextures;
import net.minecraft.client.Minecraft;
@@ -46,7 +47,7 @@ import net.minecraft.sounds.SoundEvents;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
-import java.util.function.BiFunction;
+import java.util.function.Function;
public class FilteringRulesScreen extends Screen {
private final FilteringEntry entry;
@@ -80,7 +81,7 @@ public class FilteringRulesScreen extends Screen {
for (int i = entry.rules.size() - 1; i >= 0; i--) {
FilteringRule<?> rule = entry.rules.get(i);
if (rule instanceof ManualFilteringRule)
- rulesList.addItem(new DefaultRuleEntry(rule, entry, (entry, screen) -> {
+ rulesList.addItem(new DefaultRuleEntry(rule, entry, (screen) -> {
entry.filteringScreen.parent = screen;
return entry.filteringScreen;
}));
@@ -180,14 +181,14 @@ public class FilteringRulesScreen extends Screen {
public static class DefaultRuleEntry extends RuleEntry {
private final Button configureButton;
private final Button deleteButton;
- private final BiFunction<FilteringEntry, Screen, Screen> screenFunction;
+ private final Function<Screen, Screen> screenFunction;
- public DefaultRuleEntry(FilteringRule<?> rule, FilteringEntry entry, BiFunction<FilteringEntry, Screen, Screen> screenFunction) {
+ public DefaultRuleEntry(FilteringRule<?> rule, FilteringEntry entry, Function<Screen, Screen> screenFunction) {
super(rule);
- this.screenFunction = (screenFunction == null ? rule.createEntryScreen().orElse(null) : screenFunction);
+ this.screenFunction = (screenFunction == null ? ((FilteringRuleType<FilteringRule<?>>) rule.getType()).createEntryScreen(rule) : screenFunction);
configureButton = new Button(0, 0, 20, 20, Component.nullToEmpty(null), button -> {
entry.edited = true;
- Minecraft.getInstance().setScreen(this.screenFunction.apply(entry, Minecraft.getInstance().screen));
+ Minecraft.getInstance().setScreen(this.screenFunction.apply(Minecraft.getInstance().screen));
}) {
@Override
protected void renderBg(PoseStack matrices, Minecraft client, int mouseX, int mouseY) {
@@ -206,14 +207,14 @@ public class FilteringRulesScreen extends Screen {
});
}
configureButton.active = this.screenFunction != null;
- deleteButton.active = !(rule instanceof ManualFilteringRule);
+ deleteButton.active = !rule.getType().isSingular();
}
@Override
public void render(PoseStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isHovered, float delta) {
Minecraft client = Minecraft.getInstance();
{
- Component title = getRule().getTitle();
+ Component title = ((FilteringRuleType<FilteringRule<?>>) getRule().getType()).getTitle(getRule());
int i = client.font.width(title);
if (i > entryWidth - 28) {
FormattedText titleTrimmed = FormattedText.composite(client.font.substrByWidth(title, entryWidth - 28 - client.font.width("...")), FormattedText.of("..."));
@@ -223,7 +224,7 @@ public class FilteringRulesScreen extends Screen {
}
}
{
- Component subtitle = getRule().getSubtitle();
+ Component subtitle = ((FilteringRuleType<FilteringRule<?>>) getRule().getType()).getSubtitle(getRule());
int i = client.font.width(subtitle);
if (i > entryWidth - 28) {
FormattedText subtitleTrimmed = FormattedText.composite(client.font.substrByWidth(subtitle, entryWidth - 28 - client.font.width("...")), FormattedText.of("..."));
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCache.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCache.java
deleted file mode 100644
index 388652210..000000000
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCache.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * This file is licensed under the MIT License, part of Roughly Enough Items.
- * Copyright (c) 2018, 2019, 2020, 2021, 2022 shedaniel
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package me.shedaniel.rei.impl.client.entry.filtering;
-
-import org.jetbrains.annotations.Nullable;
-
-public interface FilteringCache {
- @Nullable
- Object getCache(FilteringRule<?> rule);
-}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContext.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContext.java
deleted file mode 100644
index 59b2ce647..000000000
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContext.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * This file is licensed under the MIT License, part of Roughly Enough Items.
- * Copyright (c) 2018, 2019, 2020, 2021, 2022 shedaniel
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package me.shedaniel.rei.impl.client.entry.filtering;
-
-import me.shedaniel.rei.api.common.entry.EntryStack;
-import org.jetbrains.annotations.ApiStatus;
-
-import java.util.Collection;
-
-@ApiStatus.Internal
-@ApiStatus.Experimental
-public interface FilteringContext {
- Collection<EntryStack<?>> getStacks(FilteringContextType type);
-
- default Collection<EntryStack<?>> getShownStacks() {
- return getStacks(FilteringContextType.SHOWN);
- }
-
- default Collection<EntryStack<?>> getUnsetStacks() {
- return getStacks(FilteringContextType.DEFAULT);
- }
-
- default Collection<EntryStack<?>> getHiddenStacks() {
- return getStacks(FilteringContextType.HIDDEN);
- }
-}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextImpl.java
index e46f8660b..d0e26a9fc 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextImpl.java
@@ -23,19 +23,18 @@
package me.shedaniel.rei.impl.client.entry.filtering;
+import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
+import me.shedaniel.rei.api.client.entry.filtering.FilteringContext;
import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.api.common.util.CollectionUtils;
import me.shedaniel.rei.impl.common.util.HashedEntryStackWrapper;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
@@ -45,7 +44,6 @@ import java.util.concurrent.TimeoutException;
public class FilteringContextImpl implements FilteringContext {
private final boolean async;
public final Map<FilteringContextType, Set<HashedEntryStackWrapper>> stacks;
- private final Map<FilteringContextType, Collection<EntryStack<?>>> cachedStacks;
public FilteringContextImpl(Collection<EntryStack<?>> allStacks) {
this(true, allStacks);
@@ -54,40 +52,55 @@ public class FilteringContextImpl implements FilteringContext {
public FilteringContextImpl(boolean async, Collection<EntryStack<?>> allStacks) {
this.async = async;
this.stacks = Maps.newHashMap();
- this.cachedStacks = Maps.newHashMap();
for (FilteringContextType type : FilteringContextType.values()) {
this.stacks.computeIfAbsent(type, t -> Sets.newHashSet());
}
this.stacks.get(FilteringContextType.DEFAULT).addAll(async ? CollectionUtils.mapParallel(allStacks, HashedEntryStackWrapper::new)
: CollectionUtils.map(allStacks, HashedEntryStackWrapper::new));
- fillCache();
}
public FilteringContextImpl(Map<FilteringContextType, Set<HashedEntryStackWrapper>> stacks) {
this.async = false;
this.stacks = stacks;
- this.cachedStacks = Maps.newHashMap();
for (FilteringContextType type : FilteringContextType.values()) {
this.stacks.computeIfAbsent(type, t -> Sets.newHashSet());
}
- fillCache();
}
- private void fillCache() {
- this.cachedStacks.clear();
- for (FilteringContextType type : FilteringContextType.values()) {
- this.cachedStacks.put(type, CollectionUtils.map(stacks.get(type), HashedEntryStackWrapper::unwrap));
- }
+ @Override
+ public Collection<EntryStack<?>> getHiddenStacks() {
+ return getPublicFacing(FilteringContextType.HIDDEN);
+ }
+
+ @Override
+ public Collection<EntryStack<?>> getShownStacks() {
+ return getPublicFacing(FilteringContextType.SHOWN);
}
@Override
- public Collection<EntryStack<?>> getStacks(FilteringContextType type) {
- return cachedStacks.get(type);
+ public Collection<EntryStack<?>> getUnsetStacks() {
+ return getPublicFacing(FilteringContextType.DEFAULT);
}
- public void handleResult(FilteringResult result) {
- Collection<HashedEntryStackWrapper> hiddenStacks = result.getHiddenStacks();
- Collection<HashedEntryStackWrapper> shownStacks = result.getShownStacks();
+ private Collection<EntryStack<?>> getPublicFacing(FilteringContextType type) {
+ Set<HashedEntryStackWrapper> wrappers = this.stacks.get(type);
+ if (wrappers == null || wrappers.isEmpty()) return List.of();
+ return new AbstractSet<>() {
+ @Override
+ public Iterator<EntryStack<?>> iterator() {
+ return Iterators.transform(wrappers.iterator(), HashedEntryStackWrapper::unwrap);