diff options
Diffstat (limited to 'src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java')
| -rw-r--r-- | src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java new file mode 100644 index 000000000..059a5f927 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java @@ -0,0 +1,195 @@ +/* + * Roughly Enough Items by Danielshe. + * Licensed under the MIT License. + */ + +package me.shedaniel.rei.gui.widget; + +import me.shedaniel.math.api.Rectangle; +import me.shedaniel.math.compat.RenderHelper; +import me.shedaniel.math.impl.PointHelper; +import me.shedaniel.rei.api.ClientHelper; +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.annotations.Experimental; +import me.shedaniel.rei.impl.ScreenHelper; +import net.minecraft.client.gui.Element; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.MathHelper; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +@Experimental +public class EntryWidget extends WidgetWithBounds { + + protected static final Identifier RECIPE_GUI = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); + protected static final Identifier RECIPE_GUI_DARK = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer_dark.png"); + + protected boolean highlight = true; + protected boolean tooltips = true; + protected boolean background = true; + protected boolean interactable = true; + private Rectangle bounds; + private List<EntryStack> entryStacks; + + protected EntryWidget(int x, int y) { + this.bounds = new Rectangle(x - 1, y - 1, 18, 18); + this.entryStacks = new ArrayList<>(); + } + + public static EntryWidget create(int x, int y) { + return new EntryWidget(x, y); + } + + public EntryWidget disableInteractions() { + return interactable(false); + } + + public EntryWidget interactable(boolean b) { + interactable = b; + return this; + } + + public EntryWidget noHighlight() { + return highlight(false); + } + + public EntryWidget highlight(boolean b) { + highlight = b; + return this; + } + + public EntryWidget noTooltips() { + return tooltips(false); + } + + public EntryWidget tooltips(boolean b) { + tooltips = b; + return this; + } + + public EntryWidget noBackground() { + return background(false); + } + + public EntryWidget background(boolean b) { + background = b; + return this; + } + + public EntryWidget clearStacks() { + entryStacks.clear(); + return this; + } + + public EntryWidget entry(EntryStack stack) { + entryStacks.add(stack); + return this; + } + + public EntryWidget entries(Collection<EntryStack> stacks) { + entryStacks.addAll(stacks); + return this; + } + + protected EntryStack getCurrentEntry() { + if (entryStacks.isEmpty()) + return EntryStack.empty(); + if (entryStacks.size() == 1) + return entryStacks.get(0); + return entryStacks.get(MathHelper.floor((System.currentTimeMillis() / 500 % (double) entryStacks.size()) / 1f)); + } + + public List<EntryStack> entries() { + return entryStacks; + } + + @Override + public Rectangle getBounds() { + return bounds; + } + + protected Rectangle getInnerBounds() { + return new Rectangle(bounds.x + 1, bounds.y + 1, bounds.width - 2, bounds.height - 2); + } + + @Override + public void render(int mouseX, int mouseY, float delta) { + if (background) { + drawBackground(mouseX, mouseY, delta); + } + drawCurrentEntry(mouseX, mouseY, delta); + + boolean highlighted = containsMouse(mouseX, mouseY); + if (tooltips && highlighted) { + queueTooltip(mouseX, mouseY, delta); + } + if (highlight && highlighted) { + drawHighlighted(mouseX, mouseY, delta); + } + } + + protected void drawBackground(int mouseX, int mouseY, float delta) { + minecraft.getTextureManager().bindTexture(ScreenHelper.isDarkModeEnabled() ? RECIPE_GUI_DARK : RECIPE_GUI); + blit(bounds.x, bounds.y, 0, 222, bounds.width, bounds.height); + } + + protected void drawCurrentEntry(int mouseX, int mouseY, float delta) { + EntryStack entry = getCurrentEntry(); + entry.setZ(200); + entry.render(getInnerBounds(), mouseX, mouseY, delta); + } + + protected void queueTooltip(int mouseX, int mouseY, float delta) { + EntryStack entry = getCurrentEntry(); + QueuedTooltip tooltip = entry.getTooltip(mouseX, mouseY); + if (tooltip != null) { + ScreenHelper.getLastOverlay().addTooltip(tooltip); + } + } + + protected void drawHighlighted(int mouseX, int mouseY, float delta) { + RenderHelper.disableLighting(); + RenderHelper.disableDepthTest(); + RenderHelper.colorMask(true, true, true, false); + int color = ScreenHelper.isDarkModeEnabled() ? -1877929711 : -2130706433; + blitOffset = 300; + Rectangle bounds = getInnerBounds(); + fillGradient(bounds.x, bounds.y, bounds.getMaxX(), bounds.getMaxY(), color, color); + blitOffset = 0; + RenderHelper.colorMask(true, true, true, true); + RenderHelper.enableLighting(); + RenderHelper.enableDepthTest(); + } + + @Override + public List<? extends Element> children() { + return Collections.emptyList(); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (!interactable) + return false; + if (containsMouse(mouseX, mouseY)) + if (button == 0) + return ClientHelper.getInstance().executeRecipeKeyBind(getCurrentEntry()); + else if (button == 1) + return ClientHelper.getInstance().executeUsageKeyBind(getCurrentEntry()); + return false; + } + + @Override + public boolean keyPressed(int int_1, int int_2, int int_3) { + if (!interactable) + return false; + if (containsMouse(PointHelper.fromMouse())) + if (ClientHelper.getInstance().getRecipeKeyBinding().matchesKey(int_1, int_2)) + return ClientHelper.getInstance().executeRecipeKeyBind(getCurrentEntry()); + else if (ClientHelper.getInstance().getUsageKeyBinding().matchesKey(int_1, int_2)) + return ClientHelper.getInstance().executeUsageKeyBind(getCurrentEntry()); + return false; + } +} |
