aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me/shedaniel
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/me/shedaniel')
-rw-r--r--src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java6
-rw-r--r--src/main/java/me/shedaniel/rei/api/ConfigObject.java5
-rw-r--r--src/main/java/me/shedaniel/rei/api/plugins/REIPluginV0.java8
-rw-r--r--src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java100
-rw-r--r--src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java4
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java782
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java2
-rw-r--r--src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java14
-rw-r--r--src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java4
-rw-r--r--src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java3
-rw-r--r--src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java3
-rw-r--r--src/main/java/me/shedaniel/rei/impl/SearchArgument.java86
12 files changed, 501 insertions, 516 deletions
diff --git a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
index c4163e1ae..8866aab36 100644
--- a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
+++ b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
@@ -13,7 +13,6 @@ import me.shedaniel.rei.api.*;
import me.shedaniel.rei.api.annotations.Internal;
import me.shedaniel.rei.api.plugins.REIPluginV0;
import me.shedaniel.rei.gui.ContainerScreenOverlay;
-import me.shedaniel.rei.gui.widget.EntryListWidget;
import me.shedaniel.rei.impl.*;
import me.shedaniel.rei.listeners.RecipeBookButtonWidgetHooks;
import me.shedaniel.rei.listeners.RecipeBookGuiHooks;
@@ -155,7 +154,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
ClientSidePacketRegistry.INSTANCE.register(RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, (packetContext, packetByteBuf) -> {
ItemStack stack = packetByteBuf.readItemStack();
String player = packetByteBuf.readString(32767);
- packetContext.getPlayer().addChatMessage(new LiteralText(I18n.translate("text.rei.cheat_items").replaceAll("\\{item_name}", EntryListWidget.tryGetItemStackName(stack.copy())).replaceAll("\\{item_count}", stack.copy().getCount() + "").replaceAll("\\{player_name}", player)), false);
+ packetContext.getPlayer().addChatMessage(new LiteralText(I18n.translate("text.rei.cheat_items").replaceAll("\\{item_name}", SearchArgument.tryGetItemStackName(stack.copy())).replaceAll("\\{item_count}", stack.copy().getCount() + "").replaceAll("\\{player_name}", player)), false);
});
ClientSidePacketRegistry.INSTANCE.register(RoughlyEnoughItemsNetwork.NOT_ENOUGH_ITEMS_PACKET, (packetContext, packetByteBuf) -> {
Screen currentScreen = MinecraftClient.getInstance().currentScreen;
@@ -195,8 +194,6 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
if (!REIPluginV0.class.isAssignableFrom(reiPlugin.getClass()))
throw new IllegalArgumentException("REI plugin is too old!");
registerPlugin(reiPlugin);
- if (reiPlugin instanceof REIPluginV0)
- ((REIPluginV0) reiPlugin).onFirstLoad();
} catch (Exception e) {
e.printStackTrace();
RoughlyEnoughItemsCore.LOGGER.error("[REI] Can't load REI plugins from %s: %s", reiPlugin.getClass(), e.getLocalizedMessage());
@@ -205,7 +202,6 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
for (REIPluginV0 reiPlugin : FabricLoader.getInstance().getEntrypoints("rei_plugins_v0", REIPluginV0.class)) {
try {
registerPlugin(reiPlugin);
- reiPlugin.onFirstLoad();
} catch (Exception e) {
e.printStackTrace();
RoughlyEnoughItemsCore.LOGGER.error("[REI] Can't load REI plugins from %s: %s", reiPlugin.getClass(), e.getLocalizedMessage());
diff --git a/src/main/java/me/shedaniel/rei/api/ConfigObject.java b/src/main/java/me/shedaniel/rei/api/ConfigObject.java
index a7d42c074..07770f9d1 100644
--- a/src/main/java/me/shedaniel/rei/api/ConfigObject.java
+++ b/src/main/java/me/shedaniel/rei/api/ConfigObject.java
@@ -84,4 +84,9 @@ public interface ConfigObject {
public @interface DontApplyFieldName {
}
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target({ElementType.FIELD})
+ public @interface UseEnumSelectorInstead {
+ }
+
}
diff --git a/src/main/java/me/shedaniel/rei/api/plugins/REIPluginV0.java b/src/main/java/me/shedaniel/rei/api/plugins/REIPluginV0.java
index 2b89abab1..407cce19a 100644
--- a/src/main/java/me/shedaniel/rei/api/plugins/REIPluginV0.java
+++ b/src/main/java/me/shedaniel/rei/api/plugins/REIPluginV0.java
@@ -14,14 +14,6 @@ import me.shedaniel.rei.api.annotations.ToBeRemoved;
public interface REIPluginV0 extends REIPluginEntry {
/**
- * On register of the plugin
- */
- @ToBeRemoved
- @Deprecated
- default void onFirstLoad() {
- }
-
- /**
* Registers entries on the item panel
*
* @param entryRegistry the helper class
diff --git a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
index 3e5cdb04c..764d82d0e 100644
--- a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
+++ b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
@@ -36,20 +36,17 @@ import net.minecraft.item.ItemStack;
import net.minecraft.sound.SoundEvents;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Identifier;
-import net.minecraft.util.math.MathHelper;
import net.minecraft.world.GameMode;
import org.apache.logging.log4j.util.TriConsumer;
import javax.annotation.Nullable;
import java.util.*;
-public class ContainerScreenOverlay extends Widget {
+public class ContainerScreenOverlay extends WidgetWithBounds {
private static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
private static final List<QueuedTooltip> QUEUED_TOOLTIPS = Lists.newArrayList();
- public static String searchTerm = "";
- private static int page = 0;
- private static EntryListWidget entryListWidget;
+ private static final EntryListWidget ENTRY_LIST_WIDGET = new EntryListWidget();
private final List<Widget> widgets = Lists.newLinkedList();
public boolean shouldReInit = false;
private int tooltipWidth;
@@ -88,11 +85,7 @@ public class ContainerScreenOverlay extends Widget {
private ButtonWidget buttonLeft, buttonRight;
public static EntryListWidget getEntryListWidget() {
- return entryListWidget;
- }
-
- public static void setPage(int page) {
- ContainerScreenOverlay.page = page;
+ return ENTRY_LIST_WIDGET;
}
public void init() {
@@ -108,17 +101,23 @@ public class ContainerScreenOverlay extends Widget {
@SuppressWarnings({"RawTypeCanBeGeneric", "rawtypes"})
DisplayHelper.DisplayBoundsHandler boundsHandler = DisplayHelper.getInstance().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
this.rectangle = ConfigManager.getInstance().getConfig().isLeftHandSidePanel() ? boundsHandler.getLeftBounds(MinecraftClient.getInstance().currentScreen) : boundsHandler.getRightBounds(MinecraftClient.getInstance().currentScreen);
- widgets.add(entryListWidget = new EntryListWidget(page));
- entryListWidget.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false);
-
+ widgets.add(ENTRY_LIST_WIDGET);
+ if (ScreenHelper.getSearchField() == null)
+ ScreenHelper.setSearchField(new OverlaySearchField(0, 0, 0, 0));
+ ENTRY_LIST_WIDGET.updateArea(boundsHandler, ScreenHelper.getSearchField().getText());
+ ScreenHelper.getSearchField().getBounds().setBounds(getTextFieldArea());
+ this.widgets.add(ScreenHelper.getSearchField());
+ ScreenHelper.getSearchField().setChangedListener(s -> {
+ ENTRY_LIST_WIDGET.updateSearch(s);
+ });
if (!ConfigManager.getInstance().getConfig().isEntryListWidgetScrolled()) {
widgets.add(buttonLeft = new ButtonWidget(new Rectangle(rectangle.x, rectangle.y + (ConfigManager.getInstance().getConfig().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + 5, 16, 16), I18n.translate("text.rei.left_arrow")) {
@Override
public void onPressed() {
- page--;
- if (page < 0)
- page = getTotalPage();
- entryListWidget.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false);
+ ENTRY_LIST_WIDGET.previousPage();
+ if (ENTRY_LIST_WIDGET.getPage() < 0)
+ ENTRY_LIST_WIDGET.setPage(ENTRY_LIST_WIDGET.getTotalPages() - 1);
+ ENTRY_LIST_WIDGET.updateSearch(ScreenHelper.getSearchField().getText());
}
@Override
@@ -139,10 +138,10 @@ public class ContainerScreenOverlay extends Widget {
widgets.add(buttonRight = new ButtonWidget(new Rectangle(rectangle.x + rectangle.width - 18, rectangle.y + (ConfigManager.getInstance().getConfig().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + 5, 16, 16), I18n.translate("text.rei.right_arrow")) {
@Override
public void onPressed() {
- page++;
- if (page > getTotalPage())
- page = 0;
- entryListWidget.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false);
+ ENTRY_LIST_WIDGET.nextPage();
+ if (ENTRY_LIST_WIDGET.getPage() >= ENTRY_LIST_WIDGET.getTotalPages())
+ ENTRY_LIST_WIDGET.setPage(0);
+ ENTRY_LIST_WIDGET.updateSearch(ScreenHelper.getSearchField().getText());
}
@Override
@@ -162,9 +161,6 @@ public class ContainerScreenOverlay extends Widget {
});
}
- if (setPage)
- page = MathHelper.clamp(page, 0, getTotalPage());
-
widgets.add(new ButtonWidget(new Rectangle(ConfigManager.getInstance().getConfig().isLeftHandSidePanel() ? window.getScaledWidth() - 30 : 10, 10, 20, 20), "") {
@Override
public void onPressed() {
@@ -283,8 +279,7 @@ public class ContainerScreenOverlay extends Widget {
widgets.add(new ClickableLabelWidget(new Point(rectangle.x + (rectangle.width / 2), rectangle.y + (ConfigManager.getInstance().getConfig().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + 10), "") {
@Override
public void render(int mouseX, int mouseY, float delta) {
- page = MathHelper.clamp(page, 0, getTotalPage());
- setText(String.format("%s/%s", page + 1, getTotalPage() + 1));
+ setText(String.format("%s/%s", ENTRY_LIST_WIDGET.getPage() + 1, ENTRY_LIST_WIDGET.getTotalPages()));
super.render(mouseX, mouseY, delta);
}
@@ -296,39 +291,30 @@ public class ContainerScreenOverlay extends Widget {
@Override
public void onLabelClicked() {
MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F));
- page = 0;
- entryListWidget.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false);
+ ENTRY_LIST_WIDGET.setPage(0);
+ ENTRY_LIST_WIDGET.updateSearch(ScreenHelper.getSearchField().getText());
}
@Override
public boolean changeFocus(boolean boolean_1) {
return false;
}
- }.clickable(getTotalPage() > 0));
- buttonLeft.enabled = buttonRight.enabled = getTotalPage() > 0;
- }
- if (ScreenHelper.getSearchField() == null) {
- ScreenHelper.setSearchField(new OverlaySearchField(0, 0, 0, 0));
+ }.clickable(ENTRY_LIST_WIDGET.getTotalPages() != 1));
+ buttonLeft.enabled = buttonRight.enabled = ENTRY_LIST_WIDGET.getTotalPages() != 1;
}
- ScreenHelper.getSearchField().getBounds().setBounds(getTextFieldArea());
- this.widgets.add(ScreenHelper.getSearchField());
- ScreenHelper.getSearchField().setText(searchTerm);
- ScreenHelper.getSearchField().setChangedListener(s -> {
- searchTerm = s;
- entryListWidget.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true);
- });
if (ConfigManager.getInstance().getConfig().isCraftableFilterEnabled())
this.widgets.add(toggleButtonWidget = new CraftableToggleButtonWidget(getCraftableToggleArea()) {
@Override
public void onPressed() {
ConfigManager.getInstance().toggleCraftableOnly();
- entryListWidget.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true);
+ ENTRY_LIST_WIDGET.updateSearch(ScreenHelper.getSearchField().getText());
}
@Override
public void lateRender(int mouseX, int mouseY, float delta) {
setBlitOffset(300);
super.lateRender(mouseX, mouseY, delta);
+ setBlitOffset(0);
}
@Override
@@ -338,7 +324,6 @@ public class ContainerScreenOverlay extends Widget {
});
else
toggleButtonWidget = null;
- this.entryListWidget.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false);
}
private Weather getNextWeather() {
@@ -419,21 +404,30 @@ public class ContainerScreenOverlay extends Widget {
return I18n.translate(String.format("%s%s", "text.rei.", ClientHelper.getInstance().isCheating() ? "cheat" : "nocheat"));
}
- public Rectangle getRectangle() {
+ @Override
+ public Rectangle getBounds() {
return rectangle;
}
@Override
public void render(int mouseX, int mouseY, float delta) {
List<ItemStack> currentStacks = ClientHelper.getInstance().getInventoryItemsTypes();
- if (DisplayHelper.getInstance().getBaseBoundsHandler() != null && DisplayHelper.getInstance().getBaseBoundsHandler().shouldRecalculateArea(!ConfigManager.getInstance().getConfig().isLeftHandSidePanel(), rectangle))
- shouldReInit = true;
if (shouldReInit)
init(true);
- else if (ConfigManager.getInstance().isCraftableOnlyEnabled() && ((currentStacks.size() != ScreenHelper.inventoryStacks.size()) || !hasSameListContent(new LinkedList<>(ScreenHelper.inventoryStacks), currentStacks))) {
+ else {
+ for (DisplayHelper.DisplayBoundsHandler<?> handler : DisplayHelper.getInstance().getSortedBoundsHandlers(minecraft.currentScreen.getClass())) {
+ if (handler != null && handler.shouldRecalculateArea(!ConfigManager.getInstance().getConfig().isLeftHandSidePanel(), rectangle)) {
+ init(true);
+ break;
+ }
+ }
+ }
+ // if (DisplayHelper.getInstance().getBaseBoundsHandler() != null && DisplayHelper.getInstance().getBaseBoundsHandler().shouldRecalculateArea(!ConfigManager.getInstance().getConfig().isLeftHandSidePanel(), rectangle))
+ // entryListWidget.updateArea(DisplayHelper.getInstance().getResponsibleBoundsHandler());
+ // else
+ if (ConfigManager.getInstance().isCraftableOnlyEnabled() && ((currentStacks.size() != ScreenHelper.inventoryStacks.size()) || !hasSameListContent(new LinkedList<>(ScreenHelper.inventoryStacks), currentStacks))) {
ScreenHelper.inventoryStacks = currentStacks;
- DisplayHelper.DisplayBoundsHandler<?> boundsHandler = DisplayHelper.getInstance().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
- entryListWidget.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true);
+ ENTRY_LIST_WIDGET.updateSearch(ScreenHelper.getSearchField().getText());
}
if (OverlaySearchField.isSearching) {
GuiLighting.disable();
@@ -442,7 +436,7 @@ public class ContainerScreenOverlay extends Widget {
ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen;
int left = hooks.rei_getContainerLeft(), top = hooks.rei_getContainerTop();
for (Slot slot : ((AbstractContainerScreen<?>) MinecraftClient.getInstance().currentScreen).getContainer().slotList)
- if (!slot.hasStack() || !entryListWidget.filterEntry(EntryStack.create(slot.getStack()), entryListWidget.getLastSearchArgument()))
+ if (!slot.hasStack() || !ENTRY_LIST_WIDGET.canLastSearchTermsBeAppliedTo(EntryStack.create(slot.getStack())))
fillGradient(left + slot.xPosition, top + slot.yPosition, left + slot.xPosition + 16, top + slot.yPosition + 16, -601874400, -601874400);
}
setBlitOffset(0);
@@ -509,7 +503,7 @@ public class ContainerScreenOverlay extends Widget {
if (!ScreenHelper.isOverlayVisible())
return;
if (!ConfigManager.getInstance().getConfig().isEntryListWidgetScrolled())
- buttonLeft.enabled = buttonRight.enabled = getTotalPage() > 0;
+ buttonLeft.enabled = buttonRight.enabled = ENTRY_LIST_WIDGET.getTotalPages() != 1;
widgets.forEach(widget -> {
GuiLighting.disable();
widget.render(int_1, int_2, float_1);
@@ -517,10 +511,6 @@ public class ContainerScreenOverlay extends Widget {
GuiLighting.disable();
}
- private int getTotalPage() {
- return entryListWidget.getTotalPage();
- }
-
@Override
public boolean mouseScrolled(double i, double j, double amount) {
if (!ScreenHelper.isOverlayVisible())
@@ -535,7 +525,7 @@ public class ContainerScreenOverlay extends Widget {
return false;
return true;
} else {
- return entryListWidget.mouseScrolled(i, j, amount);
+ return ENTRY_LIST_WIDGET.mouseScrolled(i, j, amount);
}
}
for (Widget widget : widgets)
diff --git a/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java b/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java
index 0535ae957..1bb440936 100644
--- a/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java
+++ b/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java
@@ -6,6 +6,7 @@
package me.shedaniel.rei.gui;
import com.mojang.blaze3d.systems.RenderSystem;
+import me.shedaniel.math.impl.PointHelper;
import me.shedaniel.rei.gui.widget.TextFieldWidget;
import me.shedaniel.rei.impl.ScreenHelper;
import net.minecraft.client.MinecraftClient;
@@ -27,10 +28,11 @@ public class OverlaySearchField extends TextFieldWidget {
setMaxLength(10000);
}
+ @SuppressWarnings("deprecation")
public void laterRender(int int_1, int int_2, float float_1) {
GuiLighting.disable();
RenderSystem.disableDepthTest();
- setEditableColor(ContainerScreenOverlay.getEntryListWidget().children().isEmpty() && !getText().isEmpty() ? 16733525 : isSearching ? -852212 : 14737632);
+ setEditableColor(ContainerScreenOverlay.getEntryListWidget().getAllStacks().isEmpty() && !getText().isEmpty() ? 16733525 : isSearching ? -852212 : (containsMouse(PointHelper.fromMouse()) || isFocused()) ? (ScreenHelper.isDarkModeEnabled() ? -17587 : -1) : -6250336);
setSuggestion(!isFocused() && getText().isEmpty() ? I18n.translate("text.rei.search.field.suggestion") : null);
super.render(int_1, int_2, float_1);
RenderSystem.enableDepthTest();
diff --git a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
index bcf21bb75..a731fff56 100644
--- a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
+++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
@@ -9,8 +9,7 @@ import com.google.common.collect.Lists;
import com.mojang.blaze3d.systems.RenderSystem;
import me.shedaniel.clothconfig2.ClothConfigInitializer;
import me.shedaniel.clothconfig2.api.ScissorsHandler;
-import me.shedaniel.clothconfig2.gui.widget.DynamicNewSmoothScrollingEntryListWidget.Interpolation;
-import me.shedaniel.clothconfig2.gui.widget.DynamicNewSmoothScrollingEntryListWidget.Precision;
+import me.shedaniel.clothconfig2.gui.widget.DynamicNewSmoothScrollingEntryListWidget;
import me.shedaniel.math.api.Rectangle;
import me.shedaniel.math.impl.PointHelper;
import me.shedaniel.rei.RoughlyEnoughItemsCore;
@@ -20,516 +19,432 @@ import me.shedaniel.rei.gui.config.ItemListOrdering;
import me.shedaniel.rei.impl.ScreenHelper;
import me.shedaniel.rei.impl.SearchArgument;
import me.shedaniel.rei.utils.CollectionUtils;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.item.TooltipContext;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.render.BufferBuilder;
import net.minecraft.client.render.GuiLighting;
import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.VertexFormats;
-import net.minecraft.client.resource.language.I18n;
-import net.minecraft.fluid.Fluid;
-import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
-import net.minecraft.item.ItemStack;
-import net.minecraft.text.Text;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.MathHelper;
-import net.minecraft.util.registry.Registry;
import org.apache.commons.lang3.StringUtils;
-import java.util.*;
-import java.util.concurrent.atomic.AtomicReference;
+import javax.annotation.Nullable;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Locale;
import java.util.function.Supplier;
+import java.util.stream.Collectors;
-@SuppressWarnings({"deprecation", "rawtypes"})
-public class EntryListWidget extends Widget {
+public class EntryListWidget extends WidgetWithBounds {
- private static final Supplier<Boolean> RENDER_EXTRA_CONFIG = () -> ConfigManager.getInstance().getConfig().doesRenderEntryExtraOverlay();
private static final String SPACE = " ", EMPTY = "";
- private static final Comparator<EntryStack> ASCENDING_COMPARATOR;
- private static List<Item> searchBlacklisted = Lists.newArrayList();
- private static float scroll;
- private static float target;
- private static long start;
- private static long duration;
- private static float maxScroll;
- private static float scrollBarAlpha = 0;
- private static float scrollBarAlphaFuture = 0;
- private static long scrollBarAlphaFutureTime = -1;
- private static boolean draggingScrollBar = false;
-
- static {
- ASCENDING_COMPARATOR = (entry, entry1) -> {
- if (ConfigManager.getInstance().getConfig().getItemListOrdering().equals(ItemListOrdering.name))
- return tryGetEntryStackName(entry).compareToIgnoreCase(tryGetEntryStackName(entry1));
- if (ConfigManager.getInstance().getConfig().getItemListOrdering().equals(ItemListOrdering.item_groups)) {
- if (entry.getType() == EntryStack.Type.ITEM && entry1.getType() == EntryStack.Type.ITEM) {
- ItemStack stack0 = entry.getItemStack();
- ItemStack stack1 = entry1.getItemStack();
- List<ItemGroup> itemGroups = Arrays.asList(ItemGroup.GROUPS);
- return itemGroups.indexOf(stack0.getItem().getGroup()) - itemGroups.indexOf(stack1.getItem().getGroup());
- }
- }
- return 0;
- };
+ private static final Supplier<Boolean> RENDER_EXTRA_CONFIG = ConfigManager.getInstance().getConfig()::doesRenderEntryExtraOverlay;
+ @SuppressWarnings("deprecation")
+ private static final Comparator<? super EntryStack> ENTRY_NAME_COMPARER = Comparator.comparing(SearchArgument::tryGetEntryStackName);
+ private static final Comparator<? super EntryStack> ENTRY_GROUP_COMPARER = Comparator.comparingInt(stack -> {
+ if (stack.getType() == EntryStack.Type.ITEM) {
+ ItemGroup group = stack.getItem().getGroup();
+ if (group != null) return group.getIndex();
+ }
+ return Integer.MAX_VALUE;
+ });
+ private static int page;
+ protected double target;
+ protected double scroll;
+ protected long start;
+ protected long duration;
+ private Rectangle bounds, innerBounds;
+ private List<EntryStack> allStacks = null;
+ private List<EntryListEntry> entries = Collections.emptyList();
+ @SuppressWarnings("deprecation")
+ private List<SearchArgument.SearchArguments> lastSearchArguments = Collections.emptyList();
+ private boolean draggingScrollBar = false;
+
+ protected final int getMaxScrollPosition() {
+ int candidate = 0;
+ for (EntryListEntry entry : entries) {
+ if (entry.getCurrentEntry().getType() != EntryStack.Type.EMPTY && entry.backupY > candidate)
+ candidate = entry.backupY;
+ }
+ return candidate;
}
- private final List<SearchArgument[]> lastSearchArgument;
- private List<EntryStack> currentDisplayed;
- private List<Slot> widgets;
- private int width, height, page;
- private Rectangle rectangle, listArea;
+ protected final int getMaxScroll() {
+ return Math.max(0, this.getMaxScrollPosition() - innerBounds.height);
+ }
- public EntryListWidget(int page) {
- this.currentDisplayed = Lists.newArrayList();
- this.width = 0;
- this.height = 0;
- this.page = page;
- this.lastSearchArgument = Lists.newArrayList();
+ protected final double clamp(double v) {
+ return this.clamp(v, 200.0D);
}
- public static List<String> tryGetItemStackToolTip(ItemStack itemStack, boolean careAboutAdvanced) {
- if (!searchBlacklisted.contains(itemStack.getItem()))
- try {
- return CollectionUtils.map(itemStack.getTooltip(MinecraftClient.getInstance().player, MinecraftClient.getInstance().options.advancedItemTooltips && careAboutAdvanced ? TooltipContext.Default.ADVANCED : TooltipContext.Default.NORMAL), Text::asFormattedString);
- } catch (Throwable e) {
- e.printStackTrace();
- searchBlacklisted.add(itemStack.getItem());
- }
- return Collections.singletonList(tryGetItemStackName(itemStack));
+ protected final double clamp(double v, double clampExtension) {
+ return MathHelper.clamp(v, -clampExtension, (double) this.getMaxScroll() + clampExtension);
}
- public static String tryGetEntryStackName(EntryStack stack) {
- if (stack.getType() == EntryStack.Type.ITEM)
- return tryGetItemStackName(stack.getItemStack());
- else if (stack.getType() == EntryStack.Type.FLUID)
- return tryGetFluidName(stack.getFluid());
- return "";
+ protected final void offset(double value, boolean animated) {
+ scrollTo(target + value, animated);
}
- public static String tryGetFluidName(Fluid fluid) {
- Identifier id = Registry.FLUID.getId(fluid);
- if (I18n.hasTranslation("block." + id.toString().replaceFirst(":", ".")))
- return I18n.translate("block." + id.toString().replaceFirst(":", "."));
- return CollectionUtils.mapAndJoinToString(id.getPath().split("_"), StringUtils::capitalize, " ");
+ protected final void scrollTo(double value, boolean animated) {
+ scrollTo(value, animated, ClothConfigInitializer.getScrollDuration());
}
- public static String tryGetItemStackName(ItemStack stack) {
- if (!searchBlacklisted.contains(stack.getItem()))
- try {
- return stack.getName().asFormattedString();
- } catch (Throwable e) {
- e.printStackTrace();
- searchBlacklisted.add(stack.getItem());
- }
- try {
- return I18n.translate("item." + Registry.ITEM.getId(stack.getItem()).toString().replace(":", "."));
- } catch (Throwable e) {
- e.printStackTrace();
- }
- return "ERROR";
+ protected final void scrollTo(double value, boolean animated, long duration) {
+ target = clamp(value);
+
+ if (animated) {
+ start = System.currentTimeMillis();
+ this.duration = duration;
+ } else
+ scroll = target;
}
- public static boolean filterEntry(EntryStack entry, List<SearchArgument[]> arguments) {
- if (arguments.isEmpty())
- return true;
- AtomicReference<String> mod = new AtomicReference<>(), tooltips = new AtomicReference<>(), name = new AtomicReference<>();
- for (SearchArgument[] arguments1 : arguments) {
- boolean b = true;
- for (SearchArgument argument : arguments1) {
- if (argument.getArgumentType() == (SearchArgument.ArgumentType.ALWAYS))
- return true;
- if (argument.getArgumentType() == SearchArgument.ArgumentType.MOD) {
- fillMod(entry, mod);
- if (mod.get() != null && !mod.get().isEmpty() && argument.getFunction(!argument.isInclude()).apply(mod.get())) {
- b = false;
- break;
- }
- }
- if (argument.getArgumentType() == SearchArgument.ArgumentType.TOOLTIP) {
- fillTooltip(entry, tooltips);
- if (tooltips.get() != null && !tooltips.get().isEmpty() && argument.getFunction(!argument.isInclude()).apply(tooltips.get())) {
- b = false;
- break;
- }
- }
- if (argument.getArgumentType() == SearchArgument.ArgumentType.TEXT) {
- fillName(entry, name);
- if (name.get() != null && !name.get().isEmpty() && argument.getFunction(!argument.isInclude()).apply(name.get())) {
- b = false;
- break;
- }
- }
- }
- if (b)
- return true;
- }
- return false;
+ @Override
+ public boolean mouseScrolled(double double_1, double double_2, double double_3) {
+ offset(ClothConfigInitializer.getScrollStep() * -double_3, true);
+ return true;
}
- private static AtomicReference<String> fillMod(EntryStack entry, AtomicReference<String> mod) {
- if (mod.get() == null) {
- Optional<Identifier> identifier = entry.getIdentifier();
- if (identifier.isPresent())
- mod.set(ClientHelper.getInstance().getModFromIdentifier(identifier.get()).replace(SPACE, EMPTY).toLowerCase(Locale.ROOT));
- else mod.set("");
- }
- return mod;
+ @Override
+ public Rectangle getBounds() {
+ return bounds;
}
- private static AtomicReference<String> fillTooltip(EntryStack entry, AtomicReference<String> mod) {
- if (mod.get() == null)
- if (entry.getType() == EntryStack.Type.ITEM)
- mod.set(CollectionUtils.joinToString(tryGetItemStackToolTip(entry.getItemStack(), false), "").replace(SPACE, EMPTY).toLowerCase(Locale.ROOT));
- else
- mod.set(tryGetEntryStackName(entry).replace(SPACE, EMPTY).toLowerCase(Locale.ROOT));
- return mod;
+ public int getPage() {
+ return page;
}
- private static AtomicReference<String> fillName(EntryStack entry, AtomicReference<String> mod) {
- if (mod.get() == null)
- mod.set(tryGetEntryStackName(entry).replace(SPACE, EMPTY).toLowerCase(Locale.ROOT));
- return mod;
+ public void setPage(int page) {
+ this.page = page;
}
- public static float getMaxScroll() {
- return Math.max(maxScroll - ScreenHelper.getLastOverlay().getEntryListWidget().rectangle.height, 0);
+ public void previousPage() {
+ this.page--;
}
- public static float getScroll() {
- return scroll;
+ public void nextPage() {
+ this.page++;
}
- public static final float clamp(float v) {
- return clamp(v, 300f);
+ public int getTotalPages() {
+ if (ConfigManager.getInstance().getConfig().isEntryListWidgetScrolled()) return 1;
+ return MathHelper.ceil(allStacks.size() / (float) entries.size());
}
- public static final float clamp(float v, float clampExtension) {
- return MathHelper.clamp(v, -clampExtension, getMaxScroll() + clampExtension);
+ @Override
+ public void render(int mouseX, int mouseY, float delta) {
+ if (ConfigManager.getInstance().getConfig().isEntryListWidgetScrolled()) {
+ for (EntryListEntry entry : entries) entry.clearStacks();
+ int nextIndex = 0;
+ for (int i = 0; i < allStacks.size(); i++) {
+ EntryStack stack = allStacks.get(i);
+ while (true) {
+ EntryListEntry entry = entries.get(nextIndex);
+ entry.getBounds().y = (int) (entry.backupY - scroll);
+ if (notSteppingOnExclusionZones(entry.getBounds().x, entry.getBounds().y, innerBounds)) {
+ entry.entry(stack);
+ nextIndex++;
+ break;
+ } else {
+ nextIndex++;
+ }
+ }
+ }
+ updatePosition(delta);
+ ScissorsHandler.INSTANCE.scissor(bounds);
+ for (EntryListEntry widget : entries) {
+ if (widget.getBounds().getMaxY() >= bounds.y && widget.getBounds().y <= bounds.getMaxY())
+ widget.render(mouseX, mouseY, delta);
+ }
+ ScissorsHandler.INSTANCE.removeLastScissor();
+ renderScrollbar();
+ } else {
+ for (Widget widget : entries) {
+ widget.render(mouseX, mouseY, delta);
+ }
+ }
}
- public static void offset(float value, boolean animated) {
- scrollTo(target + value, animated);
+ private int getScrollbarMinX() {
+ if (ConfigManager.getInstance().getConfig().isLeftHandSidePanel())
+ return bounds.x + 1;
+ return bounds.getMaxX() - 7;
}
- public static void scrollTo(float value, boolean animated) {
- scrollTo(value, animated, ClothConfigInitializer.getScrollDuration());
+ @Override
+ public boolean mouseDragged(double mouseX, double mouseY, int int_1, double double_3, double double_4) {
+ if (int_1 == 0 && draggingScrollBar) {
+ float height = getMaxScrollPosition();
+ int actualHeight = innerBounds.height;
+ if (height > actualHeight && mouseY >= innerBounds.y && mouseY <= innerBounds.getMaxY()) {
+ double double_5 = (double) Math.max(1, this.getMaxScroll());
+ int int_2 = innerBounds.height;
+ int int_3 = MathHelper.clamp((int) ((float) (int_2 * int_2) / (float) getMaxScrollPosition()), 32, int_2 - 8);
+ double double_6 = Math.max(1.0D, double_5 / (double) (int_2 - int_3));
+ scrollTo(MathHelper.clamp((float) (scroll + double_4 * double_6), 0, height - innerBounds.height), false);
+ }
+ }
+ return super.mouseDragged(mouseX, mouseY, int_1, double_3, double_4);
}
- public static void scrollTo(float value, boolean