diff --git a/src/main/java/li/cil/oc2/client/gui/AbstractMachineInventoryScreen.java b/src/main/java/li/cil/oc2/client/gui/AbstractMachineInventoryScreen.java index c80c8c6c..0d1a1ce2 100644 --- a/src/main/java/li/cil/oc2/client/gui/AbstractMachineInventoryScreen.java +++ b/src/main/java/li/cil/oc2/client/gui/AbstractMachineInventoryScreen.java @@ -39,10 +39,8 @@ public abstract class AbstractMachineInventoryScreen tooltip; private final Sprite baseImage; private final Sprite pressedImage; + private List tooltip = emptyList(); private long lastPressedAt; private long hoveringStartedAt; /////////////////////////////////////////////////////////////////// - public ImageButton(final Screen parent, - final int x, final int y, - final int width, final int height, - final Component caption, - @Nullable final Component description, - final Sprite baseImage, - final Sprite pressedImage) { - super(x, y, width, height, caption); - this.parent = parent; - if (description == null) { - this.tooltip = singletonList(caption); - } else { - this.tooltip = asList(caption, new TextComponent("").withStyle(style -> style.withColor(TextColor.fromLegacyFormat(ChatFormatting.GRAY))).append(description)); - } + protected ImageButton(final int x, final int y, final int width, final int height, final Sprite baseImage, final Sprite pressedImage) { + super(x, y, width, height, TextComponent.EMPTY); this.baseImage = baseImage; this.pressedImage = pressedImage; } /////////////////////////////////////////////////////////////////// + public ImageButton withMessage(final Component component) { + setMessage(component); + return this; + } + + public ImageButton withTooltip(final Component... components) { + tooltip = Arrays.asList(components); + for (int i = 1; i < tooltip.size(); i++) { + final Component component = tooltip.get(i); + tooltip.set(i, withFormat(component, ChatFormatting.GRAY)); + } + return this; + } + @Override public void onPress() { lastPressedAt = System.currentTimeMillis(); @@ -58,12 +61,16 @@ public abstract class ImageButton extends AbstractButton { @Override public void renderButton(final PoseStack stack, final int mouseX, final int mouseY, final float partialTicks) { - Sprite background = baseImage; - if ((System.currentTimeMillis() - lastPressedAt) < PRESS_DURATION) { - background = pressedImage; - } + renderBackground(stack, mouseX, mouseY, partialTicks); - background.draw(stack, x, y); + renderToolTip(stack, mouseX, mouseY); + } + + @Override + public void renderToolTip(final PoseStack stack, final int mouseX, final int mouseY) { + if (tooltip.isEmpty()) { + return; + } if (isHoveredOrFocused()) { if (hoveringStartedAt == 0) { @@ -71,20 +78,34 @@ public abstract class ImageButton extends AbstractButton { } if ((System.currentTimeMillis() - hoveringStartedAt) > TOOLTIP_DELAY) { - renderToolTip(stack, mouseX, mouseY); + TooltipUtils.drawTooltip(stack, tooltip, mouseX, mouseY, 200); } } else { hoveringStartedAt = 0; } } - @Override - public void renderToolTip(final PoseStack stack, final int mouseX, final int mouseY) { - TooltipUtils.drawTooltip(stack, tooltip, mouseX, mouseY, 200); - } - @Override public void updateNarration(final NarrationElementOutput element) { this.defaultButtonNarrationText(element); } + + /////////////////////////////////////////////////////////////////// + + protected void renderBackground(final PoseStack stack, final int mouseX, final int mouseY, final float partialTicks) { + RenderSystem.enableDepthTest(); + + Sprite background = baseImage; + if ((System.currentTimeMillis() - lastPressedAt) < PRESS_DURATION) { + background = pressedImage; + } + + background.draw(stack, x, y); + + if (!Objects.equals(getMessage(), TextComponent.EMPTY)) { + drawCenteredString(stack, Minecraft.getInstance().font, getMessage(), + x + width / 2, y + (height - 8) / 2, + getFGColor() | Mth.ceil(alpha * 255) << 24); + } + } } diff --git a/src/main/java/li/cil/oc2/client/gui/widget/ToggleImageButton.java b/src/main/java/li/cil/oc2/client/gui/widget/ToggleImageButton.java index e5fbff37..6b056cd0 100644 --- a/src/main/java/li/cil/oc2/client/gui/widget/ToggleImageButton.java +++ b/src/main/java/li/cil/oc2/client/gui/widget/ToggleImageButton.java @@ -1,66 +1,25 @@ package li.cil.oc2.client.gui.widget; import com.mojang.blaze3d.vertex.PoseStack; -import li.cil.oc2.common.util.TooltipUtils; -import net.minecraft.ChatFormatting; -import net.minecraft.client.gui.components.AbstractButton; -import net.minecraft.client.gui.narration.NarrationElementOutput; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TextColor; -import net.minecraft.network.chat.TextComponent; -import javax.annotation.Nullable; -import java.util.List; - -import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; - -public abstract class ToggleImageButton extends AbstractButton { - private static final long PRESS_DURATION = 200; - private static final long TOOLTIP_DELAY = 250; - - /////////////////////////////////////////////////////////////////// - - private final Screen parent; - private final List tooltip; - private final Sprite baseImage; - private final Sprite pressedImage; +public abstract class ToggleImageButton extends ImageButton { private final Sprite activeImage; private boolean isToggled; - private long lastPressedAt; - private long hoveringStartedAt; /////////////////////////////////////////////////////////////////// public ToggleImageButton( - final Screen parent, final int x, final int y, final int width, final int height, - final Component caption, - @Nullable final Component description, final Sprite baseImage, final Sprite pressedImage, final Sprite activeImage) { - super(x, y, width, height, caption); - this.parent = parent; - if (description == null) { - this.tooltip = singletonList(caption); - } else { - this.tooltip = asList(caption, new TextComponent("").withStyle(style -> style.withColor(TextColor.fromLegacyFormat(ChatFormatting.GRAY))).append(description)); - } - this.baseImage = baseImage; - this.pressedImage = pressedImage; + super(x, y, width, height, baseImage, pressedImage); this.activeImage = activeImage; } /////////////////////////////////////////////////////////////////// - @Override - public void onPress() { - lastPressedAt = System.currentTimeMillis(); - } - public boolean isToggled() { return isToggled; } @@ -70,38 +29,10 @@ public abstract class ToggleImageButton extends AbstractButton { } @Override - public void renderButton(final PoseStack stack, final int mouseX, final int mouseY, final float partialTicks) { - Sprite background = baseImage; - if ((System.currentTimeMillis() - lastPressedAt) < PRESS_DURATION) { - background = pressedImage; - } - - background.draw(stack, x, y); - + protected void renderBackground(final PoseStack stack, final int mouseX, final int mouseY, final float partialTicks) { + super.renderBackground(stack, mouseX, mouseY, partialTicks); if (isToggled()) { activeImage.draw(stack, x, y); } - - if (isHoveredOrFocused()) { - if (hoveringStartedAt == 0) { - hoveringStartedAt = System.currentTimeMillis(); - } - - if ((System.currentTimeMillis() - hoveringStartedAt) > TOOLTIP_DELAY) { - renderToolTip(stack, mouseX, mouseY); - } - } else { - hoveringStartedAt = 0; - } - } - - @Override - public void renderToolTip(final PoseStack stack, final int mouseX, final int mouseY) { - TooltipUtils.drawTooltip(stack, tooltip, mouseX, mouseY, 200); - } - - @Override - public void updateNarration(final NarrationElementOutput element) { - this.defaultButtonNarrationText(element); } }