diff options
9 files changed, 263 insertions, 96 deletions
diff --git a/api/OneConfig.api b/api/OneConfig.api index 304003f..4f5a3bc 100644 --- a/api/OneConfig.api +++ b/api/OneConfig.api @@ -854,6 +854,7 @@ public abstract class cc/polyfrost/oneconfig/hud/Hud { public field borderColor Lcc/polyfrost/oneconfig/config/core/OneColor; public field borderSize F public field cornerRadius F + public field enabled Z public field paddingX F public field paddingY F public field rounded Z @@ -1058,14 +1059,10 @@ public final class cc/polyfrost/oneconfig/renderer/RenderManager { public static fun drawSvg (JLjava/lang/String;FFFF)V public static fun drawSvg (JLjava/lang/String;FFFFI)V public static fun drawText (JLjava/lang/String;FFIFLcc/polyfrost/oneconfig/renderer/font/Font;)V - public static fun drawText (JLjava/lang/String;FFIFLcc/polyfrost/oneconfig/renderer/font/Fonts;)V public static fun drawURL (JLjava/lang/String;FFFLcc/polyfrost/oneconfig/renderer/font/Font;)V - public static fun drawURL (JLjava/lang/String;FFFLcc/polyfrost/oneconfig/renderer/font/Fonts;)V public static fun drawWrappedString (JLjava/lang/String;FFFIFLcc/polyfrost/oneconfig/renderer/font/Font;)V - public static fun drawWrappedString (JLjava/lang/String;FFFIFLcc/polyfrost/oneconfig/renderer/font/Fonts;)V public static fun fillNVGColorWithRGBA (FFFFLorg/lwjgl/nanovg/NVGColor;)V public static fun getTextWidth (JLjava/lang/String;FLcc/polyfrost/oneconfig/renderer/font/Font;)F - public static fun getTextWidth (JLjava/lang/String;FLcc/polyfrost/oneconfig/renderer/font/Fonts;)F public static fun scale (JFF)V public static fun setAlpha (JF)V public static fun setupAndDraw (Ljava/util/function/LongConsumer;)V @@ -1081,6 +1078,20 @@ public final class cc/polyfrost/oneconfig/renderer/RenderManager$TextType : java public static fun values ()[Lcc/polyfrost/oneconfig/renderer/RenderManager$TextType; } +public class cc/polyfrost/oneconfig/renderer/TextRenderer { + public fun <init> ()V + public static fun drawText (JLjava/lang/String;FFIFLcc/polyfrost/oneconfig/renderer/font/Font;)V + public static fun drawText (JLjava/lang/String;FFIFLcc/polyfrost/oneconfig/renderer/font/Font;F)V + public static fun drawText (JLjava/util/ArrayList;FFIFLcc/polyfrost/oneconfig/renderer/font/Font;F)V + public static fun drawText (JLjava/util/ArrayList;FFIFLcc/polyfrost/oneconfig/renderer/font/Font;FF)V + public static fun drawURL (JLjava/lang/String;FFFLcc/polyfrost/oneconfig/renderer/font/Font;)V + public static fun drawWrappedString (JLjava/lang/String;FFFIFLcc/polyfrost/oneconfig/renderer/font/Font;)V + public static fun getTextWidth (JLjava/lang/String;FLcc/polyfrost/oneconfig/renderer/font/Font;)F + public static fun getTextWidth (JLjava/lang/String;FLcc/polyfrost/oneconfig/renderer/font/Font;F)F + public static fun wrapText (JLjava/lang/String;FFLcc/polyfrost/oneconfig/renderer/font/Font;)Ljava/util/ArrayList; + public static fun wrapText (JLjava/lang/String;FFLcc/polyfrost/oneconfig/renderer/font/Font;F)Ljava/util/ArrayList; +} + public class cc/polyfrost/oneconfig/renderer/font/Font { public fun <init> (Ljava/lang/String;Ljava/lang/String;)V public fun getBuffer ()Ljava/nio/ByteBuffer; @@ -1096,16 +1107,14 @@ public class cc/polyfrost/oneconfig/renderer/font/FontManager { public fun loadFont (JLcc/polyfrost/oneconfig/renderer/font/Font;)V } -public final class cc/polyfrost/oneconfig/renderer/font/Fonts : java/lang/Enum { - public static final field BOLD Lcc/polyfrost/oneconfig/renderer/font/Fonts; - public static final field MEDIUM Lcc/polyfrost/oneconfig/renderer/font/Fonts; - public static final field MINECRAFT_BOLD Lcc/polyfrost/oneconfig/renderer/font/Fonts; - public static final field MINECRAFT_REGULAR Lcc/polyfrost/oneconfig/renderer/font/Fonts; - public static final field REGULAR Lcc/polyfrost/oneconfig/renderer/font/Fonts; - public static final field SEMIBOLD Lcc/polyfrost/oneconfig/renderer/font/Fonts; - public final field font Lcc/polyfrost/oneconfig/renderer/font/Font; - public static fun valueOf (Ljava/lang/String;)Lcc/polyfrost/oneconfig/renderer/font/Fonts; - public static fun values ()[Lcc/polyfrost/oneconfig/renderer/font/Fonts; +public class cc/polyfrost/oneconfig/renderer/font/Fonts { + public static final field BOLD Lcc/polyfrost/oneconfig/renderer/font/Font; + public static final field MEDIUM Lcc/polyfrost/oneconfig/renderer/font/Font; + public static final field MINECRAFT_BOLD Lcc/polyfrost/oneconfig/renderer/font/Font; + public static final field MINECRAFT_REGULAR Lcc/polyfrost/oneconfig/renderer/font/Font; + public static final field REGULAR Lcc/polyfrost/oneconfig/renderer/font/Font; + public static final field SEMIBOLD Lcc/polyfrost/oneconfig/renderer/font/Font; + public fun <init> ()V } public class cc/polyfrost/oneconfig/renderer/scissor/Scissor { @@ -1190,7 +1199,6 @@ public final class cc/polyfrost/oneconfig/utils/NetworkUtils { public final class cc/polyfrost/oneconfig/utils/TextUtils { public fun <init> ()V public static fun wrapText (JLjava/lang/String;FFLcc/polyfrost/oneconfig/renderer/font/Font;)Ljava/util/ArrayList; - public static fun wrapText (JLjava/lang/String;FFLcc/polyfrost/oneconfig/renderer/font/Fonts;)Ljava/util/ArrayList; } public class cc/polyfrost/oneconfig/utils/TickDelay { diff --git a/src/main/java/cc/polyfrost/oneconfig/gui/elements/text/TextInputField.java b/src/main/java/cc/polyfrost/oneconfig/gui/elements/text/TextInputField.java index 40463df..6b8ec6f 100644 --- a/src/main/java/cc/polyfrost/oneconfig/gui/elements/text/TextInputField.java +++ b/src/main/java/cc/polyfrost/oneconfig/gui/elements/text/TextInputField.java @@ -129,18 +129,18 @@ public class TextInputField extends BasicElement { float width; StringBuilder s = new StringBuilder(); if (multiLine) { - wrappedText = TextUtils.wrapText(vg, input, this.width - 24, 14f, Fonts.REGULAR.font); + wrappedText = TextUtils.wrapText(vg, input, this.width - 24, 14f, Fonts.REGULAR); lines = wrappedText.size(); if (!toggled) caretPos = wrappedText.get(wrappedText.size() - 1).length(); int caretLine = (int) MathUtils.clamp(getCaretLine(caretPos), 0, wrappedText.size() - 1); - width = RenderManager.getTextWidth(vg, wrappedText.get(caretLine).substring(0, getLineCaret(caretPos, caretLine)), 14f, Fonts.REGULAR.font); + width = RenderManager.getTextWidth(vg, wrappedText.get(caretLine).substring(0, getLineCaret(caretPos, caretLine)), 14f, Fonts.REGULAR); } else if (!password) { - width = RenderManager.getTextWidth(vg, input.substring(0, caretPos), 14f, Fonts.REGULAR.font); + width = RenderManager.getTextWidth(vg, input.substring(0, caretPos), 14f, Fonts.REGULAR); } else { for (int i = 0; i < input.length(); i++) { s.append("*"); } - width = RenderManager.getTextWidth(vg, s.substring(0, caretPos), 14f, Fonts.REGULAR.font); + width = RenderManager.getTextWidth(vg, s.substring(0, caretPos), 14f, Fonts.REGULAR); } if (hovered) { while (Platform.getMousePlatform().next()) { diff --git a/src/main/java/cc/polyfrost/oneconfig/gui/pages/ModsPage.java b/src/main/java/cc/polyfrost/oneconfig/gui/pages/ModsPage.java index 5f454f2..8a2e226 100644 --- a/src/main/java/cc/polyfrost/oneconfig/gui/pages/ModsPage.java +++ b/src/main/java/cc/polyfrost/oneconfig/gui/pages/ModsPage.java @@ -9,6 +9,7 @@ import cc.polyfrost.oneconfig.internal.assets.Colors; import cc.polyfrost.oneconfig.internal.config.OneConfigConfig; import cc.polyfrost.oneconfig.internal.config.core.ConfigCore; import cc.polyfrost.oneconfig.renderer.RenderManager; +import cc.polyfrost.oneconfig.renderer.TextRenderer; import cc.polyfrost.oneconfig.renderer.font.Fonts; import cc.polyfrost.oneconfig.utils.color.ColorPalette; diff --git a/src/main/java/cc/polyfrost/oneconfig/hud/TextHud.java b/src/main/java/cc/polyfrost/oneconfig/hud/TextHud.java index 381e0a8..8dd8ac3 100644 --- a/src/main/java/cc/polyfrost/oneconfig/hud/TextHud.java +++ b/src/main/java/cc/polyfrost/oneconfig/hud/TextHud.java @@ -103,7 +103,7 @@ public abstract class TextHud extends Hud { private class TickHandler { @Subscribe private void onTick(TickEvent event) { - if (event.stage != Stage.START) return; + if (event.stage != Stage.START || !isEnabled()) return; lines.clear(); if (!HudCore.editing) getLines(lines); else getExampleLines(lines); diff --git a/src/main/java/cc/polyfrost/oneconfig/renderer/RenderManager.java b/src/main/java/cc/polyfrost/oneconfig/renderer/RenderManager.java index 5869ffb..b747088 100644 --- a/src/main/java/cc/polyfrost/oneconfig/renderer/RenderManager.java +++ b/src/main/java/cc/polyfrost/oneconfig/renderer/RenderManager.java @@ -292,22 +292,6 @@ public final class RenderManager { * @param font The font. * @see cc.polyfrost.oneconfig.renderer.font.Font */ - public static void drawText(long vg, String text, float x, float y, int color, float size, Fonts font) { - drawText(vg, text, x, y, color, size, font.font); - } - - /** - * Draws a String with the given parameters. - * - * @param vg The NanoVG context. - * @param text The text. - * @param x The x position. - * @param y The y position. - * @param color The color. - * @param size The size. - * @param font The font. - * @see cc.polyfrost.oneconfig.renderer.font.Font - */ public static void drawText(long vg, String text, float x, float y, int color, float size, Font font) { nvgBeginPath(vg); nvgFontSize(vg, size); @@ -331,22 +315,6 @@ public final class RenderManager { * @param size The size. * @param font The font. */ - public static void drawWrappedString(long vg, String text, float x, float y, float width, int color, float size, Fonts font) { - drawWrappedString(vg, text, x, y, width, color, size, font.font); - } - - /** - * Draws a String wrapped at the given width, with the given parameters. - * - * @param vg The NanoVG context. - * @param text The text. - * @param x The x position. - * @param y The y position. - * @param width The width. - * @param color The color. - * @param size The size. - * @param font The font. - */ public static void drawWrappedString(long vg, String text, float x, float y, float width, int color, float size, Font font) { nvgBeginPath(vg); nvgFontSize(vg, size); @@ -366,18 +334,6 @@ public final class RenderManager { * @see RenderManager#drawText(long, String, float, float, int, float, Font) * @see InputUtils#isAreaClicked(int, int, int, int) */ - public static void drawURL(long vg, String url, float x, float y, float size, Fonts font) { - drawURL(vg, url, x, y, size, font.font); - } - - /** - * Draw a formatted URL (a string in blue with an underline) that when clicked, opens the given text. - * - * <p><b>This does NOT scale to Minecraft's GUI scale!</b></p> - * - * @see RenderManager#drawText(long, String, float, float, int, float, Font) - * @see InputUtils#isAreaClicked(int, int, int, int) - */ public static void drawURL(long vg, String url, float x, float y, float size, Font font) { drawText(vg, url, x, y, Colors.PRIMARY_500, size, font); float length = getTextWidth(vg, url, size, font); @@ -487,10 +443,6 @@ public final class RenderManager { drawRoundImage(vg, filePath.filePath, x, y, width, height, radius); } - public static float getTextWidth(long vg, String text, float fontSize, Fonts font) { - return getTextWidth(vg, text, fontSize, font.font); - } - /** * Get the width of the provided String. * diff --git a/src/main/java/cc/polyfrost/oneconfig/renderer/TextRenderer.java b/src/main/java/cc/polyfrost/oneconfig/renderer/TextRenderer.java new file mode 100644 index 0000000..95071d1 --- /dev/null +++ b/src/main/java/cc/polyfrost/oneconfig/renderer/TextRenderer.java @@ -0,0 +1,217 @@ +package cc.polyfrost.oneconfig.renderer; + +import cc.polyfrost.oneconfig.internal.assets.Colors; +import cc.polyfrost.oneconfig.renderer.font.Font; +import cc.polyfrost.oneconfig.utils.InputUtils; +import cc.polyfrost.oneconfig.utils.NetworkUtils; +import com.google.common.annotations.Beta; +import org.lwjgl.nanovg.NVGColor; + +import java.util.ArrayList; + +import static cc.polyfrost.oneconfig.renderer.RenderManager.color; +import static org.lwjgl.nanovg.NanoVG.*; + +public class TextRenderer { + /** + * Draws a String with the given parameters. + * + * @param vg The NanoVG context. + * @param text The text. + * @param x The x position. + * @param y The y position. + * @param color The color. + * @param size The size. + * @param font The font. + * @param letterSpacing The letter spacing + * @see cc.polyfrost.oneconfig.renderer.font.Font + */ + public static void drawText(long vg, String text, float x, float y, int color, float size, Font font, float letterSpacing) { + nvgBeginPath(vg); + nvgFontSize(vg, size); + nvgTextLetterSpacing(vg, letterSpacing); + nvgFontFace(vg, font.getName()); + nvgTextAlign(vg, NVG_ALIGN_LEFT | NVG_ALIGN_MIDDLE); + NVGColor nvgColor = color(vg, color); + nvgText(vg, x, y, text); + nvgFill(vg); + nvgColor.free(); + } + + /** + * Draws a String with the given parameters. + * + * @param vg The NanoVG context. + * @param text The text. + * @param x The x position. + * @param y The y position. + * @param color The color. + * @param size The size. + * @param font The font. + * @see cc.polyfrost.oneconfig.renderer.font.Font + */ + public static void drawText(long vg, String text, float x, float y, int color, float size, Font font) { + drawText(vg, text, x, y, color, size, font, 0); + } + + /** + * Draws a String with the given parameters. + * + * @param vg The NanoVG context. + * @param text The text. + * @param x The x position. + * @param y The y position. + * @param color The color. + * @param size The size. + * @param font The font. + * @param lineHeight The line height + * @param letterSpacing The letter spacing + * @see cc.polyfrost.oneconfig.renderer.font.Font + */ + public static void drawText(long vg, ArrayList<String> text, float x, float y, int color, float size, Font font, float lineHeight, float letterSpacing) { + float textY = y; + for (String line : text) { + drawText(vg, line, x, textY, color, size, font, letterSpacing); + textY += lineHeight; + } + } + + /** + * Draws a String with the given parameters. + * + * @param vg The NanoVG context. + * @param text The text. + * @param x The x position. + * @param y The y position. + * @param color The color. + * @param size The size. + * @param font The font. + * @param lineHeight The line height + * @see cc.polyfrost.oneconfig.renderer.font.Font + */ + public static void drawText(long vg, ArrayList<String> text, float x, float y, int color, float size, Font font, float lineHeight) { + drawText(vg, text, x, y, color, size, font, lineHeight, 0); + } + + /** + * Draws a String wrapped at the given width, with the given parameters. + * + * @param vg The NanoVG context. + * @param text The text. + * @param x The x position. + * @param y The y position. + * @param width The width. + * @param color The color. + * @param size The size. + * @param font The font. + */ + public static void drawWrappedString(long vg, String text, float x, float y, float width, int color, float size, Font font) { + nvgBeginPath(vg); + nvgFontSize(vg, size); + nvgFontFace(vg, font.getName()); + nvgTextAlign(vg, NVG_ALIGN_LEFT | NVG_ALIGN_MIDDLE); + NVGColor nvgColor = color(vg, color); + nvgTextBox(vg, x, y, width, text); + nvgFill(vg); + nvgColor.free(); + } + + /** + * Draw a formatted URL (a string in blue with an underline) that when clicked, opens the given text. + * + * <p><b>This does NOT scale to Minecraft's GUI scale!</b></p> + * + * @see RenderManager#drawText(long, String, float, float, int, float, Font) + * @see InputUtils#isAreaClicked(int, int, int, int) + */ + public static void drawURL(long vg, String url, float x, float y, float size, Font font) { + drawText(vg, url, x, y, Colors.PRIMARY_500, size, font); + float length = getTextWidth(vg, url, size, font); + RenderManager.drawRectangle(vg, x, y + size / 2, length, 1, Colors.PRIMARY_500); + if (InputUtils.isAreaClicked((int) (x - 2), (int) (y - 1), (int) (length + 4), (int) (size / 2 + 3))) { + NetworkUtils.browseLink(url); + } + } + + /** + * Get the width of the provided String. + * + * @param vg The NanoVG context. + * @param text The text. + * @param fontSize The font size. + * @param font The font. + * @param letterSpacing The letter spacing + * @return The width of the text. + */ + public static float getTextWidth(long vg, String text, float fontSize, Font font, float letterSpacing) { + float[] bounds = new float[4]; + nvgFontSize(vg, fontSize); + nvgTextLetterSpacing(vg, letterSpacing); + nvgFontFace(vg, font.getName()); + return nvgTextBounds(vg, 0, 0, text, bounds); + } + + /** + * Get the width of the provided String. + * + * @param vg The NanoVG context. + * @param text The text. + * @param fontSize The font size. + * @param font The font. + * @return The width of the text. + */ + public static float getTextWidth(long vg, String text, float fontSize, Font font) { + return getTextWidth(vg, text, fontSize, font, 0); + } + + /** + * Wraps a string into an array of lines. + * + * @param vg The NanoVG context. + * @param text The text to wrap. + * @param maxWidth The maximum width of each line. + * @param fontSize The font size. + * @param font The font to use. + * @param letterSpacing The letter spacing + * @return The array of lines. + */ + @Beta + public static ArrayList<String> wrapText(long vg, String text, float maxWidth, float fontSize, Font font, float letterSpacing) { + ArrayList<String> wrappedText = new ArrayList<>(); + text += " "; + int prevIndex = 0; + for (int i = text.indexOf(" "); i >= 0; i = text.indexOf(" ", i + 1)) { + String textPart = text.substring(0, i); + float textWidth = getTextWidth(vg, textPart, fontSize, font, letterSpacing); + if (textWidth < maxWidth) { + prevIndex = i; + continue; + } + wrappedText.add(text.substring(0, prevIndex) + " "); + wrappedText.addAll(wrapText(vg, text.substring(prevIndex + 1), maxWidth, fontSize, font, letterSpacing)); + break; + } + if (wrappedText.size() == 0) wrappedText.add(text); + String temp = wrappedText.get(wrappedText.size() - 1); + if (temp.length() != 0) { + wrappedText.remove(wrappedText.size() - 1); + wrappedText.add(temp.substring(0, temp.length() - 1)); + } + return wrappedText; + } + + /** + * Wraps a string into an array of lines. + * + * @param vg The NanoVG context. + * @param text The text to wrap. + * @param maxWidth The maximum width of each line. + * @param fontSize The font size. + * @param font The font to use. + * @return The array of lines. + */ + @Beta + public static ArrayList<String> wrapText(long vg, String text, float maxWidth, float fontSize, Font font) { + return wrapText(vg, text, maxWidth, fontSize, font, 0); + } +} diff --git a/src/main/java/cc/polyfrost/oneconfig/renderer/font/FontManager.java b/src/main/java/cc/polyfrost/oneconfig/renderer/font/FontManager.java index 388911d..79ac518 100644 --- a/src/main/java/cc/polyfrost/oneconfig/renderer/font/FontManager.java +++ b/src/main/java/cc/polyfrost/oneconfig/renderer/font/FontManager.java @@ -3,6 +3,7 @@ package cc.polyfrost.oneconfig.renderer.font; import cc.polyfrost.oneconfig.utils.IOUtils; import java.io.IOException; +import java.lang.reflect.Field; import java.nio.ByteBuffer; import static org.lwjgl.nanovg.NanoVG.nvgCreateFontMem; @@ -17,8 +18,15 @@ public class FontManager { */ public void initialize(long vg) { - for (Fonts fonts : Fonts.values()) { - loadFont(vg, fonts.font); + for (Field field : Fonts.class.getDeclaredFields()) { + try { + field.setAccessible(true); + Object font = field.get(null); + if (!(font instanceof Font)) continue; + loadFont(vg, (Font) font); + } catch (Exception e) { + throw new RuntimeException("Could not initialize fonts"); + } } } diff --git a/src/main/java/cc/polyfrost/oneconfig/renderer/font/Fonts.java b/src/main/java/cc/polyfrost/oneconfig/renderer/font/Fonts.java index 9b6193f..3120c7b 100644 --- a/src/main/java/cc/polyfrost/oneconfig/renderer/font/Fonts.java +++ b/src/main/java/cc/polyfrost/oneconfig/renderer/font/Fonts.java @@ -1,15 +1,10 @@ package cc.polyfrost.oneconfig.renderer.font; -public enum Fonts { - BOLD(new Font("inter-bold", "/assets/oneconfig/font/Bold.otf")), - SEMIBOLD(new Font("inter-semibold", "/assets/oneconfig/font/SemiBold.otf")), - MEDIUM(new Font("inter-medium", "/assets/oneconfig/font/Medium.otf")), - REGULAR(new Font("inter-regular", "/assets/oneconfig/font/Regular.otf")), - MINECRAFT_REGULAR(new Font("mc-regular", "/assets/oneconfig/font/Minecraft-Regular.otf")), - MINECRAFT_BOLD(new Font("mc-bold", "/assets/oneconfig/font/Minecraft-Bold.otf")); - public final Font font; - - Fonts(Font font) { - this.font = font; - } +public class Fonts { + public static final Font BOLD = new Font("inter-bold", "/assets/oneconfig/font/Bold.otf"); + public static final Font SEMIBOLD = new Font("inter-semibold", "/assets/oneconfig/font/SemiBold.otf"); + public static final Font MEDIUM = new Font("inter-medium", "/assets/oneconfig/font/Medium.otf"); + public static final Font REGULAR = new Font("inter-regular", "/assets/oneconfig/font/Regular.otf"); + public static final Font MINECRAFT_REGULAR = new Font("mc-regular", "/assets/oneconfig/font/Minecraft-Regular.otf"); + public static final Font MINECRAFT_BOLD = new Font("mc-bold", "/assets/oneconfig/font/Minecraft-Bold.otf"); } diff --git a/src/main/java/cc/polyfrost/oneconfig/utils/TextUtils.java b/src/main/java/cc/polyfrost/oneconfig/utils/TextUtils.java index 51b42d8..265e2f4 100644 --- a/src/main/java/cc/polyfrost/oneconfig/utils/TextUtils.java +++ b/src/main/java/cc/polyfrost/oneconfig/utils/TextUtils.java @@ -21,20 +21,6 @@ public final class TextUtils { * @param font The font to use. * @return The array of lines. */ - public static ArrayList<String> wrapText(long vg, String text, float maxWidth, float fontSize, Fonts font) { - return wrapText(vg, text, maxWidth, fontSize, font.font); - } - - /** - * Wraps a string into an array of lines. - * - * @param vg The NanoVG context. - * @param text The text to wrap. - * @param maxWidth The maximum width of each line. - * @param fontSize The font size. - * @param font The font to use. - * @return The array of lines. - */ public static ArrayList<String> wrapText(long vg, String text, float maxWidth, float fontSize, Font font) { ArrayList<String> wrappedText = new ArrayList<>(); text += " "; |