diff options
author | Juuz <6596629+Juuxel@users.noreply.github.com> | 2023-11-26 17:24:52 +0200 |
---|---|---|
committer | Juuz <6596629+Juuxel@users.noreply.github.com> | 2023-11-26 17:24:52 +0200 |
commit | c82111365b52fe4710a4192a16ca5df70510949d (patch) | |
tree | 34a410373b8b1be47e9d7b0eb0d075fddff54f89 | |
parent | f5d46dea812f0019ce06e1512dff697bb811f739 (diff) | |
download | LibGui-c82111365b52fe4710a4192a16ca5df70510949d.tar.gz LibGui-c82111365b52fe4710a4192a16ca5df70510949d.tar.bz2 LibGui-c82111365b52fe4710a4192a16ca5df70510949d.zip |
Add ghost item icons
Closes #228.
3 files changed, 60 insertions, 0 deletions
diff --git a/src/main/java/io/github/cottonmc/cotton/gui/widget/icon/ItemIcon.java b/src/main/java/io/github/cottonmc/cotton/gui/widget/icon/ItemIcon.java index 9da86ee..e6beeed 100644 --- a/src/main/java/io/github/cottonmc/cotton/gui/widget/icon/ItemIcon.java +++ b/src/main/java/io/github/cottonmc/cotton/gui/widget/icon/ItemIcon.java @@ -3,6 +3,7 @@ package io.github.cottonmc.cotton.gui.widget.icon; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.render.RenderLayer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -15,7 +16,11 @@ import java.util.Objects; * @since 2.2.0 */ public class ItemIcon implements Icon { + // Matches the vanilla RecipeBookGhostSlots class (1.20.2). + private static final int GHOST_OVERLAY_COLOR = 0x30_FFFFFF; + private final ItemStack stack; + private boolean ghost = false; /** * Constructs an item icon. @@ -47,6 +52,34 @@ public class ItemIcon implements Icon { matrices.translate(x, y, 0); matrices.scale(scale, scale, 1); context.drawItemWithoutEntity(stack, 0, 0); + + if (isGhost()) { + context.fill(RenderLayer.getGuiGhostRecipeOverlay(), 0, 0, 16, 16, GHOST_OVERLAY_COLOR); + } + matrices.pop(); } + + /** + * Checks whether this icon is a ghost item. + * Ghost items are rendered with a pale overlay. + * + * @return {@code true} if this icon is a ghost item, {@code false} otherwise + * @since 9.2.0 + */ + public boolean isGhost() { + return ghost; + } + + /** + * Marks this icon as a ghost or non-ghost icon. + * + * @param ghost {@code true} if this icon is a ghost item, {@code false} otherwise + * @return this icon + * @since 9.2.0 + */ + public ItemIcon setGhost(boolean ghost) { + this.ghost = ghost; + return this; + } } diff --git a/src/testMod/java/io/github/cottonmc/test/client/GhostIconTestGui.java b/src/testMod/java/io/github/cottonmc/test/client/GhostIconTestGui.java new file mode 100644 index 0000000..34c9737 --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/client/GhostIconTestGui.java @@ -0,0 +1,26 @@ +package io.github.cottonmc.test.client; + +import net.minecraft.item.Items; +import net.minecraft.text.Text; + +import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; +import io.github.cottonmc.cotton.gui.widget.WButton; +import io.github.cottonmc.cotton.gui.widget.WGridPanel; +import io.github.cottonmc.cotton.gui.widget.WToggleButton; +import io.github.cottonmc.cotton.gui.widget.icon.ItemIcon; + +public class GhostIconTestGui extends LightweightGuiDescription { + public GhostIconTestGui() { + WGridPanel root = (WGridPanel) rootPanel; + root.setGaps(2, 2); + + ItemIcon icon = new ItemIcon(Items.CACTUS); + WButton button = new WButton(icon, Text.literal("Hello world")); + WToggleButton ghostToggle = new WToggleButton(Text.literal("Ghost")); + ghostToggle.setOnToggle(icon::setGhost); + + root.add(button, 0, 0, 5, 1); + root.add(ghostToggle, 0, 1, 5, 1); + root.validate(this); + } +} diff --git a/src/testMod/java/io/github/cottonmc/test/client/LibGuiTestClient.java b/src/testMod/java/io/github/cottonmc/test/client/LibGuiTestClient.java index aef04ed..0674761 100644 --- a/src/testMod/java/io/github/cottonmc/test/client/LibGuiTestClient.java +++ b/src/testMod/java/io/github/cottonmc/test/client/LibGuiTestClient.java @@ -71,6 +71,7 @@ public class LibGuiTestClient implements ClientModInitializer { .then(literal("texture").executes(openScreen(client -> new TextureTestGui()))) .then(literal("textalignment").executes(openScreen(client -> new TextAlignmentTestGui()))) .then(literal("list").executes(openScreen(client -> new ListTestGui()))) + .then(literal("ghosticon").executes(openScreen(client -> new GhostIconTestGui()))) )); } |