equivalent-exchange-3/src/main/java/com/pahimar/ee3/client/gui/GuiBase.java

376 lines
11 KiB
Java

package com.pahimar.ee3.client.gui;
import java.util.*;
import com.pahimar.ee3.client.gui.component.GuiComponent;
import com.pahimar.ee3.client.util.RenderUtils;
import com.pahimar.repackage.cofh.lib.util.helpers.StringHelper;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
@SideOnly(Side.CLIENT)
public abstract class GuiBase extends GuiContainer {
@SideOnly(Side.CLIENT)
protected ResourceLocation texture;
protected Map<String, GuiComponent> guiComponentMap
= new TreeMap<String, GuiComponent>();
protected String title;
private boolean shouldDrawTitle = true;
private String activeGuiComponentId = null;
private int adjustedMouseX = 0;
private int adjustedMouseY = 0;
public GuiBase(Container container) {
this(null, container);
}
public GuiBase(String title, Container container) {
this(title, container, null);
}
public GuiBase(Container container, ResourceLocation texture) {
this(null, container, texture);
}
public GuiBase(String title, Container container, ResourceLocation texture) {
super(container);
this.title = title;
this.texture = texture;
}
public String getActiveGuiComponentId() {
return activeGuiComponentId;
}
public String getTitle() {
return title;
}
public GuiBase setTitle(String title) {
this.title = title;
return this;
}
public boolean shouldDrawTitle() {
return shouldDrawTitle;
}
public GuiBase setShouldDrawTitle(boolean shouldDrawTitle) {
this.shouldDrawTitle = shouldDrawTitle;
return this;
}
public int getAdjustedMouseX() {
return adjustedMouseX;
}
protected GuiBase updateAdjustedMouseX(int rawMouseX) {
this.adjustedMouseX = rawMouseX - getGuiPositionX();
return this;
}
public int getAdjustedMouseY() {
return adjustedMouseY;
}
protected GuiBase updateAdjustedMouseY(int rawMouseY) {
this.adjustedMouseY = rawMouseY - getGuiPositionY();
return this;
}
public GuiBase updateAdjustedMousePosition(int rawMouseX, int rawMouseY) {
return updateAdjustedMouseX(rawMouseX).updateAdjustedMouseY(rawMouseY);
}
public int getScreenWidth() {
return width;
}
public int getScreenHeight() {
return height;
}
public int getGuiPositionX() {
return guiLeft;
}
public GuiBase setGuiPositionX(int positionX) {
this.guiLeft = positionX;
return this;
}
public int getGuiPositionY() {
return guiTop;
}
public GuiBase setGuiPositionY(int positionY) {
this.guiTop = positionY;
return this;
}
public int getGuiWidth() {
return xSize;
}
public GuiBase setGuiWidth(int width) {
this.xSize = width;
return this;
}
public int getGuiHeight() {
return ySize;
}
public GuiBase setGuiHeight(int height) {
this.ySize = height;
return this;
}
public FontRenderer getFontRenderer() {
return fontRendererObj;
}
public GuiComponent getGuiComponent(String id) {
return guiComponentMap.get(id);
}
public GuiComponent getFirstGuiComponentAt(int positionX, int positionY) {
for (GuiComponent guiComponent : getGuiComponents()) {
if (guiComponent.intersectsWith(positionX, positionY)) {
return guiComponent;
}
}
return null;
}
public GuiComponent getTopGuiComponentAt(int positionX, int positionY) {
TreeSet<GuiComponent> guiComponents
= new TreeSet<GuiComponent>(GuiComponent.zIndexComparator);
for (GuiComponent guiComponent : getGuiComponents()) {
if (guiComponent.intersectsWith(positionX, positionY)) {
guiComponents.add(guiComponent);
}
}
if (!guiComponents.isEmpty()) {
return guiComponents.first();
} else {
return null;
}
}
public Collection<GuiComponent> getGuiComponents() {
return guiComponentMap.values();
}
public Collection<GuiComponent> getGuiComponentsAt(int positionX, int positionY) {
Collection<GuiComponent> intersectingGuiComponents
= new ArrayList<GuiComponent>();
for (GuiComponent guiComponent : getGuiComponents()) {
if (guiComponent.intersectsWith(positionX, positionY)) {
intersectingGuiComponents.add(guiComponent);
}
}
return intersectingGuiComponents;
}
public Collection<GuiComponent>
getGuiComponentsAt(int positionX, int positionY, int zIndex) {
Collection<GuiComponent> intersectingGuiComponents
= new ArrayList<GuiComponent>();
for (GuiComponent guiComponent : getGuiComponents()) {
if (guiComponent.intersectsWith(positionX, positionY, zIndex)) {
intersectingGuiComponents.add(guiComponent);
}
}
return intersectingGuiComponents;
}
public GuiBase addGuiComponent(GuiComponent guiComponent) {
this.guiComponentMap.put(guiComponent.getId(), guiComponent);
return this;
}
public GuiBase addGuiComponents(Collection<GuiComponent> guiComponents) {
for (GuiComponent guiComponent : guiComponents) {
this.guiComponentMap.put(guiComponent.getId(), guiComponent);
}
return this;
}
public void clearGuiComponents() {
this.guiComponentMap.clear();
}
@Override
public void initGui() {
super.initGui();
// A bunch of different impls clear the list of components here - no reason I can
// discern why at this point
for (GuiComponent guiComponent : getGuiComponents()) {
guiComponent.onInit();
}
}
@Override
public void onGuiClosed() {
super.onGuiClosed();
for (GuiComponent guiComponent : getGuiComponents()) {
guiComponent.onClose();
}
}
// Keyboard
@Override
protected void keyTyped(char characterTyped, int keyPressed) {
for (GuiComponent guiComponent : getGuiComponents()) {
if (guiComponent.onKeyPress(characterTyped, keyPressed)) {
return;
}
}
super.keyTyped(characterTyped, keyPressed);
}
// Mouse
@Override
public void handleMouseInput() {
// TODO
super.handleMouseInput();
}
@Override
protected void mouseClicked(int rawMouseX, int rawMouseY, int mouseButton) {
// TODO
super.mouseClicked(rawMouseX, rawMouseY, mouseButton);
}
@Override
protected void mouseMovedOrUp(int rawMouseX, int rawMouseY, int mouseButton) {
// TODO
super.mouseMovedOrUp(rawMouseX, rawMouseY, mouseButton);
}
@Override
protected void
mouseClickMove(int rawMouseX, int rawMouseY, int mouseButton, long duration) {}
public Slot getSlotAtPosition(int rawMouseX, int rawMouseY) {
Iterator iterator = this.inventorySlots.inventorySlots.iterator();
while (iterator.hasNext()) {
Slot slot = (Slot) iterator.next();
if (this.isMouseOverSlot(slot, rawMouseX, rawMouseY)) {
return slot;
}
}
return null;
}
public boolean isMouseOverSlot(Slot slot, int rawMouseX, int rawMouseY) {
return this.isMouseOverSlot(
slot.xDisplayPosition, slot.yDisplayPosition, 16, 16, rawMouseX, rawMouseY
);
}
protected boolean isMouseOverSlot(
int slotPositionX,
int slotPositionY,
int slotWidth,
int slotHeight,
int rawMouseX,
int rawMouseY
) {
rawMouseX -= getGuiPositionX();
rawMouseY -= getGuiPositionX();
return (rawMouseX >= slotPositionX - 1)
&& (rawMouseX < slotPositionX + slotWidth + 1)
&& (rawMouseY >= slotPositionY - 1)
&& (rawMouseY < slotPositionY + slotHeight + 1);
}
@Override
public void drawScreen(int rawMouseX, int rawMouseY, float partialTicks) {
super.drawScreen(rawMouseX, rawMouseY, partialTicks);
updateAdjustedMousePosition(rawMouseX, rawMouseY);
for (GuiComponent guiComponent : getGuiComponents()) {
if (guiComponent.intersectsWith(getAdjustedMouseX(), getAdjustedMouseY())) {
guiComponent.onMouseOver(
getAdjustedMouseX(), getAdjustedMouseY(), partialTicks
);
}
}
}
@Override
protected void drawGuiContainerForegroundLayer(int rawMouseX, int rawMouseY) {
// Draw text
if (shouldDrawTitle && title != null) {
getFontRenderer().drawString(
StringHelper.localize(title),
RenderUtils.getCenteredTextOffset(
getFontRenderer(), StringHelper.localize(title), getGuiWidth()
),
6,
0x404040
);
}
// Draw components
drawComponents(true, rawMouseX, rawMouseY, 0);
}
@Override
protected void
drawGuiContainerBackgroundLayer(float partialTicks, int rawMouseX, int rawMouseY) {
// Draw background
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
if (texture != null) {
RenderUtils.bindTexture(texture);
int xStart = (getScreenWidth() - getGuiWidth()) / 2;
int yStart = (getScreenHeight() - getGuiHeight()) / 2;
this.drawTexturedModalRect(
xStart, yStart, 0, 0, getGuiWidth(), getGuiHeight()
);
}
// Draw components
GL11.glPushMatrix();
GL11.glTranslatef(getGuiPositionX(), getGuiPositionY(), 0.0F);
drawComponents(false, rawMouseX, rawMouseY, partialTicks);
GL11.glPopMatrix();
}
protected void drawComponents(
boolean drawForeground, int rawMouseX, int rawMouseY, float partialTicks
) {
for (GuiComponent guiComponent : getGuiComponents()) {
if (guiComponent.isVisible()) {
if (drawForeground) {
guiComponent.drawForeground(rawMouseX, rawMouseY, partialTicks);
} else {
guiComponent.drawBackground(rawMouseX, rawMouseY, partialTicks);
}
}
}
}
}