Fix depth of tooltips in inventory uis.

This commit is contained in:
Florian Nücke
2022-01-17 22:31:49 +01:00
parent d424265cda
commit 12b606908a
6 changed files with 124 additions and 108 deletions

View File

@@ -1,5 +1,6 @@
package li.cil.oc2.client.gui;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import li.cil.oc2.api.bus.device.DeviceTypes;
import li.cil.oc2.client.gui.util.GuiUtils;
@@ -9,6 +10,7 @@ import li.cil.oc2.common.Constants;
import li.cil.oc2.common.container.AbstractMachineTerminalContainer;
import li.cil.oc2.common.util.TooltipUtils;
import net.minecraft.ChatFormatting;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.FormattedText;
import net.minecraft.network.chat.TranslatableComponent;
@@ -73,22 +75,53 @@ public abstract class AbstractMachineInventoryScreen<T extends AbstractMachineTe
}.withTooltip(new TranslatableComponent(Constants.MACHINE_OPEN_TERMINAL_CAPTION)));
}
///////////////////////////////////////////////////////////////////
@Override
public void render(final PoseStack stack, final int mouseX, final int mouseY, final float partialTicks) {
renderBackground(stack);
super.render(stack, mouseX, mouseY, partialTicks);
protected void renderBg(final PoseStack stack, final float partialTicks, final int mouseX, final int mouseY) {
RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderColor(1, 1, 1, 1);
final int energyCapacity = menu.getEnergyCapacity();
if (energyCapacity > 0) {
final int energyStored = menu.getEnergy();
final int energyConsumption = menu.getEnergyConsumption();
Sprites.SIDEBAR_2.draw(stack, leftPos - Sprites.SIDEBAR_2.width, topPos + CONTROLS_TOP);
Sprites.ENERGY_BAR.drawFillY(stack, leftPos - Sprites.SIDEBAR_2.width + 4, topPos + ENERGY_TOP + 4, energyStored / (float) energyCapacity);
if (shouldRenderEnergyBar()) {
final int x = leftPos - Sprites.SIDEBAR_2.width;
final int y = topPos + ENERGY_TOP;
Sprites.SIDEBAR_2.draw(stack, x, y);
Sprites.ENERGY_BASE.draw(stack, x + 4, y + 4);
}
}
@Override
protected void renderFg(final PoseStack stack, final float partialTicks, final int mouseX, final int mouseY) {
super.renderFg(stack, partialTicks, mouseX, mouseY);
GuiUtils.renderMissingDeviceInfoIcon(stack, this, DeviceTypes.FLASH_MEMORY, Sprites.WARN_ICON);
GuiUtils.renderMissingDeviceInfoIcon(stack, this, DeviceTypes.MEMORY, Sprites.WARN_ICON);
GuiUtils.renderMissingDeviceInfoIcon(stack, this, DeviceTypes.HARD_DRIVE, Sprites.INFO_ICON);
if (shouldRenderEnergyBar()) {
final int x = leftPos - Sprites.SIDEBAR_2.width + 4;
final int y = topPos + ENERGY_TOP + 4;
Sprites.ENERGY_BAR.drawFillY(stack, x, y, menu.getEnergy() / (float) menu.getEnergyCapacity());
}
}
@Override
protected void renderTooltip(final PoseStack stack, final int mouseX, final int mouseY) {
super.renderTooltip(stack, mouseX, mouseY);
GuiUtils.renderMissingDeviceInfoTooltip(stack, this, mouseX, mouseY, DeviceTypes.FLASH_MEMORY);
GuiUtils.renderMissingDeviceInfoTooltip(stack, this, mouseX, mouseY, DeviceTypes.MEMORY);
GuiUtils.renderMissingDeviceInfoTooltip(stack, this, mouseX, mouseY, DeviceTypes.HARD_DRIVE);
if (shouldRenderEnergyBar()) {
if (isMouseOver(mouseX, mouseY, -Sprites.SIDEBAR_2.width + 4, ENERGY_TOP + 4, Sprites.ENERGY_BAR.width, Sprites.ENERGY_BAR.height)) {
final List<? extends FormattedText> tooltip = asList(
new TranslatableComponent(Constants.TOOLTIP_ENERGY, withFormat(energyStored + "/" + energyCapacity, ChatFormatting.GREEN)),
new TranslatableComponent(Constants.TOOLTIP_ENERGY_CONSUMPTION, withFormat(String.valueOf(energyConsumption), ChatFormatting.GREEN))
new TranslatableComponent(Constants.TOOLTIP_ENERGY,
withFormat(menu.getEnergy() + "/" + menu.getEnergyCapacity(), ChatFormatting.GREEN)),
new TranslatableComponent(Constants.TOOLTIP_ENERGY_CONSUMPTION,
withFormat(String.valueOf(menu.getEnergyConsumption()), ChatFormatting.GREEN))
);
TooltipUtils.drawTooltip(stack, tooltip, mouseX, mouseY, 200);
}
@@ -97,25 +130,7 @@ public abstract class AbstractMachineInventoryScreen<T extends AbstractMachineTe
///////////////////////////////////////////////////////////////////
@Override
protected void renderBg(final PoseStack stack, final float partialTicks, final int mouseX, final int mouseY) {
Sprites.SIDEBAR_2.draw(stack, leftPos - Sprites.SIDEBAR_2.width, topPos + CONTROLS_TOP);
if (menu.getEnergyCapacity() > 0) {
final int x = leftPos - Sprites.SIDEBAR_2.width;
final int y = topPos + ENERGY_TOP;
Sprites.SIDEBAR_2.draw(stack, x, y);
Sprites.ENERGY_BASE.draw(stack, x + 4, y + 4);
}
}
protected void renderMissingDeviceInfo(final PoseStack stack, final int mouseX, final int mouseY) {
GuiUtils.renderMissingDeviceInfoIcon(stack, this, DeviceTypes.FLASH_MEMORY, Sprites.WARN_ICON);
GuiUtils.renderMissingDeviceInfoIcon(stack, this, DeviceTypes.MEMORY, Sprites.WARN_ICON);
GuiUtils.renderMissingDeviceInfoIcon(stack, this, DeviceTypes.HARD_DRIVE, Sprites.INFO_ICON);
GuiUtils.renderMissingDeviceInfoTooltip(stack, this, mouseX, mouseY, DeviceTypes.FLASH_MEMORY);
GuiUtils.renderMissingDeviceInfoTooltip(stack, this, mouseX, mouseY, DeviceTypes.MEMORY);
GuiUtils.renderMissingDeviceInfoTooltip(stack, this, mouseX, mouseY, DeviceTypes.HARD_DRIVE);
private boolean shouldRenderEnergyBar() {
return menu.getEnergyCapacity() > 0;
}
}

View File

@@ -48,29 +48,6 @@ public abstract class AbstractMachineTerminalScreen<T extends AbstractMachineTer
return isInputCaptureEnabled;
}
@Override
public void render(final PoseStack stack, final int mouseX, final int mouseY, final float partialTicks) {
renderBackground(stack);
super.render(stack, mouseX, mouseY, partialTicks);
terminalWidget.render(stack, mouseX, mouseY, menu.getVirtualMachine().getBootError());
final int energyCapacity = menu.getEnergyCapacity();
if (energyCapacity > 0) {
final int energyStored = menu.getEnergy();
final int energyConsumption = menu.getEnergyConsumption();
Sprites.ENERGY_BAR.drawFillY(stack, leftPos - Sprites.SIDEBAR_2.width + 4, topPos + ENERGY_TOP + 4, energyStored / (float) energyCapacity);
if (isMouseOver(mouseX, mouseY, -Sprites.SIDEBAR_2.width + 4, ENERGY_TOP + 4, Sprites.ENERGY_BAR.width, Sprites.ENERGY_BAR.height)) {
final List<? extends FormattedText> tooltip = asList(
new TranslatableComponent(Constants.TOOLTIP_ENERGY, withFormat(energyStored + "/" + energyCapacity, ChatFormatting.GREEN)),
new TranslatableComponent(Constants.TOOLTIP_ENERGY_CONSUMPTION, withFormat(String.valueOf(energyConsumption), ChatFormatting.GREEN))
);
TooltipUtils.drawTooltip(stack, tooltip, mouseX, mouseY, 200);
}
}
}
@Override
public void containerTick() {
super.containerTick();
@@ -180,13 +157,23 @@ public abstract class AbstractMachineTerminalScreen<T extends AbstractMachineTer
protected abstract void setFocusIndicatorEditBox(final EditBox editBox);
@Override
protected void renderBg(final PoseStack stack, final float partialTicks, final int mouseX, final int mouseY) {
RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderColor(1, 1, 1, 1);
protected void renderFg(final PoseStack stack, final float partialTicks, final int mouseX, final int mouseY) {
super.renderFg(stack, partialTicks, mouseX, mouseY);
if (shouldRenderEnergyBar()) {
final int x = leftPos - Sprites.SIDEBAR_2.width + 4;
final int y = topPos + ENERGY_TOP + 4;
Sprites.ENERGY_BAR.drawFillY(stack, x, y, menu.getEnergy() / (float) menu.getEnergyCapacity());
}
terminalWidget.render(stack, mouseX, mouseY, menu.getVirtualMachine().getBootError());
}
@Override
protected void renderBg(final PoseStack stack, final float partialTicks, final int mouseX, final int mouseY) {
Sprites.SIDEBAR_3.draw(stack, leftPos - Sprites.SIDEBAR_2.width, topPos + CONTROLS_TOP);
if (menu.getEnergyCapacity() > 0) {
if (shouldRenderEnergyBar()) {
final int x = leftPos - Sprites.SIDEBAR_2.width;
final int y = topPos + ENERGY_TOP;
Sprites.SIDEBAR_2.draw(stack, x, y);
@@ -196,8 +183,32 @@ public abstract class AbstractMachineTerminalScreen<T extends AbstractMachineTer
terminalWidget.renderBackground(stack, mouseX, mouseY);
}
@Override
protected void renderTooltip(final PoseStack stack, final int mouseX, final int mouseY) {
super.renderTooltip(stack, mouseX, mouseY);
if (shouldRenderEnergyBar()) {
if (isMouseOver(mouseX, mouseY, -Sprites.SIDEBAR_2.width + 4, ENERGY_TOP + 4, Sprites.ENERGY_BAR.width, Sprites.ENERGY_BAR.height)) {
final List<? extends FormattedText> tooltip = asList(
new TranslatableComponent(Constants.TOOLTIP_ENERGY,
withFormat(menu.getEnergy() + "/" + menu.getEnergyCapacity(), ChatFormatting.GREEN)),
new TranslatableComponent(Constants.TOOLTIP_ENERGY_CONSUMPTION,
withFormat(String.valueOf(menu.getEnergyConsumption()), ChatFormatting.GREEN))
);
TooltipUtils.drawTooltip(stack, tooltip, mouseX, mouseY, 200);
}
}
}
@Override
protected void renderLabels(final PoseStack stack, final int mouseX, final int mouseY) {
// This is required to prevent the labels from being rendered
}
///////////////////////////////////////////////////////////////////
private boolean shouldRenderEnergyBar() {
return menu.getEnergyCapacity() > 0;
}
}

View File

@@ -1,6 +1,11 @@
package li.cil.oc2.client.gui;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.Widget;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.inventory.AbstractContainerMenu;
@@ -23,4 +28,34 @@ public abstract class AbstractModContainerScreen<T extends AbstractContainerMenu
localMouseY >= y &&
localMouseY < y + height;
}
@Override
public void render(final PoseStack stack, final int mouseX, final int mouseY, final float partialTicks) {
renderBackground(stack);
RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderColor(1, 1, 1, 1);
super.render(stack, mouseX, mouseY, partialTicks);
renderFg(stack, partialTicks, mouseX, mouseY);
renderTooltip(stack, mouseX, mouseY);
}
///////////////////////////////////////////////////////////////////
@Override
protected void renderTooltip(final PoseStack stack, final int mouseX, final int mouseY) {
super.renderTooltip(stack, mouseX, mouseY);
for (final Widget widget : renderables) {
if (widget instanceof AbstractWidget abstractWidget) {
abstractWidget.renderToolTip(stack, mouseX, mouseY);
}
}
}
protected void renderFg(final PoseStack stack, final float partialTicks, final int mouseX, final int mouseY) {
}
}

View File

@@ -1,9 +1,7 @@
package li.cil.oc2.client.gui;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import li.cil.oc2.common.container.ComputerInventoryContainer;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory;
import net.minecraftforge.api.distmarker.Dist;
@@ -20,23 +18,9 @@ public final class ComputerContainerScreen extends AbstractMachineInventoryScree
///////////////////////////////////////////////////////////////////
@Override
public void render(final PoseStack stack, final int mouseX, final int mouseY, final float partialTicks) {
super.render(stack, mouseX, mouseY, partialTicks);
renderMissingDeviceInfo(stack, mouseX, mouseY);
renderTooltip(stack, mouseX, mouseY);
}
///////////////////////////////////////////////////////////////////
@Override
protected void renderBg(final PoseStack stack, final float partialTicks, final int mouseX, final int mouseY) {
RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderColor(1, 1, 1, 1);
Sprites.COMPUTER_CONTAINER.draw(stack, leftPos, topPos);
super.renderBg(stack, partialTicks, mouseX, mouseY);
Sprites.COMPUTER_CONTAINER.draw(stack, leftPos, topPos);
}
}

View File

@@ -34,31 +34,13 @@ public final class RobotContainerScreen extends AbstractMachineInventoryScreen<R
inventoryLabelY = imageHeight - 94;
}
@Override
public void render(final PoseStack stack, final int mouseX, final int mouseY, final float partialTicks) {
super.render(stack, mouseX, mouseY, partialTicks);
renderSelection(stack);
renderMissingDeviceInfo(stack, mouseX, mouseY);
renderTooltip(stack, mouseX, mouseY);
}
///////////////////////////////////////////////////////////////////
@Override
protected void renderBg(final PoseStack stack, final float partialTicks, final int mouseX, final int mouseY) {
RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderColor(1, 1, 1, 1);
super.renderBg(stack, partialTicks, mouseX, mouseY);
Sprites.ROBOT_CONTAINER.draw(stack, leftPos, topPos);
super.renderBg(stack, partialTicks, mouseX, mouseY);
}
///////////////////////////////////////////////////////////////////
private void renderSelection(final PoseStack stack) {
renderSelection(stack, menu.getRobot().getSelectedSlot(), leftPos + 115, topPos + 23, 2);
renderSelection(stack, menu.getRobot().getSelectedSlot(), leftPos + 115, topPos + 23, 3);
}
}

View File

@@ -1,10 +1,8 @@
package li.cil.oc2.client.gui;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import li.cil.oc2.common.container.RobotTerminalContainer;
import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory;
import net.minecraftforge.api.distmarker.Dist;
@@ -25,25 +23,16 @@ public final class RobotTerminalScreen extends AbstractMachineTerminalScreen<Rob
super(container, inventory, title);
}
///////////////////////////////////////////////////////////////////
@Override
protected void renderBg(final PoseStack stack, final float partialTicks, final int mouseX, final int mouseY) {
RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderColor(1, 1, 1, 1);
Sprites.HOTBAR.draw(stack, leftPos + SLOTS_X, topPos + SLOTS_Y);
RobotContainerScreen.renderSelection(stack, menu.getRobot().getSelectedSlot(), leftPos + SLOTS_X + 4, topPos + SLOTS_Y + 4, 12);
super.renderBg(stack, partialTicks, mouseX, mouseY);
}
@Override
public void render(final PoseStack stack, final int mouseX, final int mouseY, final float partialTicks) {
super.render(stack, mouseX, mouseY, partialTicks);
RobotContainerScreen.renderSelection(stack, menu.getRobot().getSelectedSlot(), leftPos + SLOTS_X + 4, topPos + SLOTS_Y + 4, 12);
renderTooltip(stack, mouseX, mouseY);
}
///////////////////////////////////////////////////////////////////
@Override
protected void setFocusIndicatorEditBox(final EditBox editBox) {
focusIndicatorEditBox = editBox;