From b5c246e65a089e44e33739041e628121f9d44f3d Mon Sep 17 00:00:00 2001 From: Pahimar Date: Tue, 22 Dec 2015 15:52:20 -0500 Subject: [PATCH] Bit more work on gui framework --- .../com/pahimar/ee3/client/gui/GuiBase.java | 96 ++++++++++++------- .../client/gui/component/GuiComponent.java | 70 +++++++++----- 2 files changed, 111 insertions(+), 55 deletions(-) diff --git a/src/main/java/com/pahimar/ee3/client/gui/GuiBase.java b/src/main/java/com/pahimar/ee3/client/gui/GuiBase.java index 52ea1172..fb889a80 100644 --- a/src/main/java/com/pahimar/ee3/client/gui/GuiBase.java +++ b/src/main/java/com/pahimar/ee3/client/gui/GuiBase.java @@ -11,10 +11,7 @@ import net.minecraft.inventory.Container; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Map; -import java.util.TreeMap; +import java.util.*; @SideOnly(Side.CLIENT) public abstract class GuiBase extends GuiContainer { @@ -25,6 +22,9 @@ public abstract class GuiBase extends GuiContainer { private boolean shouldDrawTitle = true; private String activeGuiComponentId = null; + private int adjustedMouseX = 0; + private int adjustedMouseY = 0; + public GuiBase(Container container) { this(null, container); } @@ -65,6 +65,28 @@ public abstract class GuiBase extends GuiContainer { 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; } @@ -117,8 +139,8 @@ public abstract class GuiBase extends GuiContainer { return guiComponentMap.get(id); } - public GuiComponent getGuiComponentAt(int positionX, int positionY) { - for (GuiComponent guiComponent : guiComponentMap.values()) { + public GuiComponent getFirstGuiComponentAt(int positionX, int positionY) { + for (GuiComponent guiComponent : getGuiComponents()) { if (guiComponent.intersectsWith(positionX, positionY)) { return guiComponent; } @@ -127,14 +149,19 @@ public abstract class GuiBase extends GuiContainer { return null; } - public GuiComponent getGuiComponentAt(int positionX, int positionY, int zIndex) { - for (GuiComponent guiComponent : guiComponentMap.values()) { - if (guiComponent.intersectsWith(positionX, positionY, zIndex)) { - return guiComponent; + public GuiComponent getTopGuiComponentAt(int positionX, int positionY) { + TreeSet guiComponents = new TreeSet(GuiComponent.zIndexComparator); + for (GuiComponent guiComponent : getGuiComponents()) { + if (guiComponent.intersectsWith(positionX, positionY)) { + guiComponents.add(guiComponent); } } - return null; + if (!guiComponents.isEmpty()) { + return guiComponents.first(); + } else { + return null; + } } public Collection getGuiComponents() { @@ -144,7 +171,7 @@ public abstract class GuiBase extends GuiContainer { public Collection getGuiComponentsAt(int positionX, int positionY) { Collection intersectingGuiComponents = new ArrayList(); - for (GuiComponent guiComponent : guiComponentMap.values()) { + for (GuiComponent guiComponent : getGuiComponents()) { if (guiComponent.intersectsWith(positionX, positionY)) { intersectingGuiComponents.add(guiComponent); } @@ -156,7 +183,7 @@ public abstract class GuiBase extends GuiContainer { public Collection getGuiComponentsAt(int positionX, int positionY, int zIndex) { Collection intersectingGuiComponents = new ArrayList(); - for (GuiComponent guiComponent : guiComponentMap.values()) { + for (GuiComponent guiComponent : getGuiComponents()) { if (guiComponent.intersectsWith(positionX, positionY, zIndex)) { intersectingGuiComponents.add(guiComponent); } @@ -186,9 +213,9 @@ public abstract class GuiBase extends GuiContainer { public void initGui() { super.initGui(); - // A bunch of different impls clear the list of components here - no reason I can gather why at this point + // A bunch of different impls clear the list of components here - no reason I can discern why at this point - for (GuiComponent guiComponent : guiComponentMap.values()) { + for (GuiComponent guiComponent : getGuiComponents()) { guiComponent.onInit(); } } @@ -197,32 +224,40 @@ public abstract class GuiBase extends GuiContainer { public void onGuiClosed() { super.onGuiClosed(); - for (GuiComponent guiComponent : guiComponentMap.values()) { + for (GuiComponent guiComponent : getGuiComponents()) { guiComponent.onClose(); } } @Override - public void drawScreen(int mouseX, int mouseY, float partialTicks) { - super.drawScreen(mouseX, mouseY, partialTicks); + public void drawScreen(int rawMouseX, int rawMouseY, float partialTicks) { + super.drawScreen(rawMouseX, rawMouseY, partialTicks); - for (GuiComponent guiComponent : guiComponentMap.values()) { - guiComponent.onUpdate(mouseX, mouseY, partialTicks); + updateAdjustedMousePosition(rawMouseX, rawMouseY); + + for (GuiComponent guiComponent : getGuiComponents()) { + if (guiComponent.intersectsWith(getAdjustedMouseX(), getAdjustedMouseY())) { + guiComponent.onMouseOver(getAdjustedMouseX(), getAdjustedMouseY(), partialTicks); + } } } @Override - protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { + 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); } - drawComponents(true); + + // Draw components + drawComponents(true, rawMouseX, rawMouseY, 0); } @Override - protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { + 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); @@ -231,25 +266,22 @@ public abstract class GuiBase extends GuiContainer { this.drawTexturedModalRect(xStart, yStart, 0, 0, getGuiWidth(), getGuiHeight()); } + // Draw components GL11.glPushMatrix(); GL11.glTranslatef(getGuiPositionX(), getGuiPositionY(), 0.0F); - drawComponents(false, partialTicks); + drawComponents(false, rawMouseX, rawMouseY, partialTicks); GL11.glPopMatrix(); } - protected void drawComponents(boolean drawForeground) { - drawComponents(drawForeground, 0); - } + protected void drawComponents(boolean drawForeground, int rawMouseX, int rawMouseY, float partialTicks) { - protected void drawComponents(boolean drawForeground, float partialTicks) { - - for (GuiComponent guiComponent : guiComponentMap.values()) { + for (GuiComponent guiComponent : getGuiComponents()) { if (guiComponent.isVisible()) { if (drawForeground) { - guiComponent.drawForeground(partialTicks); + guiComponent.drawForeground(rawMouseX, rawMouseY, partialTicks); } else { - guiComponent.drawBackground(partialTicks); + guiComponent.drawBackground(rawMouseX, rawMouseY, partialTicks); } } } diff --git a/src/main/java/com/pahimar/ee3/client/gui/component/GuiComponent.java b/src/main/java/com/pahimar/ee3/client/gui/component/GuiComponent.java index f66b9a6a..e7b49b7e 100644 --- a/src/main/java/com/pahimar/ee3/client/gui/component/GuiComponent.java +++ b/src/main/java/com/pahimar/ee3/client/gui/component/GuiComponent.java @@ -3,12 +3,53 @@ package com.pahimar.ee3.client.gui.component; import com.pahimar.ee3.client.gui.GuiBase; import net.minecraft.util.ResourceLocation; +import java.util.Comparator; + public abstract class GuiComponent implements Comparable { + public static Comparator orderingComparator = new Comparator() { + + @Override + public int compare(GuiComponent guiComponent1, GuiComponent guiComponent2) { + if (guiComponent1.ordering == guiComponent2.ordering) { + if (guiComponent1.zIndex == guiComponent2.zIndex) { + if (guiComponent1.id != null && guiComponent2.id != null) { + return guiComponent1.id.compareToIgnoreCase(guiComponent2.id); + } else { + return guiComponent1.hashCode() - guiComponent2.hashCode(); + } + } else { + // Purposefully sorting so that higher z-indices appear first in the map + return guiComponent2.zIndex - guiComponent1.zIndex; + } + } else { + return guiComponent1.ordering - guiComponent2.ordering; + } + } + }; + public static Comparator zIndexComparator = new Comparator() { + + @Override + public int compare(GuiComponent guiComponent1, GuiComponent guiComponent2) { + if (guiComponent1.zIndex == guiComponent2.zIndex) { + if (guiComponent1.ordering == guiComponent2.ordering) { + if (guiComponent1.id != null && guiComponent2.id != null) { + return guiComponent1.id.compareToIgnoreCase(guiComponent2.id); + } else { + return guiComponent1.hashCode() - guiComponent2.hashCode(); + } + } else { + return guiComponent1.ordering - guiComponent2.ordering; + } + } else { + // Purposefully sorting so that higher z-indices appear first in the map + return guiComponent2.zIndex - guiComponent1.zIndex; + } + } + }; protected final GuiBase parentGui; protected final String id; protected ResourceLocation texture; - protected int positionX, positionY, componentWidth, componentHeight, textureWidth, textureHeight; protected int ordering = 0; protected int zIndex = 0; @@ -153,11 +194,11 @@ public abstract class GuiComponent implements Comparable { return this; } - public abstract void drawForeground(float partialTicks); + public abstract void drawForeground(int rawMouseX, int rawMouseY, float partialTicks); - public abstract void drawBackground(float partialTicks); + public abstract void drawBackground(int rawMouseX, int rawMouseY, float partialTicks); - public abstract void onUpdate(int mouseX, int mouseY, float partialTicks); + public abstract void onUpdate(int rawMouseX, int rawMouseY, float partialTicks); /** * Checks whether or not the specified coordinate intersects with this GuiComponent @@ -194,14 +235,10 @@ public abstract class GuiComponent implements Comparable { public abstract void onMouseEnter(int mouseX, int mouseY); - public abstract void onMouseOver(int mouseX, int mouseY); + public abstract void onMouseOver(int mouseX, int mouseY, float partialTicks); public abstract void onMouseLeave(int mouseX, int mouseY); - public abstract void onKeyDown(int keyPressed); - - public abstract void onKeyUp(int keyPressed); - public abstract void onKeyPress(char characterTyped, int keyPressed); public abstract void onFocusGain(); @@ -228,19 +265,6 @@ public abstract class GuiComponent implements Comparable { */ @Override public int compareTo(GuiComponent guiComponent) { - if (this.ordering == guiComponent.ordering) { - if (this.zIndex == guiComponent.zIndex) { - if (this.id != null && guiComponent.id != null) { - return this.id.compareToIgnoreCase(guiComponent.id); - } else { - return this.hashCode() - guiComponent.hashCode(); - } - } else { - // Purposefully sorting so that higher z-indices appear first in the map - return guiComponent.zIndex - this.zIndex; - } - } else { - return this.ordering - guiComponent.ordering; - } + return orderingComparator.compare(this, guiComponent); } }