diff options
| author | shedaniel <daniel@shedaniel.me> | 2019-11-26 20:59:59 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2019-11-26 20:59:59 +0800 |
| commit | 516f882d348cd9535a963f3674597ca680c49909 (patch) | |
| tree | 95048c24b82274d0e7cfcce8143f5a39705937f7 /src/main | |
| parent | 295dae46f8f3b717c914adacc023e7692b82bfc1 (diff) | |
| download | RoughlyEnoughItems-516f882d348cd9535a963f3674597ca680c49909.tar.gz RoughlyEnoughItems-516f882d348cd9535a963f3674597ca680c49909.tar.bz2 RoughlyEnoughItems-516f882d348cd9535a963f3674597ca680c49909.zip | |
3.2.12
Fixed #29
Diffstat (limited to 'src/main')
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) { - |
