From 8648c4a41b6e17d599d892ef08dd3a3604b95c65 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Sun, 19 Jul 2026 01:01:33 +0300 Subject: [PATCH 01/42] added a 'padding' value to avoid 'magic numbers' (see comments) --- .../configlib/lib/gui/elements/ConfigGuiButton.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java index 8ad23524..67cfc509 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java @@ -15,6 +15,7 @@ public abstract class ConfigGuiButton implements ConfigUIElement { + protected static final int PADDING = 8; protected final Minecraft mc = Minecraft.getMinecraft(); protected final Field field; private final Method event; @@ -46,11 +47,11 @@ public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, in this.posX = drawX; this.posY = drawY; GuiUtil.drawBoxWithOutline(drawX, drawY, drawX + boxWidth, drawY + getHeight(), colorPalette.SETTING_BACKGROUND, colorPalette.SETTING_BACKGROUND_BORDER); - mc.fontRendererObj.drawStringWithShadow(annotation.name(), drawX + 8, drawY + 8, colorPalette.SETTING_NAME_TEXT); + mc.fontRendererObj.drawStringWithShadow(annotation.name(), drawX + PADDING, drawY + PADDING, colorPalette.SETTING_NAME_TEXT); if (hasComment) { - int commentY = drawY + 8 + mc.fontRendererObj.FONT_HEIGHT + 8; + int commentY = drawY + PADDING + mc.fontRendererObj.FONT_HEIGHT + 8; // '8' here represents the vertical space between name and comment (can be different from padding) for (final String line : commentToRender) { - mc.fontRendererObj.drawStringWithShadow(line, drawX + 8, commentY, colorPalette.SETTING_COMMENT_TEXT); + mc.fontRendererObj.drawStringWithShadow(line, drawX + PADDING, commentY, colorPalette.SETTING_COMMENT_TEXT); commentY += mc.fontRendererObj.FONT_HEIGHT; } } @@ -59,9 +60,9 @@ public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, in @Override public int getHeight() { if (hasComment) { - return 8 + mc.fontRendererObj.FONT_HEIGHT + 8 + mc.fontRendererObj.FONT_HEIGHT * commentToRender.size() + 8 - 1; + return PADDING + mc.fontRendererObj.FONT_HEIGHT + PADDING + mc.fontRendererObj.FONT_HEIGHT * commentToRender.size() + 8 - 1; // '8' here represents the vertical space between name and comment (can be different from padding) } - return 8 + mc.fontRendererObj.FONT_HEIGHT + 8 - 1; + return PADDING + mc.fontRendererObj.FONT_HEIGHT + PADDING - 1; } @Override @@ -94,5 +95,4 @@ protected void invokeConfigEvent() { protected void playPressSound() { this.mc.getSoundHandler().playSound(PositionedSoundRecord.create(new ResourceLocation("gui.button.press"), 1.0F)); } - } From 6ab5d072c4e0ac1baa90a8437109514430e21bca Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Sun, 19 Jul 2026 01:11:29 +0300 Subject: [PATCH 02/42] added a getLeftPadding method to give inheritors more control (mostly for custom elemenets) --- .../configlib/lib/gui/elements/ConfigGuiButton.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java index 67cfc509..d45c2acd 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java @@ -16,6 +16,7 @@ public abstract class ConfigGuiButton implements ConfigUIElement { protected static final int PADDING = 8; + protected final Minecraft mc = Minecraft.getMinecraft(); protected final Field field; private final Method event; @@ -47,11 +48,12 @@ public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, in this.posX = drawX; this.posY = drawY; GuiUtil.drawBoxWithOutline(drawX, drawY, drawX + boxWidth, drawY + getHeight(), colorPalette.SETTING_BACKGROUND, colorPalette.SETTING_BACKGROUND_BORDER); - mc.fontRendererObj.drawStringWithShadow(annotation.name(), drawX + PADDING, drawY + PADDING, colorPalette.SETTING_NAME_TEXT); + final int textX = drawX + getLeftPadding(); + mc.fontRendererObj.drawStringWithShadow(annotation.name(), textX, drawY + PADDING, colorPalette.SETTING_NAME_TEXT); if (hasComment) { int commentY = drawY + PADDING + mc.fontRendererObj.FONT_HEIGHT + 8; // '8' here represents the vertical space between name and comment (can be different from padding) for (final String line : commentToRender) { - mc.fontRendererObj.drawStringWithShadow(line, drawX + PADDING, commentY, colorPalette.SETTING_COMMENT_TEXT); + mc.fontRendererObj.drawStringWithShadow(line, textX, commentY, colorPalette.SETTING_COMMENT_TEXT); commentY += mc.fontRendererObj.FONT_HEIGHT; } } @@ -95,4 +97,6 @@ protected void invokeConfigEvent() { protected void playPressSound() { this.mc.getSoundHandler().playSound(PositionedSoundRecord.create(new ResourceLocation("gui.button.press"), 1.0F)); } + + protected int getLeftPadding() { return PADDING; } } From c2b48247e9d75cae3cda9fdc9d01c417f6ce2d80 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Sun, 19 Jul 2026 01:14:05 +0300 Subject: [PATCH 03/42] added an abstract method that each inheritor must implemenet, at this moment it is only used for 100% correct comment trimming --- .../configlib/lib/gui/elements/ConfigGuiButton.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java index d45c2acd..c6ebe835 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java @@ -33,11 +33,16 @@ protected ConfigGuiButton(Field field, Method event, ConfigProperty annotation) this.hasComment = !this.annotation.comment().isEmpty(); } + /** + * @return The distance between the left-most position of the content (button) and the right side of the rect + */ + protected abstract int getRightSideContentWidth(); + @Override public void setBoxWidth(int boxWidth) { this.boxWidth = boxWidth; if (hasComment) { - final int wrapWidth = boxWidth - mc.fontRendererObj.getStringWidth(" Disabled ") - 20 - 20; + final int wrapWidth = boxWidth - getLeftPadding() - getRightSideContentWidth() - 12; // 20 this.commentToRender.clear(); this.commentToRender.addAll(resizeCommentLines(annotation.comment(), wrapWidth, mc)); } From ab60fabf7ef2e71c3591fcf6ef91cd5291b4acb9 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Sun, 19 Jul 2026 01:18:25 +0300 Subject: [PATCH 04/42] added a helper method to get the width of a 'main button' --- .../alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java index c6ebe835..a93bc368 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java @@ -104,4 +104,8 @@ protected void playPressSound() { } protected int getLeftPadding() { return PADDING; } + + protected final int getMainButtonWidth() { + return mc.fontRendererObj.getStringWidth("Disabled") + 9; + } } From 386763e9d2716060b7319b5755a5378670f7b1b3 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Sun, 19 Jul 2026 01:21:58 +0300 Subject: [PATCH 05/42] added a helper method to get a 'main button' --- .../alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java index a93bc368..7a727298 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java @@ -105,6 +105,10 @@ protected void playPressSound() { protected int getLeftPadding() { return PADDING; } + protected final ClickGuiButton getMainButton(String text) { + return new ClickGuiButton(-1, 0, 0, getMainButtonWidth(), 20, text); + } + protected final int getMainButtonWidth() { return mc.fontRendererObj.getStringWidth("Disabled") + 9; } From 226cd81d9330bfc3412e0dc4152e67dec7eef5cb Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Sun, 19 Jul 2026 01:23:26 +0300 Subject: [PATCH 06/42] added a shared value for inheritors who use a 'main button' --- .../fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java index 7a727298..c605afd7 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java @@ -16,6 +16,7 @@ public abstract class ConfigGuiButton implements ConfigUIElement { protected static final int PADDING = 8; + protected static final int BUTTON_RIGHT_MARGIN = 20; protected final Minecraft mc = Minecraft.getMinecraft(); protected final Field field; From 72abc2949dda6eeb6a5fd2ec161b013256b82bad Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Sun, 19 Jul 2026 01:27:30 +0300 Subject: [PATCH 07/42] added a shared helper method to get 'boolean text' (enabled/disabled) --- .../alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java index c605afd7..64ced305 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java @@ -5,6 +5,7 @@ import fr.alexdoru.configlib.lib.gui.GuiUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; import java.lang.reflect.Field; @@ -113,4 +114,8 @@ protected final ClickGuiButton getMainButton(String text) { protected final int getMainButtonWidth() { return mc.fontRendererObj.getStringWidth("Disabled") + 9; } + + protected static String getBooleanText(boolean value) { + return value ? EnumChatFormatting.GREEN + "Enabled" : EnumChatFormatting.RED + "Disabled"; + } } From 5f19c98a8943e0240b6be3a1bb256e41d3845b10 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Sun, 19 Jul 2026 01:57:09 +0300 Subject: [PATCH 08/42] added a value for inheritors to use to position their content (buttons, etc...) --- .../alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java index 64ced305..7b1a2517 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java @@ -27,6 +27,7 @@ public abstract class ConfigGuiButton implements ConfigUIElement { protected final boolean hasComment; protected int boxWidth; protected int posX, posY; + protected int contentLeft; protected ConfigGuiButton(Field field, Method event, ConfigProperty annotation) { this.field = field; @@ -54,7 +55,9 @@ public void setBoxWidth(int boxWidth) { public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY) { this.posX = drawX; this.posY = drawY; - GuiUtil.drawBoxWithOutline(drawX, drawY, drawX + boxWidth, drawY + getHeight(), colorPalette.SETTING_BACKGROUND, colorPalette.SETTING_BACKGROUND_BORDER); + final int right = drawX + boxWidth; + this.contentLeft = right - getRightSideContentWidth(); + GuiUtil.drawBoxWithOutline(drawX, drawY, right, drawY + getHeight(), colorPalette.SETTING_BACKGROUND, colorPalette.SETTING_BACKGROUND_BORDER); final int textX = drawX + getLeftPadding(); mc.fontRendererObj.drawStringWithShadow(annotation.name(), textX, drawY + PADDING, colorPalette.SETTING_NAME_TEXT); if (hasComment) { From bc848ae227e18147cf9022f903b568ccb8109888 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Sun, 19 Jul 2026 02:19:15 +0300 Subject: [PATCH 09/42] fixed typo --- .../configlib/lib/gui/elements/SliderGuiButton.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java index ff200d35..bc0944c8 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java @@ -19,7 +19,7 @@ public class SliderGuiButton extends ConfigGuiButton { private int plusButtonX, plusButtonY; private int sliderIncrement; private final boolean isIntValue; - private boolean isPourcentage; + private boolean isPercentage; private final int minValue, maxValue; private int sliderValueI; private double sliderValueD; @@ -38,7 +38,7 @@ public SliderGuiButton(Field field, Method event, ConfigProperty annotation) thr isIntValue = false; sliderValueD = (double) field.get(null); if (minValue == 0 && maxValue == 1) { - isPourcentage = true; + isPercentage = true; sliderValueI = (int) ((double) field.get(null) * 100d); sliderIncrement = MathHelper.clamp_int((SLIDER_WIDTH - 1) * (sliderValueI) / 100, 0, SLIDER_WIDTH - 1); } else { @@ -87,7 +87,7 @@ public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, in if (isIntValue) { valueText = String.valueOf(sliderValueI); } else { - if (isPourcentage) { + if (isPercentage) { valueText = MathHelper.floor_double(sliderValueI) + "%"; } else { valueText = String.format("%.2f", sliderValueD); @@ -143,7 +143,7 @@ private void updateSliderFromPosition(int sliderIncrementIn) { if (prevValue != sliderValueI) { invokeConfigEvent(); } - } else if (isPourcentage) { + } else if (isPercentage) { final int prevValue = sliderValueI; sliderValueI = MathHelper.clamp_int(sliderIncrement * 100 / (SLIDER_WIDTH - 1), 0, 100); field.setDouble(null, MathHelper.clamp_double(sliderValueI / 100d, 0, 1)); @@ -170,7 +170,7 @@ public void updateSliderFromIncrement(int valueIncrement) { sliderValueI = MathHelper.clamp_int(sliderValueI + valueIncrement, minValue, maxValue); sliderIncrement = MathHelper.clamp_int((SLIDER_WIDTH - 1) * (sliderValueI - minValue) / (maxValue - minValue), 0, SLIDER_WIDTH - 1); field.setInt(null, sliderValueI); - } else if (isPourcentage) { + } else if (isPercentage) { sliderValueI = MathHelper.clamp_int(sliderValueI + valueIncrement, 0, 100); sliderIncrement = MathHelper.clamp_int((SLIDER_WIDTH - 1) * sliderValueI / (100), 0, SLIDER_WIDTH - 1); field.setDouble(null, MathHelper.clamp_double(sliderValueI / 100d, 0, 1)); From 59aec131b7247160f36b7a04cdd7915a9b77c440 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Sun, 19 Jul 2026 03:08:03 +0300 Subject: [PATCH 10/42] updated to use the new methods and values, implement 'getRightSideContentWidth' and so fixed comment trimming for all --- .../lib/gui/elements/BooleanGuiButton.java | 19 +++++++------- .../lib/gui/elements/ColorEnumGuiButton.java | 5 ++-- .../lib/gui/elements/ColorGuiButton.java | 18 +++++++------ .../lib/gui/elements/EnumGuiButton.java | 11 +++++--- .../lib/gui/elements/RendererGuiButton.java | 25 +++++++++---------- .../lib/gui/elements/SliderGuiButton.java | 21 ++++++++-------- 6 files changed, 53 insertions(+), 46 deletions(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/BooleanGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/BooleanGuiButton.java index 4fb5b0f4..b61e711b 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/BooleanGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/BooleanGuiButton.java @@ -2,7 +2,6 @@ import fr.alexdoru.configlib.api.ColorPalette; import fr.alexdoru.configlib.api.ConfigProperty; -import net.minecraft.util.EnumChatFormatting; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -15,14 +14,19 @@ public class BooleanGuiButton extends ConfigGuiButton { public BooleanGuiButton(Field field, Method event, ConfigProperty annotation) throws IllegalAccessException { super(field, event, annotation); this.toggled = (boolean) this.field.get(null); - this.button = new ClickGuiButton(0, 0, 0, mc.fontRendererObj.getStringWidth(" Disabled "), 20, getButtonText()); + this.button = getMainButton(getBooleanText(toggled)); + } + + @Override + protected int getRightSideContentWidth() { + return button.width + BUTTON_RIGHT_MARGIN; } @Override public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY) { super.draw(colorPalette, drawX, drawY, mouseX, mouseY); - button.xPosition = drawX + boxWidth - button.width - 20; - button.yPosition = drawY + (hasComment ? 8 + mc.fontRendererObj.FONT_HEIGHT / 2 : (getHeight() - button.height) / 2); + button.xPosition = contentLeft; + button.yPosition = drawY + (hasComment ? PADDING + mc.fontRendererObj.FONT_HEIGHT / 2 : (getHeight() - button.height) / 2); button.drawButton(colorPalette, mc, mouseX, mouseY); } @@ -30,7 +34,7 @@ public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, in public boolean mouseClicked(int mouseX, int mouseY, int mouseButton) throws IllegalAccessException { if (mouseButton == 0 && button.mousePressed(mc, mouseX, mouseY)) { flipBooleanConfig(); - button.displayString = getButtonText(); + button.displayString = getBooleanText(toggled); button.playPressSound(mc.getSoundHandler()); return true; } @@ -42,9 +46,4 @@ private void flipBooleanConfig() throws IllegalAccessException { toggled = (boolean) this.field.get(null); invokeConfigEvent(); } - - private String getButtonText() { - return toggled ? EnumChatFormatting.GREEN + "Enabled" : EnumChatFormatting.RED + "Disabled"; - } - } diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorEnumGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorEnumGuiButton.java index dc341a0a..2509be97 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorEnumGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorEnumGuiButton.java @@ -20,9 +20,10 @@ public ColorEnumGuiButton(Field field, Method event, ConfigProperty annotation) @Override public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY) { super.draw(colorPalette, drawX, drawY, mouseX, mouseY); - final int left = this.button.xPosition - 20 - 1; + final int colorBoxSize = button.height; + final int left = this.button.xPosition - colorBoxSize - 1; final int top = this.button.yPosition; - GuiUtil.drawBoxWithOutline(left, top, left + 20, top + 20, 255 << 24 | color, colorPalette.COLOR_BUTTON_INDICATOR_BORDER); + GuiUtil.drawBoxWithOutline(left, top, left + colorBoxSize, top + colorBoxSize, 255 << 24 | color, colorPalette.COLOR_BUTTON_INDICATOR_BORDER); } @Override diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorGuiButton.java index 6393822b..a76babf0 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorGuiButton.java @@ -20,18 +20,23 @@ public ColorGuiButton(ConfigGuiScreen configGuiScreen, Field field, ConfigProper this.parentScreen = configGuiScreen; this.color = (int) this.field.get(null); this.defaultColor = defaultColor; - this.button = new ClickGuiButton(0, 0, 0, mc.fontRendererObj.getStringWidth(" Disabled "), 20, "Change"); + this.button = getMainButton("Change"); + } + + @Override + protected int getRightSideContentWidth() { + return button.width + BUTTON_RIGHT_MARGIN + button.height /* color box width */ + 1; } @Override public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY) { super.draw(colorPalette, drawX, drawY, mouseX, mouseY); - button.xPosition = drawX + boxWidth - button.width - 20; - button.yPosition = drawY + (hasComment ? 8 + mc.fontRendererObj.FONT_HEIGHT / 2 : (getHeight() - button.height) / 2); + final int top = drawY + (hasComment ? PADDING + mc.fontRendererObj.FONT_HEIGHT / 2 : (getHeight() - button.height) / 2); + final int colorBoxSize = button.height; + GuiUtil.drawBoxWithOutline(contentLeft, top, contentLeft + colorBoxSize, top + colorBoxSize, 255 << 24 | color, colorPalette.COLOR_BUTTON_INDICATOR_BORDER); + button.xPosition = contentLeft + colorBoxSize + 1; + button.yPosition = top; button.drawButton(colorPalette, mc, mouseX, mouseY); - final int left = button.xPosition - 20 - 1; - final int top = button.yPosition; - GuiUtil.drawBoxWithOutline(left, top, left + 20, top + 20, 255 << 24 | color, colorPalette.COLOR_BUTTON_INDICATOR_BORDER); } @Override @@ -43,5 +48,4 @@ public boolean mouseClicked(int mouseX, int mouseY, int mouseButton) throws Ille } return false; } - } diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/EnumGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/EnumGuiButton.java index d8eccb31..e7ef796b 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/EnumGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/EnumGuiButton.java @@ -23,17 +23,22 @@ public EnumGuiButton(Field field, Method event, ConfigProperty annotation) throw } int width = 0; for (final Enum e : values) { - width = Math.max(width, mc.fontRendererObj.getStringWidth(" " + e.name())); + width = Math.max(width, mc.fontRendererObj.getStringWidth(e.name()) + 9); } this.button = new ClickGuiButton(0, 0, 0, width, 20, ""); this.setValue((Enum) this.field.get(null)); } + @Override + protected int getRightSideContentWidth() { + return button.width + BUTTON_RIGHT_MARGIN; + } + @Override public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY) { super.draw(colorPalette, drawX, drawY, mouseX, mouseY); - button.xPosition = drawX + boxWidth - button.width - 20; - button.yPosition = drawY + (hasComment ? 8 + mc.fontRendererObj.FONT_HEIGHT / 2 : (getHeight() - button.height) / 2); + button.xPosition = contentLeft; + button.yPosition = drawY + (hasComment ? PADDING + mc.fontRendererObj.FONT_HEIGHT / 2 : (getHeight() - button.height) / 2); button.drawButton(colorPalette, mc, mouseX, mouseY); } diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/RendererGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/RendererGuiButton.java index 88f170d5..4848a932 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/RendererGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/RendererGuiButton.java @@ -9,7 +9,6 @@ import fr.alexdoru.configlib.lib.gui.RendererEditGuiScreen; import net.minecraft.client.gui.Gui; import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; @@ -40,22 +39,27 @@ public RendererGuiButton( this.rendererManager = rendererManager; this.rendererPosition = ((RendererPosition) field.get(null)); this.toggled = this.rendererPosition.isEnabled(); - this.buttonEnabled = new ClickGuiButton(0, 0, 0, mc.fontRendererObj.getStringWidth(" Disabled "), 20, getButtonText()); + this.buttonEnabled = getMainButton(getBooleanText(toggled)); this.buttonMoveHud = new ClickGuiButton(0, 0, 0, 20, 20, ""); this.buttonResetPos = new ClickGuiButton(0, 0, 0, 20, 20, ""); } + @Override + protected int getRightSideContentWidth() { + return buttonEnabled.width + BUTTON_RIGHT_MARGIN; + } + @Override public void setBoxWidth(int boxWidth) { - super.setBoxWidth(boxWidth - mc.fontRendererObj.getStringWidth("Reset Position") - 10); + super.setBoxWidth(boxWidth - mc.fontRendererObj.getStringWidth("Reset Position")); this.boxWidth = boxWidth; } @Override public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY) { super.draw(colorPalette, drawX, drawY, mouseX, mouseY); - buttonEnabled.xPosition = drawX + boxWidth - buttonEnabled.width - 20; - buttonEnabled.yPosition = drawY + 8; + buttonEnabled.xPosition = contentLeft; + buttonEnabled.yPosition = drawY + PADDING; buttonEnabled.drawButton(colorPalette, mc, mouseX, mouseY); buttonMoveHud.xPosition = buttonEnabled.xPosition; buttonMoveHud.yPosition = buttonEnabled.yPosition + buttonEnabled.height + 1; @@ -82,7 +86,7 @@ public boolean mouseClicked(int mouseX, int mouseY, int mouseButton) { if (mouseButton == 0) { if (buttonEnabled.mousePressed(mc, mouseX, mouseY)) { flipBooleanConfig(); - buttonEnabled.displayString = getButtonText(); + buttonEnabled.displayString = getBooleanText(toggled); buttonEnabled.playPressSound(mc.getSoundHandler()); return true; } else if (buttonMoveHud.mousePressed(mc, mouseX, mouseY)) { @@ -105,7 +109,7 @@ public boolean mouseClicked(int mouseX, int mouseY, int mouseButton) { @Override public int getHeight() { - return Math.max(super.getHeight(), 8 + buttonEnabled.height + 1 + buttonMoveHud.height + 8 - 1); + return Math.max(super.getHeight(), PADDING + buttonEnabled.height + 1 + buttonMoveHud.height + PADDING - 1); } private void drawIcon(ResourceLocation icon, int drawX, int drawY) { @@ -116,7 +120,7 @@ private void drawIcon(ResourceLocation icon, int drawX, int drawY) { GlStateManager.enableBlend(); GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0); GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - parentScreen.mc.getTextureManager().bindTexture(icon); + mc.getTextureManager().bindTexture(icon); GlStateManager.color(1, 1, 1); Gui.drawModalRectWithCustomSizedTexture(drawX, drawY, 0f, 0f, 14, 14, 14f, 14f); GlStateManager.popMatrix(); @@ -127,9 +131,4 @@ private void flipBooleanConfig() { toggled = rendererPosition.isEnabled(); invokeConfigEvent(); } - - private String getButtonText() { - return toggled ? EnumChatFormatting.GREEN + "Enabled" : EnumChatFormatting.RED + "Disabled"; - } - } diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java index bc0944c8..9eeba155 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java @@ -51,9 +51,8 @@ public SliderGuiButton(Field field, Method event, ConfigProperty annotation) thr } @Override - public void setBoxWidth(int boxWidth) { - super.setBoxWidth(boxWidth - 60); - this.boxWidth = boxWidth; + protected int getRightSideContentWidth() { + return (PLUS_BUTTON_SIZE + SLIDER_BUTTON_SIZE / 2 + 1) * 2 + SLIDER_WIDTH + 6; } @Override @@ -63,14 +62,15 @@ public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, in updateSliderFromPosition(mouseX - sliderBarX); } final int SLIDER_HEIGHT = 6; - sliderBarX = drawX + boxWidth - SLIDER_WIDTH - 20; - final int sliderBarY = drawY + 8 + mc.fontRendererObj.FONT_HEIGHT; - sliderButtonX = sliderBarX + sliderIncrement - SLIDER_BUTTON_SIZE / 2; + final int HALF_SLIDER_BUTTON_SIZE = SLIDER_BUTTON_SIZE / 2; + sliderBarX = contentLeft + PLUS_BUTTON_SIZE + HALF_SLIDER_BUTTON_SIZE + 1; + final int sliderBarY = drawY + PADDING + mc.fontRendererObj.FONT_HEIGHT; + sliderButtonX = sliderBarX + sliderIncrement - HALF_SLIDER_BUTTON_SIZE; sliderButtonY = sliderBarY + (SLIDER_HEIGHT - SLIDER_BUTTON_SIZE) / 2; - minusButtonX = sliderBarX - SLIDER_BUTTON_SIZE / 2 - PLUS_BUTTON_SIZE - 1; + minusButtonX = contentLeft; minusButtonY = sliderBarY + (SLIDER_HEIGHT - PLUS_BUTTON_SIZE) / 2; - plusButtonX = sliderBarX + SLIDER_WIDTH + SLIDER_BUTTON_SIZE / 2; - plusButtonY = sliderBarY + (SLIDER_HEIGHT - PLUS_BUTTON_SIZE) / 2; + plusButtonX = sliderBarX + SLIDER_WIDTH + HALF_SLIDER_BUTTON_SIZE + 1; + plusButtonY = minusButtonY; GuiUtil.drawBoxWithOutline(sliderBarX, sliderBarY, sliderBarX + SLIDER_WIDTH, sliderBarY + SLIDER_HEIGHT, colorPalette.SLIDER_BUTTON_TRACK, colorPalette.SLIDER_BUTTON_TRACK_BORDER); final boolean silderHovered = isMouseOnButton(mouseX, mouseY, sliderButtonX, sliderButtonY, SLIDER_BUTTON_SIZE, SLIDER_BUTTON_SIZE); final int sliderColor = silderHovered ? GuiUtil.brightenColor(colorPalette.SLIDER_BUTTON_THUMB, 0.12f) : colorPalette.SLIDER_BUTTON_THUMB; @@ -100,7 +100,7 @@ public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, in @Override public int getHeight() { - return Math.max(super.getHeight(), 8 + mc.fontRendererObj.FONT_HEIGHT + SLIDER_BUTTON_SIZE + 8); + return Math.max(super.getHeight(), PADDING + mc.fontRendererObj.FONT_HEIGHT + SLIDER_BUTTON_SIZE + PADDING); } @Override @@ -184,5 +184,4 @@ public void updateSliderFromIncrement(int valueIncrement) { } invokeConfigEvent(); } - } From 0d7eac3b27677b2441a92fa6f0d612a273901699 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Sun, 19 Jul 2026 03:14:03 +0300 Subject: [PATCH 11/42] fill in track before slider button for better ui --- .../alexdoru/configlib/lib/gui/elements/SliderGuiButton.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java index 9eeba155..f4631452 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java @@ -3,6 +3,7 @@ import fr.alexdoru.configlib.api.ColorPalette; import fr.alexdoru.configlib.api.ConfigProperty; import fr.alexdoru.configlib.lib.gui.GuiUtil; +import net.minecraft.client.gui.Gui; import net.minecraft.util.MathHelper; import java.lang.reflect.Field; @@ -74,6 +75,10 @@ public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, in GuiUtil.drawBoxWithOutline(sliderBarX, sliderBarY, sliderBarX + SLIDER_WIDTH, sliderBarY + SLIDER_HEIGHT, colorPalette.SLIDER_BUTTON_TRACK, colorPalette.SLIDER_BUTTON_TRACK_BORDER); final boolean silderHovered = isMouseOnButton(mouseX, mouseY, sliderButtonX, sliderButtonY, SLIDER_BUTTON_SIZE, SLIDER_BUTTON_SIZE); final int sliderColor = silderHovered ? GuiUtil.brightenColor(colorPalette.SLIDER_BUTTON_THUMB, 0.12f) : colorPalette.SLIDER_BUTTON_THUMB; + if (sliderButtonX > (sliderBarX + 1)) { + final int top = sliderBarY + 1; + Gui.drawRect(sliderBarX + 1, top, sliderButtonX, top + SLIDER_HEIGHT - 2, sliderColor); + } GuiUtil.drawBoxWithOutline(sliderButtonX, sliderButtonY, sliderButtonX + SLIDER_BUTTON_SIZE, sliderButtonY + SLIDER_BUTTON_SIZE, sliderColor, colorPalette.SLIDER_BUTTON_THUMB_BORDER); final boolean isMinusHovered = isMouseOnButton(mouseX, mouseY, minusButtonX, minusButtonY, PLUS_BUTTON_SIZE, PLUS_BUTTON_SIZE); final int minusColor = isMinusHovered ? GuiUtil.brightenColor(colorPalette.SLIDER_BUTTON_PLUS_BACKGROUND, 0.12f) : colorPalette.SLIDER_BUTTON_PLUS_BACKGROUND; From 354bb1d1f4d15b99186fdb92986c12c600a11438 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Sun, 19 Jul 2026 03:16:36 +0300 Subject: [PATCH 12/42] shortened the vertical distance between property name and commet start --- .../alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java index 7b1a2517..597c204c 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java @@ -61,7 +61,7 @@ public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, in final int textX = drawX + getLeftPadding(); mc.fontRendererObj.drawStringWithShadow(annotation.name(), textX, drawY + PADDING, colorPalette.SETTING_NAME_TEXT); if (hasComment) { - int commentY = drawY + PADDING + mc.fontRendererObj.FONT_HEIGHT + 8; // '8' here represents the vertical space between name and comment (can be different from padding) + int commentY = drawY + PADDING + mc.fontRendererObj.FONT_HEIGHT + 6; // '6' here represents the vertical space between name and comment for (final String line : commentToRender) { mc.fontRendererObj.drawStringWithShadow(line, textX, commentY, colorPalette.SETTING_COMMENT_TEXT); commentY += mc.fontRendererObj.FONT_HEIGHT; @@ -72,7 +72,7 @@ public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, in @Override public int getHeight() { if (hasComment) { - return PADDING + mc.fontRendererObj.FONT_HEIGHT + PADDING + mc.fontRendererObj.FONT_HEIGHT * commentToRender.size() + 8 - 1; // '8' here represents the vertical space between name and comment (can be different from padding) + return PADDING + mc.fontRendererObj.FONT_HEIGHT + PADDING + mc.fontRendererObj.FONT_HEIGHT * commentToRender.size() + 6 - 1; // '6' here represents the vertical space between name and comment } return PADDING + mc.fontRendererObj.FONT_HEIGHT + PADDING - 1; } From 712b17cff0a62b080d33a2555c9d7f6af85e13a9 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Sun, 19 Jul 2026 04:02:40 +0300 Subject: [PATCH 13/42] fixed a mistake where i added 1px to plusButtonX --- .../alexdoru/configlib/lib/gui/elements/SliderGuiButton.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java index f4631452..7a0a3da8 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java @@ -53,7 +53,7 @@ public SliderGuiButton(Field field, Method event, ConfigProperty annotation) thr @Override protected int getRightSideContentWidth() { - return (PLUS_BUTTON_SIZE + SLIDER_BUTTON_SIZE / 2 + 1) * 2 + SLIDER_WIDTH + 6; + return (PLUS_BUTTON_SIZE + SLIDER_BUTTON_SIZE / 2) * 2 + 1 + SLIDER_WIDTH + 6; } @Override @@ -70,7 +70,7 @@ public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, in sliderButtonY = sliderBarY + (SLIDER_HEIGHT - SLIDER_BUTTON_SIZE) / 2; minusButtonX = contentLeft; minusButtonY = sliderBarY + (SLIDER_HEIGHT - PLUS_BUTTON_SIZE) / 2; - plusButtonX = sliderBarX + SLIDER_WIDTH + HALF_SLIDER_BUTTON_SIZE + 1; + plusButtonX = sliderBarX + SLIDER_WIDTH + HALF_SLIDER_BUTTON_SIZE; plusButtonY = minusButtonY; GuiUtil.drawBoxWithOutline(sliderBarX, sliderBarY, sliderBarX + SLIDER_WIDTH, sliderBarY + SLIDER_HEIGHT, colorPalette.SLIDER_BUTTON_TRACK, colorPalette.SLIDER_BUTTON_TRACK_BORDER); final boolean silderHovered = isMouseOnButton(mouseX, mouseY, sliderButtonX, sliderButtonY, SLIDER_BUTTON_SIZE, SLIDER_BUTTON_SIZE); From 3188b94da1bee0dc23784dcc9df7dba28bcbe68b Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Sun, 26 Jul 2026 04:12:42 +0300 Subject: [PATCH 14/42] it is better to use 'mousePressed' in clicks event --- .../alexdoru/configlib/lib/gui/elements/ColorEnumGuiButton.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorEnumGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorEnumGuiButton.java index 07f3099f..6a518e73 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorEnumGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorEnumGuiButton.java @@ -94,7 +94,7 @@ public boolean mouseClicked(int mouseX, int mouseY, MouseButton mouseButton) thr if (isOverlayOpen) { if (panelBox.isMouseInBox(mouseX, mouseY)) { for (final ColorSquareButton colorButton : this.colorButtons) { - if (colorButton.isMouseOver()) { + if (colorButton.mousePressed(mc, mouseX, mouseY)) { button.playPressSound(mc.getSoundHandler()); this.setNewValue(colorButton.color); return true; From 08abb7d325e3ffc7a337d055cc514d9f6e4226d6 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Mon, 27 Jul 2026 20:04:33 +0300 Subject: [PATCH 15/42] use generics for cleaner code --- .../alexdoru/configlib/lib/ConfigFieldContainer.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/ConfigFieldContainer.java b/src/configlib/java/fr/alexdoru/configlib/lib/ConfigFieldContainer.java index 2ce2a246..3acc8236 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/ConfigFieldContainer.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/ConfigFieldContainer.java @@ -158,9 +158,9 @@ private void loadConfigValueToField() throws IllegalAccessException { break; } case ENUM_COLOR: { - EnumChatFormatting value = (EnumChatFormatting) this.getEnumValue(this.getProp().getString()); + EnumChatFormatting value = this.getEnumValue(this.getProp().getString()); if (value == null || !value.isColor()) { - value = (EnumChatFormatting) this.getEnumValue(this.getProp().getDefault()); + value = this.getEnumValue(this.getProp().getDefault()); } field.set(null, value); break; @@ -294,13 +294,13 @@ public ConfigProperty getAnnotation() { } @Nullable - private Enum getEnumValue(@NotNull String valueName) { + private > T getEnumValue(@NotNull String valueName) { if (!Enum.class.isAssignableFrom(field.getType())) { throw new IllegalArgumentException(); } try { - //noinspection rawtypes,unchecked - return Enum.valueOf((Class) field.getType(), valueName); + //noinspection unchecked + return Enum.valueOf((Class) field.getType(), valueName); } catch (IllegalArgumentException ignored) {} return null; } From dd1f5b0dcc5b3fe76713d91501c63bdce5cb8da9 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Mon, 27 Jul 2026 20:05:20 +0300 Subject: [PATCH 16/42] send default color to button --- .../java/fr/alexdoru/configlib/lib/ConfigFieldContainer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/ConfigFieldContainer.java b/src/configlib/java/fr/alexdoru/configlib/lib/ConfigFieldContainer.java index 3acc8236..ce1a15bf 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/ConfigFieldContainer.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/ConfigFieldContainer.java @@ -280,7 +280,8 @@ public ConfigUIElement getConfigButton(ConfigGuiScreen configGuiScreen, Renderer } } case ENUM_COLOR: { - return new ColorEnumGuiButton(configGuiScreen, field, event, annotation); + final EnumChatFormatting defaultColor = getEnumValue(this.getProp().getDefault()); + return new ColorEnumGuiButton(configGuiScreen, field, event, annotation, defaultColor); } case ENUM: { return new EnumGuiButton(field, event, annotation); From 8d0538441d71957708f0f28683aacb56f2960270 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Mon, 27 Jul 2026 20:06:45 +0300 Subject: [PATCH 17/42] added margins --- .../fr/alexdoru/configlib/lib/gui/elements/SizedElement.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SizedElement.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SizedElement.java index 66666de8..7c045479 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SizedElement.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SizedElement.java @@ -4,4 +4,7 @@ public interface SizedElement { int getHeight(); + default int getTopMargin() { return 2; } + + default int getBottomMargin() { return 2; } } From f539076ee9e4a29bfe20ac8814b1b6d1725f68e9 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Mon, 27 Jul 2026 20:08:02 +0300 Subject: [PATCH 18/42] added hovering text lines getter to allow ui elements to render hovering text over the screen --- .../fr/alexdoru/configlib/lib/gui/elements/ConfigUIElement.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigUIElement.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigUIElement.java index 2f56a751..cf1b50ff 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigUIElement.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigUIElement.java @@ -41,4 +41,5 @@ default List resizeCommentLines(String comment, int wrapWidth, Minecraft } } + default List getHoveringTextLines() { return null; } } From 5c3ba16a23d257688fc4ee6dff2bb0a7ae1751b3 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Mon, 27 Jul 2026 20:12:27 +0300 Subject: [PATCH 19/42] modified method to accept a boolean to fix bug where elements appear hovered when the mouse isn't "visually over them". example: mouse is outside config box and over the invisible portion of a partially visible button --- .../fr/alexdoru/configlib/lib/gui/elements/ConfigUIElement.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigUIElement.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigUIElement.java index cf1b50ff..77fabd73 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigUIElement.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigUIElement.java @@ -12,7 +12,7 @@ public interface ConfigUIElement extends SizedElement { void setBoxWidth(int boxWidth); - void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY); + void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY, boolean canMouseBeVisuallyOverElement); boolean mouseClicked(int mouseX, int mouseY, MouseButton mouseButton) throws IllegalAccessException; From ad3d7657162cc21800ab0df131b80ff535e0cc14 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Mon, 27 Jul 2026 20:16:08 +0300 Subject: [PATCH 20/42] modified to use added functionalities and slightly changed the gap between header and comment --- .../configlib/lib/gui/elements/CategoryHeader.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/CategoryHeader.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/CategoryHeader.java index d5db2620..63ce6e78 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/CategoryHeader.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/CategoryHeader.java @@ -11,6 +11,8 @@ public class CategoryHeader implements ConfigUIElement { + private static final int COMMENT_TOP_MARGIN = 4; + private final Minecraft mc = Minecraft.getMinecraft(); private final String name; private final String displayname; @@ -44,7 +46,7 @@ public void setBoxWidth(int boxWidth) { } @Override - public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY) { + public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY, boolean canMouseBeVisuallyOverElement) { final int textX = drawX + (boxWidth - mc.fontRendererObj.getStringWidth(displayname) * 2) / 2; GlStateManager.translate(textX, drawY, 0); GlStateManager.scale(2, 2, 2); @@ -52,7 +54,7 @@ public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, in GlStateManager.scale(0.5, 0.5, 0.5); GlStateManager.translate(-textX, -drawY, 0); if (hasComment) { - int commentY = drawY + mc.fontRendererObj.FONT_HEIGHT * 2 + 8; + int commentY = drawY + mc.fontRendererObj.FONT_HEIGHT * 2 + COMMENT_TOP_MARGIN; for (final String line : commentToRender) { final int lineX = drawX + (boxWidth - mc.fontRendererObj.getStringWidth(line)) / 2; mc.fontRendererObj.drawStringWithShadow(line, lineX, commentY, colorPalette.CATEGORY_HEADER_COMMENT_TEXT); @@ -69,9 +71,9 @@ public boolean mouseClicked(int mouseX, int mouseY, MouseButton mouseButton) { @Override public int getHeight() { if (hasComment) { - return mc.fontRendererObj.FONT_HEIGHT * 2 + 8 + mc.fontRendererObj.FONT_HEIGHT * commentToRender.size() + 8; + return mc.fontRendererObj.FONT_HEIGHT * 2 + COMMENT_TOP_MARGIN + mc.fontRendererObj.FONT_HEIGHT * commentToRender.size(); } - return mc.fontRendererObj.FONT_HEIGHT * 2 + 8; + return mc.fontRendererObj.FONT_HEIGHT * 2; } @Override @@ -89,4 +91,8 @@ public boolean matchSearch(String search) { return false; } + @Override + public int getBottomMargin() { + return 8; + } } From 5d2536c9739a18f1b52d3686268b7845db6efe41 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Mon, 27 Jul 2026 20:17:22 +0300 Subject: [PATCH 21/42] updated to use declared margin values --- .../alexdoru/configlib/lib/gui/elements/CategoryGuiButton.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/CategoryGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/CategoryGuiButton.java index c3ed76c8..b2734179 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/CategoryGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/CategoryGuiButton.java @@ -41,8 +41,7 @@ public boolean mouseClicked(int mouseX, int mouseY, MouseButton mouseButton) { } private boolean isMouseHovering(int mouseX, int mouseY) { - final int extraY = ConfigGuiScreen.ELEMENT_GAP / 2; - return mouseX >= posX && mouseY >= posY - extraY && mouseX < posX + getWidth() && mouseY < posY + extraY + getHeight(); + return mouseX >= posX && mouseY >= posY - getTopMargin() && mouseX < posX + getWidth() && mouseY < posY + getHeight() + getBottomMargin(); } public int getWidth() { From 0c3dcaa3fc64659c9c6192ba689f60aaad0cf0ec Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Mon, 27 Jul 2026 20:19:30 +0300 Subject: [PATCH 22/42] modified to fix bug where buttons appear hovered when they aren't meant to be --- .../alexdoru/configlib/lib/gui/elements/ClickGuiButton.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ClickGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ClickGuiButton.java index 39c44a41..6e5ef3e6 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ClickGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ClickGuiButton.java @@ -35,7 +35,11 @@ public void setTexture(ResourceLocation texture) { } public void drawButton(ColorPalette colorPalette, Minecraft mc, int mouseX, int mouseY) { - this.hovered = this.visible && mouseX >= this.xPosition && mouseY >= this.yPosition && mouseX < this.xPosition + this.width && mouseY < this.yPosition + this.height; + drawButton(colorPalette, mc, mouseX, mouseY, true); + } + + public void drawButton(ColorPalette colorPalette, Minecraft mc, int mouseX, int mouseY, boolean canMouseBeVisuallyOverElement) { + this.hovered = canMouseBeVisuallyOverElement && this.visible && mouseX >= this.xPosition && mouseY >= this.yPosition && mouseX < this.xPosition + this.width && mouseY < this.yPosition + this.height; if (this.visible) { this.mouseDragged(mc, mouseX, mouseY); GuiUtil.drawBoxWithOutline( From adc9bdf466db4061dd9c86483e7d4260696287e7 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Mon, 27 Jul 2026 20:22:23 +0300 Subject: [PATCH 23/42] added to variables to help rendering. these variables are important and must be set by inheritors correctly when the see fit. --- .../configlib/lib/gui/elements/ConfigGuiButton.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java index 69223d88..cc050745 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java @@ -28,6 +28,12 @@ public abstract class ConfigGuiButton implements ConfigUIElement { protected int posX, posY; protected int contentLeft; + /** The distance between the left-most position of the content (button) and the right side of the rect */ + protected int rightSideContentWidth; + + /** The height of the right-side content (button[s], slider, etc...) */ + protected int rightSideContentHeight; + protected ConfigGuiButton(Field field, Method event, ConfigProperty annotation) { this.field = field; this.event = event; From 31847136ef776f35e44a100022b93c5a479926d5 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Mon, 27 Jul 2026 20:27:14 +0300 Subject: [PATCH 24/42] modified to support new functionalities. this version in my opinion makes every inheritor look better visually. it also fixes comment to trimming to work correctly for each inheritor --- .../lib/gui/elements/ConfigGuiButton.java | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java index cc050745..c67e1a71 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java @@ -16,8 +16,9 @@ public abstract class ConfigGuiButton implements ConfigUIElement { - protected static final int PADDING = 8; + protected static final int DEFAULT_PADDING = 8; protected static final int BUTTON_RIGHT_MARGIN = 20; + private static final int COMMENT_TOP_MARGIN = 4; protected final Minecraft mc = Minecraft.getMinecraft(); protected final Field field; @@ -26,6 +27,7 @@ public abstract class ConfigGuiButton implements ConfigUIElement { private final List commentToRender = new ArrayList<>(); protected int boxWidth; protected int posX, posY; + protected int boxHeight; protected int contentLeft; /** The distance between the left-most position of the content (button) and the right side of the rect */ @@ -41,33 +43,33 @@ protected ConfigGuiButton(Field field, Method event, ConfigProperty annotation) } /** - * @return The distance between the left-most position of the content (button) and the right side of the rect + * {@link #rightSideContentWidth} must be correctly set before this method is called */ - protected abstract int getRightSideContentWidth(); - @Override public void setBoxWidth(int boxWidth) { this.boxWidth = boxWidth; if (this.hasComment()) { - final int wrapWidth = boxWidth - getLeftPadding() - getRightSideContentWidth() - 12; // 20 + final int wrapWidth = boxWidth - getLeftPadding() - rightSideContentWidth - 16; // 20 this.commentToRender.clear(); this.commentToRender.addAll(resizeCommentLines(annotation.comment(), wrapWidth, mc)); } } @Override - public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY) { + public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY, boolean canMouseBeVisuallyOverElement) { this.posX = drawX; this.posY = drawY; + this.boxHeight = getHeight(); final int right = drawX + boxWidth; - this.contentLeft = right - getRightSideContentWidth(); - GuiUtil.drawBoxWithOutline(drawX, drawY, right, drawY + getHeight(), colorPalette.SETTING_BACKGROUND, colorPalette.SETTING_BACKGROUND_BORDER); + this.contentLeft = right - rightSideContentWidth; + GuiUtil.drawBoxWithOutline(drawX, drawY, right, drawY + boxHeight, colorPalette.SETTING_BACKGROUND, colorPalette.SETTING_BACKGROUND_BORDER); final int textX = drawX + getLeftPadding(); - mc.fontRendererObj.drawStringWithShadow(annotation.name(), textX, drawY + PADDING, colorPalette.SETTING_NAME_TEXT); + final int textY = drawY + (this.hasComment() ? DEFAULT_PADDING : getCenterYOffset(mc.fontRendererObj.FONT_HEIGHT)); + mc.fontRendererObj.drawStringWithShadow(annotation.name(), textX, textY, colorPalette.SETTING_NAME_TEXT); if (this.hasComment()) { - int commentY = drawY + PADDING + mc.fontRendererObj.FONT_HEIGHT + 6; // '6' here represents the vertical space between name and comment + int commentY = textY + mc.fontRendererObj.FONT_HEIGHT + COMMENT_TOP_MARGIN; for (final String line : commentToRender) { - mc.fontRendererObj.drawStringWithShadow(line, drawX + 8, commentY, colorPalette.SETTING_COMMENT_TEXT); + mc.fontRendererObj.drawStringWithShadow(line, textX, commentY, colorPalette.SETTING_COMMENT_TEXT); commentY += mc.fontRendererObj.FONT_HEIGHT; } } @@ -75,10 +77,11 @@ public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, in @Override public int getHeight() { + int textHeight = mc.fontRendererObj.FONT_HEIGHT; if (this.hasComment()) { - return PADDING + mc.fontRendererObj.FONT_HEIGHT + PADDING + mc.fontRendererObj.FONT_HEIGHT * commentToRender.size() + 6 - 1; // '6' here represents the vertical space between name and comment + textHeight += COMMENT_TOP_MARGIN + mc.fontRendererObj.FONT_HEIGHT * commentToRender.size(); } - return PADDING + mc.fontRendererObj.FONT_HEIGHT + PADDING - 1; + return DEFAULT_PADDING + Math.max(textHeight, rightSideContentHeight) + DEFAULT_PADDING - 1; } @Override @@ -116,7 +119,7 @@ protected void playPressSound() { this.mc.getSoundHandler().playSound(PositionedSoundRecord.create(new ResourceLocation("gui.button.press"), 1.0F)); } - protected int getLeftPadding() { return PADDING; } + protected int getLeftPadding() { return DEFAULT_PADDING; } protected final ClickGuiButton getMainButton(String text) { return new ClickGuiButton(-1, 0, 0, getMainButtonWidth(), 20, text); @@ -129,4 +132,8 @@ protected final int getMainButtonWidth() { protected static String getBooleanText(boolean value) { return value ? EnumChatFormatting.GREEN + "Enabled" : EnumChatFormatting.RED + "Disabled"; } + + protected final int getCenterYOffset(int height) { + return (this.boxHeight - height) / 2; + } } From 06f564bc4d5f5f4bd4f8e1222379cd803805e2e8 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Mon, 27 Jul 2026 20:31:10 +0300 Subject: [PATCH 25/42] added more functionality to work cleanly with the ConfigGuiScreen and to allow inheritors more control. (these additions will be used by the selector button that comes in future and the color button edit if you wish so) --- .../gui/elements/OverlayConfigGuiButton.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/OverlayConfigGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/OverlayConfigGuiButton.java index 4be3af14..2dc4d960 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/OverlayConfigGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/OverlayConfigGuiButton.java @@ -1,9 +1,12 @@ package fr.alexdoru.configlib.lib.gui.elements; +import fr.alexdoru.configlib.api.ColorPalette; import fr.alexdoru.configlib.api.ConfigProperty; +import fr.alexdoru.configlib.lib.gui.MouseButton; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.List; public abstract class OverlayConfigGuiButton extends ConfigGuiButton { @@ -13,8 +16,29 @@ protected OverlayConfigGuiButton(Field field, Method event, ConfigProperty annot super(field, event, annotation); } + public abstract boolean isMouseOverOverlay(int mouseX, int mouseY); + + public abstract void drawOverlay(ColorPalette colorPalette, int mouseX, int mouseY); + + public List getOverlayHoveringTextLines() { return null; } + + /** @return {@code true} if the overlay handles the mouse click */ + public abstract boolean mouseClickedOnOverlay(int mouseX, int mouseY, MouseButton button) throws IllegalAccessException; + + /** @return {@code true} if the overlay handles the mouse release */ + public boolean mouseReleasedOnOverlay(int mouseX, int mouseY, MouseButton button) { return false; } + + /** @return {@code true} if the overlay handles the mouse input */ + public boolean handleOverlayMouseInput() { return false; } + + /** @return {@code true} if the overlay handles the key typed */ + public boolean overlayKeyTyped(char typedChar, int keyCode) { return false; } + public boolean isOverlayOpen() { return isOverlayOpen; } + public void closeOverlay() { + this.isOverlayOpen = false; + } } From 4b2e8a975cf2a0d9569324c22c68e70f1fc3787d Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Tue, 28 Jul 2026 00:49:00 +0300 Subject: [PATCH 26/42] added this method to cleanly close the currently open overlay --- .../java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java index bdbef5d5..40cb17c8 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java @@ -465,4 +465,10 @@ public Box getConfigBoxSize() { return CONFIG_BOX; } + private void closeOpenOverlay() { + if (this.currentlyOpenOverlay != null) { + this.currentlyOpenOverlay.closeOverlay(); + this.currentlyOpenOverlay = null; + } + } } From 9ffbd9aeb3b85f9e073382c2f3172058bc9fcc8c Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Tue, 28 Jul 2026 00:50:37 +0300 Subject: [PATCH 27/42] added this method for use instead of separate methods to get the height of config and menu --- .../fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java index 40cb17c8..1b1bd717 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java @@ -438,6 +438,14 @@ private void updateSearch(String search) { } } + private static int getContentHeight(List elements) { + int height = elements.isEmpty() ? 0 : -(elements.get(0).getTopMargin() + elements.get(elements.size()-1).getBottomMargin()); + for (final T element : elements) { + height += element.getTopMargin() + element.getHeight() + element.getBottomMargin(); + } + return height; + } + private static boolean forEachVisible(List elements, Box box, int scroll, ElementVisitor visitor) { int drawY = box.TOP + PADDING - scroll; for (final T element : elements) { From 9bbad986f897b17577f821b0269661980164a276 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Tue, 28 Jul 2026 00:52:49 +0300 Subject: [PATCH 28/42] modified handleMouseInput to support currentlyOpenOverlay --- .../java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java index 1b1bd717..0a4efd34 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java @@ -335,8 +335,10 @@ protected void keyTyped(char typedChar, int keyCode) throws IOException { @Override public void handleMouseInput() throws IOException { super.handleMouseInput(); - if (lastInteractedOverlay != null) { - return; + if (currentlyOpenOverlay != null) { + final boolean handledByOverlay = currentlyOpenOverlay.handleOverlayMouseInput(); + if (!currentlyOpenOverlay.isOverlayOpen()) this.currentlyOpenOverlay = null; + if (handledByOverlay) return; } final int wheel = Mouse.getEventDWheel(); if (wheel != 0) { From 304725f9908381f1547bd652fbf433593cf141f5 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Tue, 28 Jul 2026 00:53:31 +0300 Subject: [PATCH 29/42] modified keyTyped to also handle currentlyOpenOverlay's keyTyped --- .../java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java index 0a4efd34..83818525 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java @@ -301,8 +301,10 @@ protected void mouseReleased(int mouseX, int mouseY, int mouseButton) { @Override protected void keyTyped(char typedChar, int keyCode) throws IOException { - if (lastInteractedOverlay != null) { - return; + if (currentlyOpenOverlay != null) { + final boolean handledByOverlay = currentlyOpenOverlay.overlayKeyTyped(typedChar, keyCode); + if (!currentlyOpenOverlay.isOverlayOpen()) this.currentlyOpenOverlay = null; + if (handledByOverlay) return; } if (lastInteractedSlider != null && (keyCode == Keyboard.KEY_LEFT || keyCode == Keyboard.KEY_RIGHT)) { lastInteractedSlider.updateSliderFromIncrement(keyCode == Keyboard.KEY_LEFT ? -1 : 1); From 609ab2f07b1a15cb9ee98036e0b5278c798e66bc Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Tue, 28 Jul 2026 00:54:10 +0300 Subject: [PATCH 30/42] modified to handle currentlyOpenOverlay mouse released --- .../fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java index 83818525..66d11ca6 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java @@ -289,6 +289,13 @@ protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOEx @Override protected void mouseReleased(int mouseX, int mouseY, int mouseButton) { final MouseButton button = MouseButton.from(mouseButton); + if (currentlyOpenOverlay != null) { + final boolean handledByOverlay = currentlyOpenOverlay.mouseReleasedOnOverlay(mouseX, mouseY, button); + if (!currentlyOpenOverlay.isOverlayOpen()) this.currentlyOpenOverlay = null; + if (handledByOverlay) { + return; + } + } for (final ConfigUIElement element : this.renderedConfigElements) { if (element.mouseReleased(mouseX, mouseY, button)) { return; From 2cfe064c7a31ef1ba38cf4958a0d724f52ced270 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Tue, 28 Jul 2026 01:04:11 +0300 Subject: [PATCH 31/42] fix invalid hovering bug, correctly render open overlay and added hovering text functionality --- .../configlib/lib/gui/ConfigGuiScreen.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java index 66d11ca6..7251f933 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java @@ -221,9 +221,18 @@ public void drawScreen(int mouseX, int mouseY, float partialTicks) { CONFIG_BOX.applyScissors(mc, res, 1); + final boolean canMouseBeVisuallyOverElements = CONFIG_BOX.isMouseInBox(mouseX, mouseY) && (currentlyOpenOverlay == null || !currentlyOpenOverlay.isMouseOverOverlay(mouseX, mouseY)); + + final List hoveringTextLines = new ArrayList<>(); final int configDrawX = CONFIG_BOX.LEFT + PADDING; forEachVisible(this.renderedConfigElements, CONFIG_BOX, this.configScrollbar.getScroll(), (element, drawY) -> { - element.draw(colorPalette, configDrawX, drawY, mouseX, mouseY); + element.draw(colorPalette, configDrawX, drawY, mouseX, mouseY, canMouseBeVisuallyOverElements); + if (canMouseBeVisuallyOverElements && hoveringTextLines.isEmpty()) { + final List hoveringTextLinesIn = element.getHoveringTextLines(); + if (hoveringTextLinesIn != null && !hoveringTextLinesIn.isEmpty()) { + hoveringTextLines.addAll(hoveringTextLinesIn); + } + } return false; }); @@ -232,6 +241,20 @@ public void drawScreen(int mouseX, int mouseY, float partialTicks) { GL11.glDisable(GL11.GL_SCISSOR_TEST); super.drawScreen(mouseX, mouseY, partialTicks); + + if (currentlyOpenOverlay != null) { + currentlyOpenOverlay.drawOverlay(colorPalette, mouseX, mouseY); + if (hoveringTextLines.isEmpty()) { + final List hoveringTextLinesIn = currentlyOpenOverlay.getOverlayHoveringTextLines(); + if (hoveringTextLinesIn != null && !hoveringTextLinesIn.isEmpty()) { + hoveringTextLines.addAll(hoveringTextLinesIn); + } + } + } + + if (!hoveringTextLines.isEmpty()) { + drawHoveringText(hoveringTextLines, mouseX, mouseY); + } } @Override From c95ec916c2405a200a94f4f788768f80422d5243 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Tue, 28 Jul 2026 01:08:20 +0300 Subject: [PATCH 32/42] modified mouseClicked to correctly and cleanly handle the currentlyOpenOverlay --- .../configlib/lib/gui/ConfigGuiScreen.java | 80 +++++++++++-------- 1 file changed, 45 insertions(+), 35 deletions(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java index 7251f933..5a1cc2c5 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java @@ -260,53 +260,63 @@ public void drawScreen(int mouseX, int mouseY, float partialTicks) { @Override protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { final MouseButton button = MouseButton.from(mouseButton); - if (lastInteractedOverlay != null) { + OverlayConfigGuiButton overlayToClose = null; + if (currentlyOpenOverlay != null) { try { - lastInteractedOverlay.mouseClicked(mouseX, mouseY, button); + if (currentlyOpenOverlay.mouseClickedOnOverlay(mouseX, mouseY, button)) { + if (!currentlyOpenOverlay.isOverlayOpen()) this.currentlyOpenOverlay = null; + return; + } } catch (IllegalAccessException e) { throw new RuntimeException("Caught exception running mouse click events!", e); } - if (!lastInteractedOverlay.isOverlayOpen()) { - lastInteractedOverlay = null; + if (currentlyOpenOverlay.isOverlayOpen()) { + overlayToClose = currentlyOpenOverlay; } - return; + this.currentlyOpenOverlay = null; } - if (CATEGORY_BOX.isMouseInBox(mouseX, mouseY)) { - final boolean consumedClick = forEachVisible(this.categoryElements, CATEGORY_BOX, this.categoryScrollbar.getScroll(), (element, drawY) -> - element.mouseClicked(mouseX, mouseY, button) - ); - if (consumedClick) return; - if (this.categoryScrollbar.mouseClicked(mouseX, mouseY, button)) { - return; - } - } else if (CONFIG_BOX.isMouseInBox(mouseX, mouseY)) { - final boolean consumedClick = forEachVisible(this.renderedConfigElements, CONFIG_BOX, this.configScrollbar.getScroll(), (element, drawY) -> { - try { - if (element.mouseClicked(mouseX, mouseY, button)) { - if (element instanceof SliderGuiButton) { - lastInteractedSlider = ((SliderGuiButton) element); - } else if (element instanceof OverlayConfigGuiButton) { - final OverlayConfigGuiButton overlay = (OverlayConfigGuiButton) element; - if (overlay.isOverlayOpen()) { - lastInteractedOverlay = overlay; + // keep this label, it will come in handy in the feature if you need to have more "cleanup code" + // for example, if in the feature you choose to use my "Searchbar" + click_scan: { + if (CATEGORY_BOX.isMouseInBox(mouseX, mouseY)) { + final boolean consumedClick = forEachVisible(this.categoryElements, CATEGORY_BOX, this.categoryScrollbar.getScroll(), (element, drawY) -> + element.mouseClicked(mouseX, mouseY, button) + ); + if (consumedClick || categoryScrollbar.mouseClicked(mouseX, mouseY, button)) { + break click_scan; + } + } else if (CONFIG_BOX.isMouseInBox(mouseX, mouseY)) { + final boolean consumedClick = forEachVisible(this.renderedConfigElements, CONFIG_BOX, this.configScrollbar.getScroll(), (element, drawY) -> { + try { + if (element.mouseClicked(mouseX, mouseY, button)) { + if (element instanceof SliderGuiButton) { + lastInteractedSlider = ((SliderGuiButton) element); + } else if (element instanceof OverlayConfigGuiButton) { + final OverlayConfigGuiButton overlay = (OverlayConfigGuiButton) element; + if (overlay.isOverlayOpen()) { + currentlyOpenOverlay = overlay; + } } + return true; } - return true; + } catch (IllegalAccessException e) { + throw new RuntimeException("Caught exception running mouse click events!", e); } - } catch (IllegalAccessException e) { - throw new RuntimeException("Caught exception running mouse click events!", e); + return false; + }); + if (consumedClick || configScrollbar.mouseClicked(mouseX, mouseY, button)) { + break click_scan; } - return false; - }); - if (consumedClick) return; - if (this.configScrollbar.mouseClicked(mouseX, mouseY, button)) { - return; + } else if (button.isLeft() && SEARCH_BOX.isMouseInBox(mouseX, mouseY)) { + searchField.setFocused(true); + break click_scan; } - } else if (button.isLeft() && SEARCH_BOX.isMouseInBox(mouseX, mouseY)) { - searchField.setFocused(true); - return; + super.mouseClicked(mouseX, mouseY, mouseButton); + } + + if (overlayToClose != null && overlayToClose != currentlyOpenOverlay) { + overlayToClose.closeOverlay(); } - super.mouseClicked(mouseX, mouseY, mouseButton); } @Override From 978f2859e8865de6d2e569c22eb0d124ddb0bdb6 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Tue, 28 Jul 2026 01:10:50 +0300 Subject: [PATCH 33/42] modified forEachVisible to use elements margins --- .../java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java index 5a1cc2c5..1077e471 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java @@ -492,12 +492,16 @@ private static int getContentHeight(List elements) { private static boolean forEachVisible(List elements, Box box, int scroll, ElementVisitor visitor) { int drawY = box.TOP + PADDING - scroll; + if (!elements.isEmpty()) { + drawY -= elements.get(0).getTopMargin(); + } for (final T element : elements) { + drawY += element.getTopMargin(); final int elementHeight = element.getHeight(); if (drawY + elementHeight >= box.TOP && drawY <= box.BOTTOM) { if (visitor.visit(element, drawY)) return true; } - drawY += elementHeight + ELEMENT_GAP; + drawY += elementHeight + element.getBottomMargin(); } return false; } From 5fd26f5224cf4da3a3ac74f2a6382a7f9b5058f6 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Tue, 28 Jul 2026 01:35:52 +0300 Subject: [PATCH 34/42] override keyTyped to close this overlay when escape is pressed, otherwise block other key events from screen. and override handleMouseInput to block mouse scrolling in config box --- .../lib/gui/elements/ColorEnumGuiButton.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorEnumGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorEnumGuiButton.java index 6a518e73..8d47e12b 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorEnumGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorEnumGuiButton.java @@ -113,6 +113,24 @@ public boolean mouseClicked(int mouseX, int mouseY, MouseButton mouseButton) thr return false; } + @Override + public boolean handleOverlayMouseInput() { + if (Mouse.getEventDWheel() != 0) { + final int mouseX = Mouse.getEventX() * parentScreen.width / mc.displayWidth; + final int mouseY = parentScreen.height - Mouse.getEventY() * parentScreen.height / mc.displayHeight - 1; + return parentScreen.getConfigBoxSize().isMouseInBox(mouseX, mouseY); // don't allow 'config box scroll' + } + return false; + } + + @Override + public boolean overlayKeyTyped(char typedChar, int keyCode) { + if (keyCode == Keyboard.KEY_ESCAPE) { + closeOverlay(); + } + return true; + } + private void setValue(EnumChatFormatting v) { this.color = mc.fontRendererObj.getColorCode(v.toString().charAt(1)); this.button.displayString = v + v.name(); From e56b7610694eeb084ad09a9439a6d1f8d5aed024 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Tue, 28 Jul 2026 01:46:18 +0300 Subject: [PATCH 35/42] updated to to use new functionality --- .../configlib/lib/gui/ConfigGuiScreen.java | 37 +--- .../lib/gui/elements/BooleanGuiButton.java | 21 +- .../lib/gui/elements/ColorEnumGuiButton.java | 193 ++++++++++++------ .../lib/gui/elements/ColorGuiButton.java | 15 +- .../lib/gui/elements/EnumGuiButton.java | 15 +- .../lib/gui/elements/RendererGuiButton.java | 53 ++--- .../lib/gui/elements/SliderGuiButton.java | 26 +-- .../lib/gui/elements/SubCategoryHeader.java | 3 +- .../configlib/lib/gui/elements/TextLabel.java | 3 +- 9 files changed, 193 insertions(+), 173 deletions(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java index 1077e471..a82a4534 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java @@ -25,7 +25,6 @@ public class ConfigGuiScreen extends GuiScreen { public static final int PADDING = 6; - public static final int ELEMENT_GAP = 4; private static final ResourceLocation BLUR = new ResourceLocation("configlib", "blur.json"); @@ -40,7 +39,7 @@ public class ConfigGuiScreen extends GuiScreen { private GuiTextField searchField; private String selectedCategory = ""; private SliderGuiButton lastInteractedSlider; - private OverlayConfigGuiButton lastInteractedOverlay; + private OverlayConfigGuiButton currentlyOpenOverlay; private final Scrollbar configScrollbar = new Scrollbar(); private final Scrollbar categoryScrollbar = new Scrollbar(); @@ -130,7 +129,7 @@ public void initGui() { CATEGORY_BOX.LEFT = GUI_INSIDE.LEFT; CATEGORY_BOX.TOP = GUI_INSIDE.TOP + fontRendererObj.FONT_HEIGHT + 1 + PADDING; CATEGORY_BOX.RIGHT = GUI_INSIDE.LEFT + GUI_WIDTH / 5; - final int categoryContentHeight = getCategoryContentHeight(); + final int categoryContentHeight = getContentHeight(this.categoryElements); final int categoryMaxY = CATEGORY_BOX.TOP + categoryContentHeight + 2 * PADDING; CATEGORY_BOX.BOTTOM = Math.min(categoryMaxY, GUI_INSIDE.BOTTOM); @@ -166,10 +165,10 @@ public void initGui() { SEARCH_BOX.BOTTOM = GUI_INSIDE.TOP + mc.fontRendererObj.FONT_HEIGHT; this.categoryScrollbar.init(lastCategoryScroll, categoryContentHeight, CATEGORY_BOX.getHeight()); - this.configScrollbar.init(lastConfigScroll, this.getConfigContentHeight(), CONFIG_BOX.getHeight()); + this.configScrollbar.init(lastConfigScroll, getContentHeight(this.renderedConfigElements), CONFIG_BOX.getHeight()); this.lastInteractedSlider = null; - this.lastInteractedOverlay = null; + closeOpenOverlay(); this.mc.entityRenderer.loadShader(BLUR); super.initGui(); @@ -178,8 +177,8 @@ public void initGui() { @Override public void drawScreen(int mouseX, int mouseY, float partialTicks) { - final int categoryContentHeight = this.getCategoryContentHeight(); - final int configContentHeight = this.getConfigContentHeight(); + final int categoryContentHeight = getContentHeight(this.categoryElements); + final int configContentHeight = getContentHeight(this.renderedConfigElements); this.categoryScrollbar.updateScrollPos(categoryContentHeight, CATEGORY_BOX.getHeight()); this.configScrollbar.updateScrollPos(configContentHeight, CONFIG_BOX.getHeight()); @@ -352,7 +351,7 @@ protected void keyTyped(char typedChar, int keyCode) throws IOException { return; } if (searchField != null) { - if (keyCode == 1 && searchField.isFocused()) { + if (keyCode == Keyboard.KEY_ESCAPE && searchField.isFocused()) { searchField.setText(""); updateSearch(""); searchField.setFocused(false); @@ -408,24 +407,6 @@ public boolean doesGuiPauseGame() { return false; } - private int getCategoryContentHeight() { - int height = 0; - for (final CategoryGuiButton category : this.categoryElements) { - height += category.getHeight() + ELEMENT_GAP; - } - if (!this.categoryElements.isEmpty()) height -= ELEMENT_GAP; - return height; - } - - private int getConfigContentHeight() { - int height = 0; - for (final ConfigUIElement element : this.renderedConfigElements) { - height += element.getHeight() + ELEMENT_GAP; - } - if (!this.renderedConfigElements.isEmpty()) height -= ELEMENT_GAP; - return height; - } - public void setFocusedCategory(String categoryName) { if (categoryName == null) return; this.selectedCategory = categoryName; @@ -435,7 +416,7 @@ public void setFocusedCategory(String categoryName) { } this.configScrollbar.resetScroll(); this.lastInteractedSlider = null; - this.lastInteractedOverlay = null; + closeOpenOverlay(); this.renderedConfigElements.clear(); for (final ConfigUIElement element : this.configElements) { if (categoryName.equals(element.getCategory())) { @@ -452,7 +433,7 @@ private void updateSearch(String search) { search = search.toLowerCase(); this.configScrollbar.resetScroll(); this.lastInteractedSlider = null; - this.lastInteractedOverlay = null; + closeOpenOverlay(); this.renderedConfigElements.clear(); String lastKey = null; final int elementWidth = CONFIG_BOX.getWidth() - 2 * PADDING; diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/BooleanGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/BooleanGuiButton.java index 7c6a4b0d..50e27c8a 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/BooleanGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/BooleanGuiButton.java @@ -3,7 +3,6 @@ import fr.alexdoru.configlib.api.ColorPalette; import fr.alexdoru.configlib.api.ConfigProperty; import fr.alexdoru.configlib.lib.gui.MouseButton; -import net.minecraft.util.EnumChatFormatting; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -17,19 +16,16 @@ public BooleanGuiButton(Field field, Method event, ConfigProperty annotation) th super(field, event, annotation); this.toggled = (boolean) this.field.get(null); this.button = getMainButton(getBooleanText(toggled)); + this.rightSideContentWidth = button.width + BUTTON_RIGHT_MARGIN; + this.rightSideContentHeight = button.height; } @Override - protected int getRightSideContentWidth() { - return button.width + BUTTON_RIGHT_MARGIN; - } - - @Override - public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY) { - super.draw(colorPalette, drawX, drawY, mouseX, mouseY); + public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY, boolean canMouseBeVisuallyOverElement) { + super.draw(colorPalette, drawX, drawY, mouseX, mouseY, canMouseBeVisuallyOverElement); button.xPosition = contentLeft; - button.yPosition = drawY + (this.hasComment() ? PADDING + mc.fontRendererObj.FONT_HEIGHT / 2 : (getHeight() - button.height) / 2); - button.drawButton(colorPalette, mc, mouseX, mouseY); + button.yPosition = drawY + getCenterYOffset(button.height); + button.drawButton(colorPalette, mc, mouseX, mouseY, canMouseBeVisuallyOverElement); } @Override @@ -48,9 +44,4 @@ private void flipBooleanConfig() throws IllegalAccessException { toggled = (boolean) this.field.get(null); invokeConfigEvent(); } - - private String getButtonText() { - return toggled ? EnumChatFormatting.GREEN + "Enabled" : EnumChatFormatting.RED + "Disabled"; - } - } diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorEnumGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorEnumGuiButton.java index 8d47e12b..635da8dc 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorEnumGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorEnumGuiButton.java @@ -8,8 +8,10 @@ import fr.alexdoru.configlib.lib.gui.MouseButton; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; import java.awt.Color; import java.lang.reflect.Field; @@ -26,9 +28,17 @@ public class ColorEnumGuiButton extends OverlayConfigGuiButton { private final ClickGuiButton button; private final List colorButtons = new ArrayList<>(); private final Box panelBox = new Box(); + private final int defaultColorIndex; + private int lastSavedColorIndex; private int color; + private int selectedColorIndex; - public ColorEnumGuiButton(ConfigGuiScreen parentScreen, Field field, Method event, ConfigProperty annotation) throws IllegalAccessException { + // don't make this 'final', they should only be constructed when needed and set to null after (much cheaper) + private ClickGuiButton doneButton; + private ClickGuiButton resetButton; + private ClickGuiButton undoButton; + + public ColorEnumGuiButton(ConfigGuiScreen parentScreen, Field field, Method event, ConfigProperty annotation, EnumChatFormatting defaultColor) throws IllegalAccessException { super(field, event, annotation); this.parentScreen = parentScreen; int maxWidth = 0; @@ -38,78 +48,135 @@ public ColorEnumGuiButton(ConfigGuiScreen parentScreen, Field field, Method even this.colorButtons.add(new ColorSquareButton(c)); } } + this.defaultColorIndex = defaultColor.getColorIndex(); this.button = new ClickGuiButton(0, 0, 0, maxWidth, 20, ""); this.setValue((EnumChatFormatting) this.field.get(null)); + this.lastSavedColorIndex = this.selectedColorIndex; + this.rightSideContentWidth = button.width + BUTTON_RIGHT_MARGIN + 1 + button.height; // button.height == color_box_size + this.rightSideContentHeight = button.height; } @Override - public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY) { - super.draw(colorPalette, drawX, drawY, mouseX, mouseY); - button.xPosition = drawX + boxWidth - button.width - 20; - button.yPosition = drawY + (this.hasComment() ? 8 + mc.fontRendererObj.FONT_HEIGHT / 2 : (getHeight() - button.height) / 2); - button.drawButton(colorPalette, mc, mouseX, mouseY); - final int left = button.xPosition - 20 - 1; - final int top = button.yPosition; - GuiUtil.drawBoxWithOutline(left, top, left + 20, top + 20, 255 << 24 | color, colorPalette.COLOR_BUTTON_INDICATOR_BORDER); - if (isOverlayOpen) { - GlStateManager.translate(0, 0, 200); - - final Box configBox = this.parentScreen.getConfigBoxSize(); - final int panelWidth = 8 * SQUARE + 9 * GAP; - final int panelHeight = GAP + SQUARE + GAP + SQUARE + GAP + mc.fontRendererObj.FONT_HEIGHT + GAP; - panelBox.LEFT = configBox.LEFT + (configBox.getWidth() - panelWidth) / 2; - panelBox.TOP = configBox.TOP + (configBox.getHeight() - panelHeight) / 2; - panelBox.RIGHT = panelBox.LEFT + panelWidth; - panelBox.BOTTOM = panelBox.TOP + panelHeight; - GuiUtil.drawBoxWithOutline(panelBox.LEFT, panelBox.TOP, panelBox.RIGHT, panelBox.BOTTOM, colorPalette.SETTING_BACKGROUND, colorPalette.SETTING_BACKGROUND_BORDER); - - EnumChatFormatting hovered = null; - final int startX = panelBox.LEFT + GAP; - final int startY = panelBox.TOP + GAP + mc.fontRendererObj.FONT_HEIGHT + GAP; - final List buttons = this.colorButtons; - for (int i = 0; i < buttons.size(); i++) { - final ColorSquareButton colorButton = buttons.get(i); - final int row = i / 8; - final int col = i % 8; - colorButton.xPosition = startX + col * (SQUARE + GAP); - colorButton.yPosition = startY + row * (SQUARE + GAP); - colorButton.drawButton(mc, mouseX, mouseY); - if (colorButton.isMouseOver()) hovered = colorButton.color; - } + public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY, boolean canMouseBeVisuallyOverElement) { + super.draw(colorPalette, drawX, drawY, mouseX, mouseY, canMouseBeVisuallyOverElement); + final int top = drawY + getCenterYOffset(button.height); + final int colorBoxSize = button.height; + GuiUtil.drawBoxWithOutline(contentLeft, top, contentLeft + colorBoxSize, top + colorBoxSize, 255 << 24 | color, colorPalette.COLOR_BUTTON_INDICATOR_BORDER); + button.xPosition = contentLeft + 1 + colorBoxSize; + button.yPosition = top; + button.drawButton(colorPalette, mc, mouseX, mouseY, canMouseBeVisuallyOverElement); + } - if (hovered != null) { - final String titleText = hovered + hovered.name(); - final int titleX = panelBox.LEFT + panelWidth / 2; - final int titleY = panelBox.TOP + GAP; - GuiUtil.drawCenteredString(titleText, titleX, titleY, 0xFFFFFFFF); + @Override + public void drawOverlay(ColorPalette colorPalette, int mouseX, int mouseY) { + final Box configBox = this.parentScreen.getConfigBoxSize(); + final int panelWidth = 8 * SQUARE + 9 * GAP; + final int panelHeight = GAP + mc.fontRendererObj.FONT_HEIGHT + GAP + SQUARE + GAP + SQUARE + 6 + doneButton.height + GAP; + panelBox.LEFT = configBox.LEFT + (configBox.getWidth() - panelWidth) / 2; + panelBox.TOP = configBox.TOP + (configBox.getHeight() - panelHeight) / 2; + panelBox.RIGHT = panelBox.LEFT + panelWidth; + panelBox.BOTTOM = panelBox.TOP + panelHeight; + GuiUtil.drawBoxWithOutline(panelBox.LEFT, panelBox.TOP, panelBox.RIGHT, panelBox.BOTTOM, colorPalette.SETTING_BACKGROUND, colorPalette.SETTING_BACKGROUND_BORDER); + + EnumChatFormatting hovered = null; + final int startX = panelBox.LEFT + GAP; + final int startY = panelBox.TOP + GAP + mc.fontRendererObj.FONT_HEIGHT + GAP; + final List buttons = this.colorButtons; + for (int i = 0; i < buttons.size(); i++) { + final ColorSquareButton colorButton = buttons.get(i); + final int row = i / 8; + final int col = i % 8; + colorButton.xPosition = startX + col * (SQUARE + GAP); + colorButton.yPosition = startY + row * (SQUARE + GAP); + colorButton.drawButton(mc, mouseX, mouseY); + if (this.selectedColorIndex == i) { + GuiUtil.drawOutline(colorButton.xPosition-1, colorButton.yPosition-1, colorButton.xPosition + colorButton.width + 1, colorButton.yPosition + colorButton.height + 1, 0xFF3C6EFF); } + if (colorButton.isMouseOver()) hovered = colorButton.color; + } - GlStateManager.translate(0, 0, -200); + if (hovered != null) { + final String titleText = hovered + hovered.name(); + final int titleX = panelBox.LEFT + panelWidth / 2; + final int titleY = panelBox.TOP + GAP; + GuiUtil.drawCenteredString(titleText, titleX, titleY, 0xFFFFFFFF); } + + final int buttonsTop = panelBox.BOTTOM - GAP - doneButton.height; + final int totalButtonsWidth = resetButton.width + GAP + doneButton.width + GAP + undoButton.width; + resetButton.xPosition = panelBox.LEFT + (panelWidth - totalButtonsWidth) / 2; + resetButton.yPosition = buttonsTop; + resetButton.drawButton(colorPalette, mc, mouseX, mouseY); + + doneButton.xPosition = resetButton.xPosition + resetButton.width + GAP; + doneButton.yPosition = buttonsTop; + doneButton.drawButton(colorPalette, mc, mouseX, mouseY); + + undoButton.xPosition = doneButton.xPosition + doneButton.width + GAP; + undoButton.yPosition = buttonsTop; + undoButton.drawButton(colorPalette, mc, mouseX, mouseY); + } + + @Override + public List getOverlayHoveringTextLines() { + if (resetButton.isMouseOver() && resetButton.hasHoveringText()) { + return resetButton.getHoveringTextLines(); + } + else if (undoButton.isMouseOver() && undoButton.hasHoveringText()) { + return undoButton.getHoveringTextLines(); + } + return null; + } + + @Override + public boolean isMouseOverOverlay(int mouseX, int mouseY) { + return panelBox.isMouseInBox(mouseX, mouseY); } @Override public boolean mouseClicked(int mouseX, int mouseY, MouseButton mouseButton) throws IllegalAccessException { - if (!mouseButton.isLeft()) return false; - if (isOverlayOpen) { - if (panelBox.isMouseInBox(mouseX, mouseY)) { + if (mouseButton.isLeft() && button.mousePressed(mc, mouseX, mouseY)) { + button.playPressSound(mc.getSoundHandler()); + // only do work if the overlay is closed. + // if its open only play sound + if (!isOverlayOpen()) { + this.doneButton = new ClickGuiButton(-1, 0, 0, getMainButtonWidth(), 14, "Done"); + final int ICON_BUTTON_SIZE = doneButton.height; + this.resetButton = new ClickGuiButton(-1, 0, 0, ICON_BUTTON_SIZE, ICON_BUTTON_SIZE, ""); + this.resetButton.setTexture(new ResourceLocation("configlib", "reload.png")); + this.resetButton.setHoveringText("Reset to Default Position"); + this.undoButton = new ClickGuiButton(-1, 0, 0, ICON_BUTTON_SIZE, ICON_BUTTON_SIZE, ""); + this.undoButton.setTexture(new ResourceLocation("configlib", "undo.png")); + this.undoButton.setHoveringText("Undo Changes"); + isOverlayOpen = true; + } + return true; + } + return false; + } + + @Override + public boolean mouseClickedOnOverlay(int mouseX, int mouseY, MouseButton button) throws IllegalAccessException { + if (isMouseOverOverlay(mouseX, mouseY)) { + if (button.isLeft()) { for (final ColorSquareButton colorButton : this.colorButtons) { if (colorButton.mousePressed(mc, mouseX, mouseY)) { - button.playPressSound(mc.getSoundHandler()); - this.setNewValue(colorButton.color); + handleButtonClick(colorButton); return true; } } - } else { - isOverlayOpen = false; + if (doneButton.mousePressed(mc, mouseX, mouseY)) { + closeOverlay(); + } + else if (resetButton.mousePressed(mc, mouseX, mouseY)) { + handleButtonClick(colorButtons.get(defaultColorIndex)); + } + else if (undoButton.mousePressed(mc, mouseX, mouseY)) { + handleButtonClick(colorButtons.get(lastSavedColorIndex)); + } } return true; } - if (button.mousePressed(mc, mouseX, mouseY)) { - button.playPressSound(mc.getSoundHandler()); - isOverlayOpen = true; - return true; - } return false; } @@ -134,12 +201,23 @@ public boolean overlayKeyTyped(char typedChar, int keyCode) { private void setValue(EnumChatFormatting v) { this.color = mc.fontRendererObj.getColorCode(v.toString().charAt(1)); this.button.displayString = v + v.name(); + this.selectedColorIndex = v.getColorIndex(); } - private void setNewValue(EnumChatFormatting v) throws IllegalAccessException { - this.setValue(v); - this.field.set(null, v); - this.invokeConfigEvent(); + private void handleButtonClick(ColorSquareButton button) throws IllegalAccessException { + button.playPressSound(mc.getSoundHandler()); + this.field.set(null, button.color); + this.setValue(button.color); + invokeConfigEvent(); + } + + @Override + public void closeOverlay() { + super.closeOverlay(); + this.lastSavedColorIndex = this.selectedColorIndex; + this.doneButton = null; + this.resetButton = null; + this.undoButton = null; } private static class ColorSquareButton extends GuiButton { @@ -164,5 +242,4 @@ public void drawButton(Minecraft mc, int mouseX, int mouseY) { } } - } diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorGuiButton.java index 94962ad1..180fb73b 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ColorGuiButton.java @@ -22,22 +22,19 @@ public ColorGuiButton(ConfigGuiScreen configGuiScreen, Field field, ConfigProper this.color = (int) this.field.get(null); this.defaultColor = defaultColor; this.button = getMainButton("Change"); + this.rightSideContentWidth = button.width + BUTTON_RIGHT_MARGIN + 1 + button.height; // button.height == color_box_size + this.rightSideContentHeight = button.height; } @Override - protected int getRightSideContentWidth() { - return button.width + BUTTON_RIGHT_MARGIN + button.height /* color box width */ + 1; - } - - @Override - public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY) { - super.draw(colorPalette, drawX, drawY, mouseX, mouseY); - final int top = drawY + (this.hasComment() ? PADDING + mc.fontRendererObj.FONT_HEIGHT / 2 : (getHeight() - button.height) / 2); + public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY, boolean canMouseBeVisuallyOverElement) { + super.draw(colorPalette, drawX, drawY, mouseX, mouseY, canMouseBeVisuallyOverElement); + final int top = drawY + getCenterYOffset(button.height); final int colorBoxSize = button.height; GuiUtil.drawBoxWithOutline(contentLeft, top, contentLeft + colorBoxSize, top + colorBoxSize, 255 << 24 | color, colorPalette.COLOR_BUTTON_INDICATOR_BORDER); button.xPosition = contentLeft + colorBoxSize + 1; button.yPosition = top; - button.drawButton(colorPalette, mc, mouseX, mouseY); + button.drawButton(colorPalette, mc, mouseX, mouseY, canMouseBeVisuallyOverElement); } @Override diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/EnumGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/EnumGuiButton.java index bbc5bc8b..eafc7286 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/EnumGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/EnumGuiButton.java @@ -28,19 +28,16 @@ public EnumGuiButton(Field field, Method event, ConfigProperty annotation) throw } this.button = new ClickGuiButton(0, 0, 0, width, 20, ""); this.setValue((Enum) this.field.get(null)); + this.rightSideContentWidth = button.width + BUTTON_RIGHT_MARGIN; + this.rightSideContentHeight = button.height; } @Override - protected int getRightSideContentWidth() { - return button.width + BUTTON_RIGHT_MARGIN; - } - - @Override - public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY) { - super.draw(colorPalette, drawX, drawY, mouseX, mouseY); + public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY, boolean canMouseBeVisuallyOverElement) { + super.draw(colorPalette, drawX, drawY, mouseX, mouseY, canMouseBeVisuallyOverElement); button.xPosition = contentLeft; - button.yPosition = drawY + (this.hasComment() ? PADDING + mc.fontRendererObj.FONT_HEIGHT / 2 : (getHeight() - button.height) / 2); - button.drawButton(colorPalette, mc, mouseX, mouseY); + button.yPosition = drawY + getCenterYOffset(button.height); + button.drawButton(colorPalette, mc, mouseX, mouseY, canMouseBeVisuallyOverElement); } @Override diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/RendererGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/RendererGuiButton.java index 5a6826e3..5534200c 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/RendererGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/RendererGuiButton.java @@ -7,13 +7,11 @@ import fr.alexdoru.configlib.lib.gui.ConfigGuiScreen; import fr.alexdoru.configlib.lib.gui.MouseButton; import fr.alexdoru.configlib.lib.gui.RendererEditGuiScreen; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.client.gui.Gui; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.util.ResourceLocation; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.List; public class RendererGuiButton extends ConfigGuiButton { @@ -36,38 +34,32 @@ public RendererGuiButton( this.rendererPosition = ((RendererPosition) field.get(null)); this.toggled = this.rendererPosition.isEnabled(); this.buttonEnabled = getMainButton(getBooleanText(toggled)); - this.buttonMoveHud = new ClickGuiButton(0, 0, 0, 20, 20, ""); + final int moveHudBtnSize = buttonEnabled.height; + this.buttonMoveHud = new ClickGuiButton(0, 0, 0, moveHudBtnSize, moveHudBtnSize, ""); this.buttonMoveHud.setTexture(new ResourceLocation("configlib", "move.png")); + this.buttonMoveHud.setHoveringText("Move HUD"); + this.rightSideContentWidth = buttonEnabled.width + BUTTON_RIGHT_MARGIN + 1 + buttonMoveHud.width; + this.rightSideContentHeight = buttonEnabled.height; } @Override - protected int getRightSideContentWidth() { - return buttonEnabled.width + BUTTON_RIGHT_MARGIN; - } + public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY, boolean canMouseBeVisuallyOverElement) { + super.draw(colorPalette, drawX, drawY, mouseX, mouseY, canMouseBeVisuallyOverElement); - @Override - public void setBoxWidth(int boxWidth) { - super.setBoxWidth(boxWidth - 20 - 1); - this.boxWidth = boxWidth; - } + final int top = drawY + getCenterYOffset(buttonEnabled.height); - @Override - public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY) { - super.draw(colorPalette, drawX, drawY, mouseX, mouseY); - buttonEnabled.xPosition = contentLeft; - buttonEnabled.yPosition = drawY + PADDING; - buttonEnabled.drawButton(colorPalette, mc, mouseX, mouseY); + buttonMoveHud.xPosition = contentLeft; + buttonMoveHud.yPosition = top; + buttonMoveHud.drawButton(colorPalette, mc, mouseX, mouseY, canMouseBeVisuallyOverElement); - buttonMoveHud.xPosition = buttonEnabled.xPosition - buttonMoveHud.width - 1; - buttonMoveHud.yPosition = buttonEnabled.yPosition; - buttonMoveHud.drawButton(colorPalette, mc, mouseX, mouseY); + buttonEnabled.xPosition = buttonMoveHud.xPosition + buttonMoveHud.width + 1; + buttonEnabled.yPosition = top; + buttonEnabled.drawButton(colorPalette, mc, mouseX, mouseY, canMouseBeVisuallyOverElement); + } - if (buttonMoveHud.isMouseOver()) { - final String text = "Move HUD"; - final int textX = buttonMoveHud.xPosition - 4 - mc.fontRendererObj.getStringWidth(text); - final int textY = buttonMoveHud.yPosition + (buttonMoveHud.height - 8) / 2; - mc.fontRendererObj.drawStringWithShadow(text, textX, textY, colorPalette.HUD_BUTTON_HINT_TEXT); - } + @Override + public List getHoveringTextLines() { + return (buttonMoveHud.isMouseOver() && buttonMoveHud.hasHoveringText()) ? buttonMoveHud.getHoveringTextLines() : null; } @Override @@ -92,9 +84,4 @@ private void flipBooleanConfig() { toggled = rendererPosition.isEnabled(); invokeConfigEvent(); } - -// @Override -// public int getHeight() { -// return Math.max(super.getHeight(), PADDING + buttonEnabled.height + 1 + buttonMoveHud.height + PADDING - 1); -// } -} +} \ No newline at end of file diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java index 08ba6b21..18631552 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SliderGuiButton.java @@ -50,23 +50,20 @@ public SliderGuiButton(Field field, Method event, ConfigProperty annotation) thr } else { throw new IllegalArgumentException("Field of type " + field.getType() + " not supported by SliderGuiButton."); } + this.rightSideContentWidth = (PLUS_BUTTON_SIZE + SLIDER_BUTTON_SIZE / 2) * 2 + 1 + SLIDER_WIDTH + 6; + this.rightSideContentHeight = SLIDER_BUTTON_SIZE + mc.fontRendererObj.FONT_HEIGHT + 6; } @Override - protected int getRightSideContentWidth() { - return (PLUS_BUTTON_SIZE + SLIDER_BUTTON_SIZE / 2) * 2 + 1 + SLIDER_WIDTH + 6; - } - - @Override - public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY) { - super.draw(colorPalette, drawX, drawY, mouseX, mouseY); + public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY, boolean canMouseBeVisuallyOverElement) { + super.draw(colorPalette, drawX, drawY, mouseX, mouseY, canMouseBeVisuallyOverElement); if (dragging) { updateSliderFromPosition(mouseX - sliderBarX); } final int SLIDER_HEIGHT = 6; final int HALF_SLIDER_BUTTON_SIZE = SLIDER_BUTTON_SIZE / 2; sliderBarX = contentLeft + PLUS_BUTTON_SIZE + HALF_SLIDER_BUTTON_SIZE + 1; - final int sliderBarY = drawY + PADDING + mc.fontRendererObj.FONT_HEIGHT; + final int sliderBarY = drawY + getCenterYOffset(SLIDER_HEIGHT); sliderButtonX = sliderBarX + sliderIncrement - HALF_SLIDER_BUTTON_SIZE; sliderButtonY = sliderBarY + (SLIDER_HEIGHT - SLIDER_BUTTON_SIZE) / 2; minusButtonX = contentLeft; @@ -74,18 +71,18 @@ public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, in plusButtonX = sliderBarX + SLIDER_WIDTH + HALF_SLIDER_BUTTON_SIZE; plusButtonY = minusButtonY; GuiUtil.drawBoxWithOutline(sliderBarX, sliderBarY, sliderBarX + SLIDER_WIDTH, sliderBarY + SLIDER_HEIGHT, colorPalette.SLIDER_BUTTON_TRACK, colorPalette.SLIDER_BUTTON_TRACK_BORDER); - final boolean silderHovered = isMouseOnButton(mouseX, mouseY, sliderButtonX, sliderButtonY, SLIDER_BUTTON_SIZE, SLIDER_BUTTON_SIZE); + final boolean silderHovered = canMouseBeVisuallyOverElement && isMouseOnButton(mouseX, mouseY, sliderButtonX, sliderButtonY, SLIDER_BUTTON_SIZE, SLIDER_BUTTON_SIZE); final int sliderColor = silderHovered ? GuiUtil.brightenColor(colorPalette.SLIDER_BUTTON_THUMB, 0.12f) : colorPalette.SLIDER_BUTTON_THUMB; if (sliderButtonX > (sliderBarX + 1)) { final int top = sliderBarY + 1; Gui.drawRect(sliderBarX + 1, top, sliderButtonX, top + SLIDER_HEIGHT - 2, sliderColor); } GuiUtil.drawBoxWithOutline(sliderButtonX, sliderButtonY, sliderButtonX + SLIDER_BUTTON_SIZE, sliderButtonY + SLIDER_BUTTON_SIZE, sliderColor, colorPalette.SLIDER_BUTTON_THUMB_BORDER); - final boolean isMinusHovered = isMouseOnButton(mouseX, mouseY, minusButtonX, minusButtonY, PLUS_BUTTON_SIZE, PLUS_BUTTON_SIZE); + final boolean isMinusHovered = canMouseBeVisuallyOverElement && isMouseOnButton(mouseX, mouseY, minusButtonX, minusButtonY, PLUS_BUTTON_SIZE, PLUS_BUTTON_SIZE); final int minusColor = isMinusHovered ? GuiUtil.brightenColor(colorPalette.SLIDER_BUTTON_PLUS_BACKGROUND, 0.12f) : colorPalette.SLIDER_BUTTON_PLUS_BACKGROUND; GuiUtil.drawBoxWithOutline(minusButtonX, minusButtonY, minusButtonX + PLUS_BUTTON_SIZE, minusButtonY + PLUS_BUTTON_SIZE, minusColor, colorPalette.SLIDER_BUTTON_PLUS_BACKGROUND_BORDER); mc.fontRendererObj.drawStringWithShadow("-", minusButtonX + 2, minusButtonY + 1, colorPalette.SLIDER_BUTTON_PLUS_TEXT); - final boolean isPlusHovered = isMouseOnButton(mouseX, mouseY, plusButtonX, plusButtonY, PLUS_BUTTON_SIZE, PLUS_BUTTON_SIZE); + final boolean isPlusHovered = canMouseBeVisuallyOverElement && isMouseOnButton(mouseX, mouseY, plusButtonX, plusButtonY, PLUS_BUTTON_SIZE, PLUS_BUTTON_SIZE); final int plusColor = isPlusHovered ? GuiUtil.brightenColor(colorPalette.SLIDER_BUTTON_PLUS_BACKGROUND, 0.12f) : colorPalette.SLIDER_BUTTON_PLUS_BACKGROUND; GuiUtil.drawBoxWithOutline(plusButtonX, plusButtonY, plusButtonX + PLUS_BUTTON_SIZE, plusButtonY + PLUS_BUTTON_SIZE, plusColor, colorPalette.SLIDER_BUTTON_PLUS_BACKGROUND_BORDER); mc.fontRendererObj.drawStringWithShadow("+", plusButtonX + 2, plusButtonY + 1, colorPalette.SLIDER_BUTTON_PLUS_TEXT); @@ -100,15 +97,10 @@ public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, in } } final int valueX = sliderButtonX + (SLIDER_BUTTON_SIZE - mc.fontRendererObj.getStringWidth(valueText)) / 2; - final int valueY = sliderBarY - mc.fontRendererObj.FONT_HEIGHT - 4; + final int valueY = sliderButtonY - mc.fontRendererObj.FONT_HEIGHT - 1; mc.fontRendererObj.drawStringWithShadow(valueText, valueX, valueY, colorPalette.SLIDER_BUTTON_VALUE_TEXT); } - @Override - public int getHeight() { - return Math.max(super.getHeight(), PADDING + mc.fontRendererObj.FONT_HEIGHT + SLIDER_BUTTON_SIZE + PADDING); - } - @Override public boolean mouseClicked(int mouseX, int mouseY, MouseButton mouseButton) throws IllegalAccessException { if (mouseButton.isLeft()) { diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SubCategoryHeader.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SubCategoryHeader.java index 785ba467..e249cb7c 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SubCategoryHeader.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/SubCategoryHeader.java @@ -22,7 +22,7 @@ public void setBoxWidth(int boxWidth) { } @Override - public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY) { + public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY, boolean canMouseBeVisuallyOverElement) { final int textX = drawX + (boxWidth - mc.fontRendererObj.getStringWidth(subCategoryName)) / 2; mc.fontRendererObj.drawStringWithShadow(subCategoryName, textX, drawY, 0xFFFFFFFF); } @@ -52,5 +52,4 @@ public boolean matchSearch(String search) { return categoryName.toLowerCase().contains(search) || subCategoryName.toLowerCase().contains(search); } - } diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/TextLabel.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/TextLabel.java index 446004d8..4e30ad2a 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/TextLabel.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/TextLabel.java @@ -20,7 +20,7 @@ public void setBoxWidth(int boxWidth) { } @Override - public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY) { + public void draw(ColorPalette colorPalette, int drawX, int drawY, int mouseX, int mouseY, boolean canMouseBeVisuallyOverElement) { final int textX = drawX + (boxWidth - mc.fontRendererObj.getStringWidth(this.text)) / 2; mc.fontRendererObj.drawStringWithShadow(this.text, textX, drawY, colorPalette.LABEL_TEXT); } @@ -49,5 +49,4 @@ public String getSubCategory() { public boolean matchSearch(String search) { return false; } - } From 33dee08d3900b0268506866790511bca3d6905b0 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Fri, 7 Aug 2026 13:39:52 +0300 Subject: [PATCH 36/42] comment for explanation --- .../fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java index c67e1a71..15f9a411 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/elements/ConfigGuiButton.java @@ -119,6 +119,7 @@ protected void playPressSound() { this.mc.getSoundHandler().playSound(PositionedSoundRecord.create(new ResourceLocation("gui.button.press"), 1.0F)); } + // doesn't seem useful, but it's a must for future 'CustomElements' protected int getLeftPadding() { return DEFAULT_PADDING; } protected final ClickGuiButton getMainButton(String text) { From 0c3ccc008c89571134a71798a66c74fec1114eba Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Fri, 7 Aug 2026 13:41:19 +0300 Subject: [PATCH 37/42] changed to also add padding when needed. (this change was to fix scrollbar code) --- .../fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java index a82a4534..4280a3f7 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java @@ -464,9 +464,12 @@ private void updateSearch(String search) { } private static int getContentHeight(List elements) { - int height = elements.isEmpty() ? 0 : -(elements.get(0).getTopMargin() + elements.get(elements.size()-1).getBottomMargin()); - for (final T element : elements) { - height += element.getTopMargin() + element.getHeight() + element.getBottomMargin(); + int height = 0; + if (!elements.isEmpty()) { + height = PADDING * 2 - (elements.get(0).getTopMargin() + elements.get(elements.size()-1).getBottomMargin()); + for (final T element : elements) { + height += element.getTopMargin() + element.getHeight() + element.getBottomMargin(); + } } return height; } From d5968865150598cd97eaca8ad89dfb65cdcbc6c5 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Fri, 7 Aug 2026 13:42:26 +0300 Subject: [PATCH 38/42] made private since it is no longer used outside of this class (as it should be) --- .../java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java index 4280a3f7..556082e1 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java @@ -24,7 +24,7 @@ public class ConfigGuiScreen extends GuiScreen { - public static final int PADDING = 6; + private static final int PADDING = 6; private static final ResourceLocation BLUR = new ResourceLocation("configlib", "blur.json"); From 79c79f54bde4036180aaea186be36dbd9eb66132 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Fri, 7 Aug 2026 13:44:19 +0300 Subject: [PATCH 39/42] always close an overlay before config box wheel scrolling. (this wont be noticed for ColorEnumGuiButton's overlay, but it will for the future Selector and maybe for the future 'Color Edit Overlay') --- .../java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java index 556082e1..99294245 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java @@ -390,6 +390,7 @@ public void handleMouseInput() throws IOException { if (CATEGORY_BOX.isMouseInBox(mouseX, mouseY)) { this.categoryScrollbar.scheduleScroll(direction, amount); } else if (CONFIG_BOX.isMouseInBox(mouseX, mouseY)) { + closeOpenOverlay(); // won't be noticed for 'ColorEnumGuiButton's Overlay' but is a must for 'Selector' and probably for future 'Color Edit' this.configScrollbar.scheduleScroll(direction, amount); } } From 8f6653957f1f009a4f40628827ea4e1d5d5a2cd9 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Fri, 7 Aug 2026 13:45:14 +0300 Subject: [PATCH 40/42] categoryContentHeight now already includes screen padding --- .../java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java index 99294245..89b5522b 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java @@ -130,7 +130,7 @@ public void initGui() { CATEGORY_BOX.TOP = GUI_INSIDE.TOP + fontRendererObj.FONT_HEIGHT + 1 + PADDING; CATEGORY_BOX.RIGHT = GUI_INSIDE.LEFT + GUI_WIDTH / 5; final int categoryContentHeight = getContentHeight(this.categoryElements); - final int categoryMaxY = CATEGORY_BOX.TOP + categoryContentHeight + 2 * PADDING; + final int categoryMaxY = CATEGORY_BOX.TOP + categoryContentHeight; CATEGORY_BOX.BOTTOM = Math.min(categoryMaxY, GUI_INSIDE.BOTTOM); CONFIG_BOX.LEFT = CATEGORY_BOX.RIGHT + PADDING; From 65aaff179574a8a7d8c6607a5b22e0cc1561aa2d Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Fri, 7 Aug 2026 13:46:42 +0300 Subject: [PATCH 41/42] fixed scrollbar code --- .../alexdoru/configlib/lib/gui/Scrollbar.java | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/Scrollbar.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/Scrollbar.java index e37bc7db..a09484b9 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/Scrollbar.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/Scrollbar.java @@ -35,26 +35,28 @@ public void updateScrollPos(int contentHeight, int boxHeight) { } public void drawScrollbar(ColorPalette colorPalette, Box box, int mouseY, int contentHeight) { - final int categoryBoxHeight = box.getHeight() - 2; - final boolean renderCategoryScrollbar = contentHeight > categoryBoxHeight; - if (renderCategoryScrollbar) { - final int scrollBarSize = categoryBoxHeight * categoryBoxHeight / contentHeight; - final int minScrollBarY = box.TOP + 1 + 1; - final int maxScrollBarY = box.BOTTOM - 1 - scrollBarSize - 1; - if (dragging) { - final int relativeMouseY = mouseY - minScrollBarY - grabbedAtY; - if (maxScrollBarY != minScrollBarY) { - final int newScroll = relativeMouseY * (contentHeight - box.getHeight()) / (maxScrollBarY - minScrollBarY); - this.scroll(this.scroll - newScroll, contentHeight, box.getHeight()); - } + final int REAL_BOX_HEIGHT = box.getHeight(); + if (contentHeight <= REAL_BOX_HEIGHT) return; + final int VERTICAL_MARGIN = 2; + final int AVAILABLE_BOX_HEIGHT = REAL_BOX_HEIGHT - VERTICAL_MARGIN * 2; + final int thumbHeight = AVAILABLE_BOX_HEIGHT * REAL_BOX_HEIGHT / contentHeight; + final int minY = box.TOP + VERTICAL_MARGIN; + final int maxY = box.BOTTOM - thumbHeight - VERTICAL_MARGIN; + final int scrollRange = contentHeight - REAL_BOX_HEIGHT; + final int trackRange = maxY - minY; + if (dragging) { + final int relativeMouseY = mouseY - minY - grabbedAtY; + if (trackRange != 0) { + final int newScroll = relativeMouseY * scrollRange / trackRange; + this.scroll(this.scroll - newScroll, contentHeight, REAL_BOX_HEIGHT); } - this.thumb.LEFT = box.RIGHT - 5; - this.thumb.TOP = ((maxScrollBarY - minScrollBarY) * this.scroll) / (contentHeight - categoryBoxHeight) + minScrollBarY; - this.thumb.RIGHT = this.thumb.LEFT + 3; - this.thumb.BOTTOM = this.thumb.TOP + scrollBarSize; - GuiUtil.drawVerticalLine(box.RIGHT - 4, box.TOP + 4, box.BOTTOM - 4, colorPalette.SCROLLBAR_TRACK); - GuiUtil.drawRect(this.thumb, colorPalette.SCROLLBAR_THUMB); } + this.thumb.LEFT = box.RIGHT - 5; + this.thumb.TOP = minY + (int) ((float)this.scroll / scrollRange * trackRange); + this.thumb.RIGHT = this.thumb.LEFT + 3; + this.thumb.BOTTOM = this.thumb.TOP + thumbHeight; + GuiUtil.drawVerticalLine(box.RIGHT - 4, box.TOP + 4, box.BOTTOM - 4, colorPalette.SCROLLBAR_TRACK); + GuiUtil.drawRect(this.thumb, colorPalette.SCROLLBAR_THUMB); } public boolean mouseClicked(int mouseX, int mouseY, MouseButton mouseButton) { @@ -74,8 +76,8 @@ public void mouseReleased(MouseButton mouseButton) { private void scroll(int amount, int contentHeight, int boxHeight) { this.scroll = this.scroll - amount; - if (this.scroll > contentHeight + 2 * ConfigGuiScreen.PADDING - boxHeight) { - this.scroll = contentHeight + 2 * ConfigGuiScreen.PADDING - boxHeight; + if (this.scroll > contentHeight - boxHeight) { + this.scroll = contentHeight - boxHeight; this.amountToScroll = 0; } if (this.scroll <= 0) { From af39acfc9dda9a0612dcd02832812ecd1def725f Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Fri, 7 Aug 2026 13:58:02 +0300 Subject: [PATCH 42/42] cleaned up 'getContentHeight' method --- .../fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java index 89b5522b..40808df1 100644 --- a/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java +++ b/src/configlib/java/fr/alexdoru/configlib/lib/gui/ConfigGuiScreen.java @@ -465,12 +465,10 @@ private void updateSearch(String search) { } private static int getContentHeight(List elements) { - int height = 0; - if (!elements.isEmpty()) { - height = PADDING * 2 - (elements.get(0).getTopMargin() + elements.get(elements.size()-1).getBottomMargin()); - for (final T element : elements) { - height += element.getTopMargin() + element.getHeight() + element.getBottomMargin(); - } + if (elements.isEmpty()) return 0; + int height = PADDING * 2 - (elements.get(0).getTopMargin() + elements.get(elements.size()-1).getBottomMargin()); + for (final T element : elements) { + height += element.getTopMargin() + element.getHeight() + element.getBottomMargin(); } return height; }