From 79de8ca74e9f82c1d873774443a80dacb21e4c48 Mon Sep 17 00:00:00 2001 From: Al Mele Date: Thu, 2 Jul 2026 02:03:07 -0400 Subject: [PATCH] Accessibility Feature --- .../com/ldtteam/blockui/BOGuiGraphics.java | 61 ++++++++++++++++++- .../com/ldtteam/blockui/UiRenderMacros.java | 20 ++++++ .../ldtteam/blockui/controls/ItemIcon.java | 20 +++++- .../controls/ItemIconWithBlockState.java | 2 +- .../java/com/ldtteam/blockui/mod/BlockUI.java | 16 +++++ .../config/BlockUIClientConfiguration.java | 23 +++++++ .../resources/assets/blockui/gui/block_ui.xsd | 1 + .../resources/assets/blockui/lang/en_us.json | 8 ++- 8 files changed, 145 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/ldtteam/blockui/mod/config/BlockUIClientConfiguration.java diff --git a/src/main/java/com/ldtteam/blockui/BOGuiGraphics.java b/src/main/java/com/ldtteam/blockui/BOGuiGraphics.java index 31591026..b9af627a 100644 --- a/src/main/java/com/ldtteam/blockui/BOGuiGraphics.java +++ b/src/main/java/com/ldtteam/blockui/BOGuiGraphics.java @@ -1,5 +1,6 @@ package com.ldtteam.blockui; +import com.ldtteam.blockui.mod.BlockUI; import com.ldtteam.blockui.mod.item.BlockStateRenderingData; import com.ldtteam.blockui.util.SingleBlockGetter.SingleBlockNeighborhood; import com.ldtteam.blockui.util.cursor.Cursor; @@ -55,12 +56,68 @@ private Font getFont(@Nullable final ItemStack itemStack) public void renderItemDecorations(final ItemStack itemStack, final int x, final int y) { - super.renderItemDecorations(getFont(itemStack), itemStack, x, y); + renderItemDecorations(itemStack, x, y, null, false); } public void renderItemDecorations(final ItemStack itemStack, final int x, final int y, @Nullable final String altStackSize) { - super.renderItemDecorations(getFont(itemStack), itemStack, x, y, altStackSize); + renderItemDecorations(itemStack, x, y, altStackSize, false); + } + + public void renderItemDecorations(final ItemStack itemStack, final int x, final int y, final boolean forceHighContrastCount) + { + renderItemDecorations(itemStack, x, y, null, forceHighContrastCount); + } + + /** + * Renders vanilla item decorations, optionally drawing a high-contrast badge behind the stack count. + * + * @param itemStack item stack whose decorations will be rendered + * @param x item icon x position + * @param y item icon y position + * @param altStackSize optional text to render instead of the stack count + * @param forceHighContrastCount true to draw the count badge even when the client option is disabled + */ + public void renderItemDecorations( + final ItemStack itemStack, + final int x, + final int y, + @Nullable final String altStackSize, + final boolean forceHighContrastCount) + { + final Font font = getFont(itemStack); + if (BlockUI.isHighContrastCountEnabled() || forceHighContrastCount) + { + drawCountBadge(font, itemStack, x, y, altStackSize); + } + + super.renderItemDecorations(font, itemStack, x, y, altStackSize); + } + + /** + * Draws a high-contrast 'badge' under the item decoration. + * @param font font used to measure count text + * @param itemStack item stack being highlighted + * @param x left + * @param y top + * @param altStackSize optional text to render instead of the stack count + */ + private void drawCountBadge(final Font font, final ItemStack itemStack, final int x, final int y, @Nullable final String altStackSize) + { + final String countText = altStackSize == null ? itemStack.getCount() == 1 ? null : String.valueOf(itemStack.getCount()) : altStackSize; + if (countText == null || countText.isEmpty()) + { + return; + } + + final int textWidth = font.width(countText); + final int textX = x + 17 - textWidth; + final int textY = y + 9; + + pose().pushPose(); + pose().translate(0, 0, 199); + UiRenderMacros.fillRoundedBadge(pose(), textX - 2, textY - 1, textWidth + 4, font.lineHeight + 1, 0x99000000); + pose().popPose(); } public int drawString(final String text, final float x, final float y, final int color) diff --git a/src/main/java/com/ldtteam/blockui/UiRenderMacros.java b/src/main/java/com/ldtteam/blockui/UiRenderMacros.java index 57a0f934..eb789cd7 100644 --- a/src/main/java/com/ldtteam/blockui/UiRenderMacros.java +++ b/src/main/java/com/ldtteam/blockui/UiRenderMacros.java @@ -198,6 +198,26 @@ public static void fill(final PoseStack ps, final int x, final int y, final int fill(ps, x, y, w, h, (argbColor >> 16) & 0xff, (argbColor >> 8) & 0xff, argbColor & 0xff, (argbColor >> 24) & 0xff); } + /** + * Draws a rounded 'badge' at the specified location. + * @param ps pose stack + * @param x item icon x position + * @param y item icon y position + * @param w width + * @param h height + * @param argbColor ARGB color + */ + public static void fillRoundedBadge(final PoseStack ps, final int x, final int y, final int w, final int h, final int argbColor) + { + if (w < 3 || h < 3) + { + return; + } + + fill(ps, x + 1, y, w - 2, h, argbColor); + fill(ps, x, y + 1, w, h - 2, argbColor); + } + public static void fill(final PoseStack ps, final int x, final int y, diff --git a/src/main/java/com/ldtteam/blockui/controls/ItemIcon.java b/src/main/java/com/ldtteam/blockui/controls/ItemIcon.java index 9017b277..ba36647f 100644 --- a/src/main/java/com/ldtteam/blockui/controls/ItemIcon.java +++ b/src/main/java/com/ldtteam/blockui/controls/ItemIcon.java @@ -48,6 +48,7 @@ public class ItemIcon extends Pane */ protected boolean tooltipUpdateScheduled = false; protected boolean renderItemDecorations = true; + protected boolean forceHighContrastCount = false; /** * Standard constructor instantiating the itemIcon without any additional settings. @@ -77,6 +78,7 @@ public ItemIcon(final PaneParams params) } this.renderItemDecorations = params.getBoolean("renderItemDecorations", renderItemDecorations); + this.forceHighContrastCount = params.getBoolean("forceHighContrastCount", forceHighContrastCount); } /** @@ -125,6 +127,22 @@ public boolean renderItemDecorations() return renderItemDecorations; } + /** + * @param forceHighContrastCount true if count decorations should render with a high contrast badge for this icon. + */ + public void setForceHighContrastCount(final boolean forceHighContrastCount) + { + this.forceHighContrastCount = forceHighContrastCount; + } + + /** + * @return true if this icon forces high contrast count rendering. + */ + public boolean forceHighContrastCount() + { + return forceHighContrastCount; + } + /** * Sets itemStack from blockState. * @@ -194,7 +212,7 @@ public void drawSelf(final BOGuiGraphics target, final double mx, final double m target.renderItem(itemStack, 0, 0); if (renderItemDecorations) { - target.renderItemDecorations(itemStack, 0, 0); + target.renderItemDecorations(itemStack, 0, 0, forceHighContrastCount); } RenderSystem.defaultBlendFunc(); diff --git a/src/main/java/com/ldtteam/blockui/controls/ItemIconWithBlockState.java b/src/main/java/com/ldtteam/blockui/controls/ItemIconWithBlockState.java index 26d630f1..be6dcef4 100644 --- a/src/main/java/com/ldtteam/blockui/controls/ItemIconWithBlockState.java +++ b/src/main/java/com/ldtteam/blockui/controls/ItemIconWithBlockState.java @@ -147,7 +147,7 @@ public void drawSelf(final BOGuiGraphics target, final double mx, final double m target.renderBlockStateAsItem(blockStateExtension, itemStack); if (renderItemDecorations) { - target.renderItemDecorations(itemStack, 0, 0); + target.renderItemDecorations(itemStack, 0, 0, forceHighContrastCount); } RenderSystem.defaultBlendFunc(); diff --git a/src/main/java/com/ldtteam/blockui/mod/BlockUI.java b/src/main/java/com/ldtteam/blockui/mod/BlockUI.java index 193a411d..7a851b5d 100644 --- a/src/main/java/com/ldtteam/blockui/mod/BlockUI.java +++ b/src/main/java/com/ldtteam/blockui/mod/BlockUI.java @@ -1,5 +1,8 @@ package com.ldtteam.blockui.mod; +import com.ldtteam.blockui.mod.config.BlockUIClientConfiguration; +import com.ldtteam.common.config.AbstractConfiguration; +import com.ldtteam.common.config.Configurations; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.common.Mod; @@ -10,16 +13,29 @@ public class BlockUI { public static final String MOD_ID = "blockui"; + public static Configurations configuration; public BlockUI(final FMLModContainer modContainer, final Dist dist) { final IEventBus modBus = modContainer.getEventBus(); final IEventBus forgeBus = NeoForge.EVENT_BUS; + configuration = new Configurations<>( + modContainer, + modBus, + BlockUIClientConfiguration::new, + null, + null); + if (dist.isClient()) { modBus.register(ClientLifecycleSubscriber.class); forgeBus.register(ClientEventSubscriber.class); } } + + public static boolean isHighContrastCountEnabled() + { + return configuration != null && configuration.getClient() != null && configuration.getClient().highContrastCount.get(); + } } diff --git a/src/main/java/com/ldtteam/blockui/mod/config/BlockUIClientConfiguration.java b/src/main/java/com/ldtteam/blockui/mod/config/BlockUIClientConfiguration.java new file mode 100644 index 00000000..d38b7963 --- /dev/null +++ b/src/main/java/com/ldtteam/blockui/mod/config/BlockUIClientConfiguration.java @@ -0,0 +1,23 @@ +package com.ldtteam.blockui.mod.config; + +import com.ldtteam.blockui.mod.BlockUI; +import com.ldtteam.common.config.AbstractConfiguration; +import net.neoforged.neoforge.common.ModConfigSpec.BooleanValue; +import net.neoforged.neoforge.common.ModConfigSpec.Builder; + +/** + * Client-side BlockUI configuration. + */ +public class BlockUIClientConfiguration extends AbstractConfiguration +{ + public final BooleanValue highContrastCount; + + public BlockUIClientConfiguration(final Builder builder) + { + super(builder, BlockUI.MOD_ID); + + createCategory("visuals"); + highContrastCount = defineBoolean("highContrastCount", false); + finishCategory(); + } +} diff --git a/src/main/resources/assets/blockui/gui/block_ui.xsd b/src/main/resources/assets/blockui/gui/block_ui.xsd index e9ddf314..66236f7c 100644 --- a/src/main/resources/assets/blockui/gui/block_ui.xsd +++ b/src/main/resources/assets/blockui/gui/block_ui.xsd @@ -216,6 +216,7 @@ + diff --git a/src/main/resources/assets/blockui/lang/en_us.json b/src/main/resources/assets/blockui/lang/en_us.json index c5972df8..100ef969 100644 --- a/src/main/resources/assets/blockui/lang/en_us.json +++ b/src/main/resources/assets/blockui/lang/en_us.json @@ -6,5 +6,9 @@ "blockui.config.default.boolean": "[Default: %s]", "blockui.config.default.string": "[Default: %s]", "blockui.config.default.enum": "[Default: %s, values: %s]", - "blockui.config.default.number": "[Default: %s, min: %s, max: %s]" -} \ No newline at end of file + "blockui.config.default.number": "[Default: %s, min: %s, max: %s]", + "blockui.config.visuals": "Visuals", + "blockui.config.visuals.comment": "Client-side visual options.", + "blockui.config.highContrastCount": "High Contrast Count", + "blockui.config.highContrastCount.comment": "Draws a dark translucent badge behind item stack counts." +}