From e8d8c1994bee85c46f6b478f603b16b32d3e9968 Mon Sep 17 00:00:00 2001 From: miozune Date: Fri, 3 Feb 2023 23:35:03 +0900 Subject: [PATCH] Add tooltip pagination (#343) --- .../java/codechicken/nei/LayoutManager.java | 5 ++ .../java/codechicken/nei/NEIClientConfig.java | 1 + .../nei/guihook/GuiContainerManager.java | 51 ++++++++++++++++++- src/main/resources/assets/nei/lang/en_US.lang | 2 + 4 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/main/java/codechicken/nei/LayoutManager.java b/src/main/java/codechicken/nei/LayoutManager.java index b67304aa..8167f0d0 100644 --- a/src/main/java/codechicken/nei/LayoutManager.java +++ b/src/main/java/codechicken/nei/LayoutManager.java @@ -221,6 +221,11 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH return true; } + if (NEIClientConfig.isKeyHashDown("gui.next_tooltip")) { + GuiContainerManager.incrementTooltipPage(); + return true; + } + if (isEnabled() && !isHidden()) { for (Widget widget : controlWidgets) if (inputFocused == null) widget.lastKeyTyped(keyID, keyChar); } diff --git a/src/main/java/codechicken/nei/NEIClientConfig.java b/src/main/java/codechicken/nei/NEIClientConfig.java index 532d3daa..37fba5ec 100644 --- a/src/main/java/codechicken/nei/NEIClientConfig.java +++ b/src/main/java/codechicken/nei/NEIClientConfig.java @@ -345,6 +345,7 @@ public class NEIClientConfig { API.addHashBind("gui.hide_bookmarks", Keyboard.KEY_B); API.addKeyBind("gui.getprevioussearch", Keyboard.KEY_UP); API.addKeyBind("gui.getnextsearch", Keyboard.KEY_DOWN); + API.addKeyBind("gui.next_tooltip", Keyboard.KEY_Z); API.addKeyBind("world.chunkoverlay", Keyboard.KEY_F9); API.addKeyBind("world.moboverlay", Keyboard.KEY_F7); diff --git a/src/main/java/codechicken/nei/guihook/GuiContainerManager.java b/src/main/java/codechicken/nei/guihook/GuiContainerManager.java index 639d30a9..2db38461 100644 --- a/src/main/java/codechicken/nei/guihook/GuiContainerManager.java +++ b/src/main/java/codechicken/nei/guihook/GuiContainerManager.java @@ -5,7 +5,7 @@ import static codechicken.lib.gui.GuiDraw.fontRenderer; import static codechicken.lib.gui.GuiDraw.getMousePosition; import static codechicken.lib.gui.GuiDraw.renderEngine; -import java.awt.Point; +import java.awt.*; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -32,6 +32,7 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; import codechicken.lib.gui.GuiDraw; +import codechicken.nei.NEIClientConfig; import codechicken.nei.NEIClientUtils; import codechicken.nei.recipe.StackInfo; @@ -497,7 +498,49 @@ public class GuiContainerManager { if (tooltip.size() > 0) tooltip.set(0, tooltip.get(0) + GuiDraw.TOOLTIP_LINESPACE); // add space after 'title' - drawMultilineTip(font, mousex + 12, mousey - 12, tooltip); + drawPagedTooltip(font, mousex + 12, mousey - 12, tooltip); + } + + private static int tooltipPage; + + public static void drawPagedTooltip(FontRenderer font, int x, int y, List list) { + if (list.isEmpty()) return; + List> tooltips = splitTooltipByPage(list); + tooltipPage = tooltipPage < tooltips.size() ? tooltipPage : 0; + if (tooltips.size() > 1) { + tooltips.get(tooltipPage).add( + EnumChatFormatting.ITALIC + NEIClientUtils.translate( + "inventory.tooltip.page", + tooltipPage + 1, + tooltips.size(), + Keyboard.getKeyName(NEIClientConfig.getKeyBinding("gui.next_tooltip")))); + } + drawMultilineTip(font, x, y, tooltips.get(tooltipPage)); + } + + public static List> splitTooltipByPage(List list) { + List> ret = new ArrayList<>(); + List tmp = new ArrayList<>(); + int height = -2; + for (int i = 0; i < list.size(); i++) { + String text = list.get(i); + GuiDraw.ITooltipLineHandler line = GuiDraw.getTipLine(text); + int lineHeight = line != null ? line.getSize().height + : text.endsWith(GuiDraw.TOOLTIP_LINESPACE) && i + 1 < list.size() ? 12 : 10; + if (height + lineHeight <= GuiDraw.displaySize().height - 8 * 2 - 10) { + // top & bottom 8px + last line for showing page + height += lineHeight; + } else { + ret.add(new ArrayList<>(tmp)); + tmp.clear(); + height = -2; + } + tmp.add(text); + } + if (!tmp.isEmpty()) { + ret.add(tmp); + } + return ret; } public static boolean shouldShowTooltip(GuiContainer window) { @@ -516,6 +559,10 @@ public class GuiContainerManager { } } + public static void incrementTooltipPage() { + tooltipPage++; + } + public void renderSlotUnderlay(Slot slot) { for (IContainerDrawHandler drawHandler : drawHandlers) drawHandler.renderSlotUnderlay(window, slot); } diff --git a/src/main/resources/assets/nei/lang/en_US.lang b/src/main/resources/assets/nei/lang/en_US.lang index 60628cee..0a265a6b 100644 --- a/src/main/resources/assets/nei/lang/en_US.lang +++ b/src/main/resources/assets/nei/lang/en_US.lang @@ -56,6 +56,7 @@ nei.inventory.current.gamemode.0=Current gamemode: survival nei.inventory.current.gamemode.1=Current gamemode: creative nei.inventory.current.gamemode.2=Current gamemode: creative+ nei.inventory.current.gamemode.3=Current gamemode: adventure +nei.inventory.tooltip.page=Page: %s / %s [Press %s to see next page] nei.inventory.gamemode.0=Click: Set gamemode to survival nei.inventory.gamemode.1=Click: Set gamemode to creative @@ -108,6 +109,7 @@ nei.options.keys.gui.overlay_hide=Hide Overlay Recipe nei.options.keys.gui.overlay_use=Use Overlay Recipe nei.options.keys.gui.getprevioussearch=Previous Search nei.options.keys.gui.getnextsearch=Next Search +nei.options.keys.gui.next_tooltip=Next Tooltip nei.options.keys.world=World nei.options.keys.world.chunkoverlay=Chunk Boundary Overlay nei.options.keys.world.moboverlay=Mob Spawn Overlay