diff options
author | Roman / Linnea Gräf <roman.graef@gmail.com> | 2023-04-04 20:37:03 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-04 20:37:03 +0200 |
commit | 93cdc3e03c3654f560204c23017fbf1e9f720a6c (patch) | |
tree | c4a7a296cf0a9997acfc14f7b2ed56b68ccc65e6 | |
parent | 42a7f35c7e1ed7b771f93e69e6bbd2a674a4f569 (diff) | |
download | NotEnoughUpdates-93cdc3e03c3654f560204c23017fbf1e9f720a6c.tar.gz NotEnoughUpdates-93cdc3e03c3654f560204c23017fbf1e9f720a6c.tar.bz2 NotEnoughUpdates-93cdc3e03c3654f560204c23017fbf1e9f720a6c.zip |
Scrollable Tooltips a la text line removal. (#613)
* scrolling
* Reverse scrolling
* change trophy fish pv page to use the same tooltip system as the rest of the pv pages
* Added the ability to use neu's tooltips instead of vanilla
* Move config option
* Add support for the custom tooltips
* Fixed equipment overlay breaking
* Fixed some guis going no
* Use a new arraylist instead of modifying the old one (achievments)
* fix merge conflict
---------
Co-authored-by: nopo <nopotheemail@gmail.com>
5 files changed, 169 insertions, 67 deletions
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/TooltipTextScrolling.java b/src/main/java/io/github/moulberry/notenoughupdates/TooltipTextScrolling.java new file mode 100644 index 00000000..ccb28dd6 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/TooltipTextScrolling.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2023 NotEnoughUpdates contributors + * + * This file is part of NotEnoughUpdates. + * + * NotEnoughUpdates is free software: you can redistribute it + * and/or modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * NotEnoughUpdates is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>. + */ + +package io.github.moulberry.notenoughupdates; + +import io.github.moulberry.notenoughupdates.autosubscribe.NEUAutoSubscribe; +import net.minecraftforge.client.event.GuiScreenEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import org.lwjgl.input.Mouse; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@NEUAutoSubscribe +public class TooltipTextScrolling { + static List<String> lastRenderedTooltip = null; + static int scrollOffset = 0; + static boolean didRenderTooltip = false; + + public static List<String> handleTextLineRendering(List<String> tooltip) { + didRenderTooltip = true; + if (!Objects.equals(tooltip, lastRenderedTooltip)) { + lastRenderedTooltip = new ArrayList<>(tooltip); + scrollOffset = 0; + return tooltip; + } + lastRenderedTooltip = new ArrayList<>(tooltip); + List<String> modifiableTooltip = new ArrayList<>(tooltip); + for (int i = 0; i < scrollOffset && modifiableTooltip.size() > 1; i++) { + modifiableTooltip.remove(0); + } + for (int i = 0; i < -scrollOffset && modifiableTooltip.size() > 1; i++) { + modifiableTooltip.remove(modifiableTooltip.size() - 1); + } + return modifiableTooltip; + } + + @SubscribeEvent + public void onMouse(GuiScreenEvent.MouseInputEvent.Pre event) { + if (!NotEnoughUpdates.INSTANCE.config.tooltipTweaks.scrollableTooltips) return; + if (Mouse.getEventDWheel() < 0) { + scrollOffset = Math.max( + lastRenderedTooltip == null ? 0 : -Math.max(lastRenderedTooltip.size() - 1, 0) + , scrollOffset - 1 + ); + } else if (Mouse.getEventDWheel() > 0) { + scrollOffset = Math.min( + lastRenderedTooltip == null ? 0 : Math.max(lastRenderedTooltip.size() - 1, 0), + scrollOffset + 1 + ); + } + } + + @SubscribeEvent + public void onTick(TickEvent.RenderTickEvent event) { + if (event.phase == TickEvent.Phase.START) { + didRenderTooltip = false; + } else if (!didRenderTooltip) { + lastRenderedTooltip = null; + } + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiUtils.java index 0ad2a098..a4e83a11 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiUtils.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiUtils.java @@ -20,6 +20,7 @@ package io.github.moulberry.notenoughupdates.mixins; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.TooltipTextScrolling; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; @@ -35,10 +36,15 @@ import java.util.List; @Mixin(value = GuiUtils.class, remap = false) public class MixinGuiUtils { - @Inject(method = "drawHoveringText", at = @At("HEAD")) + @Inject(method = "drawHoveringText", at = @At("HEAD"), cancellable = true) private static void drawHoveringText_head( List<String> textLines, int mouseX, int mouseY, int screenWidth, int screenHeight, int maxTextWidth, FontRenderer font, CallbackInfo ci) { - Utils.pushGuiScale(NotEnoughUpdates.INSTANCE.config.tooltipTweaks.guiScale); + if (NotEnoughUpdates.INSTANCE.config.tooltipTweaks.customTooltips) { + Utils.drawHoveringText(textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, font); + ci.cancel(); + } else if (NotEnoughUpdates.INSTANCE.config.tooltipTweaks.guiScale != 0) { + Utils.pushGuiScale(NotEnoughUpdates.INSTANCE.config.tooltipTweaks.guiScale); + } } @ModifyVariable(method = "drawHoveringText", at = @At(value = "HEAD"), ordinal = 0, argsOnly = true) @@ -68,4 +74,10 @@ public class MixinGuiUtils { List<String> textLines, int mouseX, int mouseY, int screenWidth, int screenHeight, int maxTextWidth, FontRenderer font, CallbackInfo ci) { Utils.resetGuiScale(); } + @ModifyVariable(at = @At("HEAD"), method = "drawHoveringText") + private static List<String> onDrawHoveringText( + List<String> textLines + ) { + return TooltipTextScrolling.handleTextLineRendering(textLines); + } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TooltipTweaks.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TooltipTweaks.java index 900ecf13..ae4a5aff 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TooltipTweaks.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TooltipTweaks.java @@ -167,6 +167,23 @@ public class TooltipTweaks { @Expose @ConfigOption( + name = "Custom tooltips", + desc = "Replace tooltips with neu's custom tooltips" + ) + @ConfigEditorBoolean + public boolean customTooltips = false; + + @Expose + @ConfigOption( + name = "Scrollable Tooltips", + desc = "Make tooltips text scrollable, by making some text lines disappear when using the mouse while hovering over an item." + ) + @ConfigEditorBoolean + public boolean scrollableTooltips = false; + + + @Expose + @ConfigOption( name = "Expand Pet Exp Requirement", desc = "Show which the full amount of pet xp required" ) diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFishPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFishPage.java index d6746e1d..f4378926 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFishPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFishPage.java @@ -128,6 +128,7 @@ public class TrophyFishPage extends GuiProfileViewerPage { private final Map<String, Integer> total = new HashMap<>(); private final Map<String, TrophyFish> trophyFishList = new HashMap<>(); private long totalCount = 0; + private static List<String> tooltipToDisplay = null; public TrophyFishPage(GuiProfileViewer instance) { super(instance); @@ -226,10 +227,8 @@ public class TrophyFishPage extends GuiProfileViewerPage { if (mouseX >= x && mouseX < x + 24) { if (mouseY >= y && mouseY <= y + 24) { - Utils.drawHoveringText( - getTooltip(value.getName(), value.getTrophyFishRarityIntegerMap()), - mouseX, mouseY, width, height, -1 - ); + tooltipToDisplay = new ArrayList<>(); + tooltipToDisplay.addAll(getTooltip(value.getName(), value.getTrophyFishRarityIntegerMap())); } } } @@ -246,7 +245,8 @@ public class TrophyFishPage extends GuiProfileViewerPage { Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI(itemStack, x, y); if (mouseX >= x && mouseX < x + 24) { if (mouseY >= y && mouseY <= y + 24) { - Utils.drawHoveringText(getTooltip(difference, null), mouseX, mouseY, width, height, -1); + tooltipToDisplay = new ArrayList<>(); + tooltipToDisplay.addAll(getTooltip(difference, null)); GlStateManager.color(1, 1, 1, 1); } } @@ -286,6 +286,19 @@ public class TrophyFishPage extends GuiProfileViewerPage { i += 10; } + if (tooltipToDisplay != null) { + Utils.drawHoveringText( + tooltipToDisplay, + mouseX, + mouseY, + getInstance().width, + getInstance().height, + -1, + Minecraft.getMinecraft().fontRendererObj + ); + tooltipToDisplay = null; + } + GlStateManager.enableLighting(); } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java b/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java index 49caa2b6..e3d52fe7 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java @@ -27,6 +27,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.TooltipTextScrolling; import io.github.moulberry.notenoughupdates.miscfeatures.SlotLocking; import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; import net.minecraft.block.Block; @@ -1521,20 +1522,6 @@ public class Utils { Minecraft.getMinecraft().fontRendererObj ); } - - @Deprecated - public static void drawHoveringText( - List<String> textLines, - final int mouseX, - final int mouseY, - final int screenWidth, - final int screenHeight, - final int maxTextWidth, - FontRenderer font - ) { - drawHoveringText(textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, font, true); - } - public static JsonObject getConstant(String constant, Gson gson) { return getConstant(constant, gson, JsonObject.class); } @@ -1668,39 +1655,38 @@ public class Utils { scrollY.resetTimer(); } - public static void drawHoveringText( - List<String> textLines, - final int mouseX, - final int mouseY, - final int screenWidth, - final int screenHeight, - final int maxTextWidth, - boolean coloured - ) { - drawHoveringText( - textLines, - mouseX, - mouseY, - screenWidth, - screenHeight, - maxTextWidth, - Minecraft.getMinecraft().fontRendererObj, - coloured - ); - } - @Deprecated public static void drawHoveringText( List<String> textLines, - final int mouseX, - final int mouseY, - final int screenWidth, - final int screenHeight, + int mouseX, + int mouseY, + int screenWidth, + int screenHeight, final int maxTextWidth, - FontRenderer font, - boolean coloured + FontRenderer font ) { if (!textLines.isEmpty()) { + int borderColorStart = 0x505000FF; + if (NotEnoughUpdates.INSTANCE.config.tooltipTweaks.tooltipBorderColours) { + if (textLines.size() > 0) { + String first = textLines.get(0); + borderColorStart = getPrimaryColour(first).getRGB() & 0x00FFFFFF | + ((NotEnoughUpdates.INSTANCE.config.tooltipTweaks.tooltipBorderOpacity) << 24); + } + } + textLines = TooltipTextScrolling.handleTextLineRendering(textLines); + if (NotEnoughUpdates.INSTANCE.config.tooltipTweaks.guiScale != 0) { + ScaledResolution scaledResolution = Utils.pushGuiScale(NotEnoughUpdates.INSTANCE.config.tooltipTweaks.guiScale); + mouseX = Mouse.getX() * scaledResolution.getScaledWidth() / Minecraft.getMinecraft().displayWidth; + + mouseY = scaledResolution.getScaledHeight() - + Mouse.getY() * scaledResolution.getScaledHeight() / Minecraft.getMinecraft().displayHeight; + + screenWidth = scaledResolution.getScaledWidth(); + + screenHeight = scaledResolution.getScaledHeight(); + } + GlStateManager.disableRescaleNormal(); RenderHelper.disableStandardItemLighting(); GlStateManager.disableLighting(); @@ -1776,19 +1762,21 @@ public class Utils { } //Scrollable tooltips - if (tooltipHeight + 6 > screenHeight) { - if (scrollY.getTarget() < 0) { - scrollY.setTarget(0); - scrollY.resetTimer(); - } else if (screenHeight - tooltipHeight - 12 + (int) scrollY.getTarget() > 0) { - scrollY.setTarget(-screenHeight + tooltipHeight + 12); + if (!NotEnoughUpdates.INSTANCE.config.tooltipTweaks.scrollableTooltips) { + if (tooltipHeight + 6 > screenHeight) { + if (scrollY.getTarget() < 0) { + scrollY.setTarget(0); + scrollY.resetTimer(); + } else if (screenHeight - tooltipHeight - 12 + (int) scrollY.getTarget() > 0) { + scrollY.setTarget(-screenHeight + tooltipHeight + 12); + scrollY.resetTimer(); + } + } else { + scrollY.setValue(0); scrollY.resetTimer(); } - } else { - scrollY.setValue(0); - scrollY.resetTimer(); + scrollY.tick(); } - scrollY.tick(); if (tooltipY + tooltipHeight + 6 > screenHeight) { tooltipY = screenHeight - tooltipHeight - 6 + (int) scrollY.getValue(); @@ -1841,15 +1829,6 @@ public class Utils { backgroundColor, backgroundColor ); - //TODO: Coloured Borders - int borderColorStart = 0x505000FF; - if (NotEnoughUpdates.INSTANCE.config.tooltipTweaks.tooltipBorderColours && coloured) { - if (textLines.size() > 0) { - String first = textLines.get(0); - borderColorStart = getPrimaryColour(first).getRGB() & 0x00FFFFFF | - ((NotEnoughUpdates.INSTANCE.config.tooltipTweaks.tooltipBorderOpacity) << 24); - } - } final int borderColorEnd = (borderColorStart & 0xFEFEFE) >> 1 | borderColorStart & 0xFF000000; drawGradientRect( zLevel, @@ -1904,6 +1883,7 @@ public class Utils { GlStateManager.enableDepth(); RenderHelper.enableStandardItemLighting(); GlStateManager.enableRescaleNormal(); + if (NotEnoughUpdates.INSTANCE.config.tooltipTweaks.guiScale != 0) Utils.pushGuiScale(0); } GlStateManager.disableLighting(); } |