Use component like system for gui overlay

Add missing abort path replay button
This commit is contained in:
johni0702
2015-05-31 20:48:04 +02:00
parent 53bb338d1b
commit b3451ed7fd
11 changed files with 443 additions and 183 deletions

View File

@@ -0,0 +1,56 @@
package eu.crushedpixel.replaymod.gui.elements;
import net.minecraft.client.Minecraft;
public class ComposedElement implements GuiElement {
private final GuiElement[] parts;
public ComposedElement(GuiElement...parts) {
this.parts = parts;
}
@Override
public void draw(Minecraft mc, int mouseX, int mouseY) {
for (GuiElement part : parts) {
part.draw(mc, mouseX, mouseY);
}
}
@Override
public void drawOverlay(Minecraft mc, int mouseX, int mouseY) {
for (GuiElement part : parts) {
part.drawOverlay(mc, mouseX, mouseY);
}
}
@Override
public boolean isHovering(int mouseX, int mouseY) {
for (GuiElement part : parts) {
if (part.isHovering(mouseX, mouseY)) {
return true;
}
}
return false;
}
@Override
public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) {
for (GuiElement part : parts) {
part.mouseClick(mc, mouseX, mouseY, button);
}
}
@Override
public void mouseDrag(Minecraft mc, int mouseX, int mouseY, int button) {
for (GuiElement part : parts) {
part.mouseDrag(mc, mouseX, mouseY, button);
}
}
@Override
public void mouseRelease(Minecraft mc, int mouseX, int mouseY, int button) {
for (GuiElement part : parts) {
part.mouseRelease(mc, mouseX, mouseY, button);
}
}
}

View File

@@ -0,0 +1,46 @@
package eu.crushedpixel.replaymod.gui.elements;
import net.minecraft.client.Minecraft;
public abstract class DelegatingElement implements GuiElement {
public static DelegatingElement of(final GuiElement element) {
return new DelegatingElement() {
@Override
public GuiElement delegate() {
return element;
}
};
}
public abstract GuiElement delegate();
@Override
public void draw(Minecraft mc, int mouseX, int mouseY) {
delegate().draw(mc, mouseX, mouseY);
}
@Override
public void drawOverlay(Minecraft mc, int mouseX, int mouseY) {
delegate().drawOverlay(mc, mouseX, mouseY);
}
@Override
public boolean isHovering(int mouseX, int mouseY) {
return delegate().isHovering(mouseX, mouseY);
}
@Override
public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) {
delegate().mouseClick(mc, mouseX, mouseY, button);
}
@Override
public void mouseDrag(Minecraft mc, int mouseX, int mouseY, int button) {
delegate().mouseDrag(mc, mouseX, mouseY, button);
}
@Override
public void mouseRelease(Minecraft mc, int mouseX, int mouseY, int button) {
delegate().mouseRelease(mc, mouseX, mouseY, button);
}
}

View File

@@ -0,0 +1,16 @@
package eu.crushedpixel.replaymod.gui.elements;
import net.minecraft.client.Minecraft;
public interface GuiElement {
void draw(Minecraft mc, int mouseX, int mouseY);
void drawOverlay(Minecraft mc, int mouseX, int mouseY);
boolean isHovering(int mouseX, int mouseY);
void mouseClick(Minecraft mc, int mouseX, int mouseY, int button);
void mouseDrag(Minecraft mc, int mouseX, int mouseY, int button);
void mouseRelease(Minecraft mc, int mouseX, int mouseY, int button);
}

View File

@@ -22,7 +22,8 @@ public class GuiKeyframeTimeline extends GuiTimeline {
showMarkers = true;
}
public void mouseClicked(Minecraft mc, int mouseX, int mouseY) {
@Override
public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) {
long time = getTimeAt(mouseX, mouseY);
if (time == -1) {
return;
@@ -58,7 +59,8 @@ public class GuiKeyframeTimeline extends GuiTimeline {
this.clickTime = currentTime;
}
public void mouseDrag(int mouseX, int mouseY) {
@Override
public void mouseDrag(Minecraft mc, int mouseX, int mouseY, int button) {
long time = getTimeAt(mouseX, mouseY);
if (time != -1) {
if (clickedKeyFrame != null) {
@@ -75,8 +77,9 @@ public class GuiKeyframeTimeline extends GuiTimeline {
}
}
public void mouseRelease(int mouseX, int mouseY) {
mouseDrag(mouseX, mouseY);
@Override
public void mouseRelease(Minecraft mc, int mouseX, int mouseY, int button) {
mouseDrag(mc, mouseX, mouseY, button);
clickedKeyFrame = null;
dragging = false;
}

View File

@@ -9,7 +9,7 @@ import static eu.crushedpixel.replaymod.gui.overlay.GuiReplayOverlay.replay_gui;
import static org.lwjgl.opengl.GL11.GL_BLEND;
import static org.lwjgl.opengl.GL11.glEnable;
public class GuiScrollbar extends Gui {
public class GuiScrollbar extends Gui implements GuiElement {
protected static final int BORDER_LEFT = 1;
protected static final int BORDER_RIGHT = 2;
@@ -56,34 +56,31 @@ public class GuiScrollbar extends Gui {
return (int) Math.round((width - BORDER_LEFT - BORDER_RIGHT) * sliderPosition) + BORDER_LEFT;
}
public boolean startDragging(int mouseX, int mouseY) {
int offsetX = getSliderOffsetX();
int minX = positionX + offsetX;
int maxX = positionX + offsetX + (int) (width * size);
int minY = positionY + BORDER_TOP;
int maxY = minY + SLIDER_HEIGHT;
if (mouseX >= minX && mouseY >= minY && mouseX < maxX && mouseY < maxY) {
@Override
public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) {
if (isHovering(mouseX, mouseY)) {
draggingStart = mouseX;
draggingStartPosition = sliderPosition;
return true;
} else {
return false;
}
}
public void doDragging(int mouseX) {
@Override
public void mouseDrag(Minecraft mc, int mouseX, int mouseY, int button) {
if (draggingStart != -1) {
double delta = (double) (mouseX - draggingStart) / (width - BORDER_LEFT - BORDER_RIGHT);
sliderPosition = Math.max(0, Math.min(1 - size, draggingStartPosition + delta));
dragged();
}
}
public void endDragging(int mouseX) {
doDragging(mouseX);
@Override
public void mouseRelease(Minecraft mc, int mouseX, int mouseY, int button) {
mouseDrag(mc, mouseX, mouseY, button);
draggingStart = -1;
}
public void draw(Minecraft mc) {
@Override
public void draw(Minecraft mc, int mouseX, int mouseY) {
GlStateManager.resetColor();
mc.renderEngine.bindTexture(replay_gui);
glEnable(GL_BLEND);
@@ -139,4 +136,23 @@ public class GuiScrollbar extends Gui {
drawModalRectWithCustomSizedTexture(x, y, u, v, width, height, TEXTURE_SIZE, TEXTURE_SIZE);
}
@Override
public void drawOverlay(Minecraft mc, int mouseX, int mouseY) {
}
@Override
public boolean isHovering(int mouseX, int mouseY) {
int offsetX = getSliderOffsetX();
int minX = positionX + offsetX;
int maxX = positionX + offsetX + (int) (width * size);
int minY = positionY + BORDER_TOP;
int maxY = minY + SLIDER_HEIGHT;
return mouseX >= minX && mouseY >= minY && mouseX < maxX && mouseY < maxY;
}
public void dragged() {
}
}

View File

@@ -5,50 +5,85 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.resources.I18n;
import net.minecraft.util.ResourceLocation;
import java.awt.*;
public class GuiTexturedButton extends GuiButton {
public class GuiTexturedButton extends GuiButton implements GuiElement {
private final ResourceLocation texture;
private final int u, v;
private final int textureWidth, textureHeight;
private final String hoverKey;
private final Runnable action;
private final String hoverText;
public GuiTexturedButton(int buttonId, int x, int y, int width, int height, ResourceLocation texture,
int u, int v, int textureWidth, int textureHeight) {
this(buttonId, x, y, width, height, texture, u, v, textureWidth, textureHeight, null);
int u, int v, int textureWidth, int textureHeight, Runnable action) {
this(buttonId, x, y, width, height, texture, u, v, textureWidth, textureHeight, action, null);
}
public GuiTexturedButton(int buttonId, int x, int y, int width, int height, ResourceLocation texture,
int u, int v, int textureWidth, int textureHeight, String hoverKey) {
int u, int v, int textureWidth, int textureHeight, Runnable action, String hoverText) {
super(buttonId, x, y, width, height, "");
this.texture = texture;
this.u = u;
this.v = v;
this.textureWidth = textureWidth;
this.textureHeight = textureHeight;
this.hoverKey = hoverKey;
this.action = action;
this.hoverText = hoverText;
}
@Override
public boolean isHovering(int mouseX, int mouseY) {
return enabled && visible
&& mouseX >= xPosition
&& mouseY >= yPosition
&& mouseX < xPosition + width
&& mouseY < yPosition + height;
}
@Override
public void drawButton(Minecraft mc, int mouseX, int mouseY) {
if (visible) {
hovered = mouseX >= xPosition
&& mouseY >= yPosition
&& mouseX < xPosition + width
&& mouseY < yPosition + height;
hovered = isHovering(mouseX, mouseY);
mc.renderEngine.bindTexture(texture);
GlStateManager.color(1, 1, 1);
int u = this.u + (hovered ? width : 0);
Gui.drawModalRectWithCustomSizedTexture(xPosition, yPosition, u, v, width, height, textureWidth, textureHeight);
if(hovered && hoverKey != null) {
ReplayMod.tooltipRenderer.drawTooltip(mouseX, mouseY, I18n.format(hoverKey), null, Color.WHITE.getRGB());
}
}
}
@Override
public void draw(Minecraft mc, int mouseX, int mouseY) {
drawButton(mc, mouseX, mouseY);
}
@Override
public void drawOverlay(Minecraft mc, int mouseX, int mouseY) {
hovered = isHovering(mouseX, mouseY);
if(hovered && hoverText != null) {
ReplayMod.tooltipRenderer.drawTooltip(mouseX, mouseY, hoverText, null, 0xffffffff);
}
}
@Override
public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) {
if (isHovering(mouseX, mouseY)) {
performAction();
}
}
@Override
public void mouseDrag(Minecraft mc, int mouseX, int mouseY, int button) {
}
@Override
public void mouseRelease(Minecraft mc, int mouseX, int mouseY, int button) {
}
public void performAction() {
action.run();
}
}

View File

@@ -11,7 +11,7 @@ import static eu.crushedpixel.replaymod.gui.overlay.GuiReplayOverlay.replay_gui;
import static org.lwjgl.opengl.GL11.GL_BLEND;
import static org.lwjgl.opengl.GL11.glEnable;
public class GuiTimeline extends Gui {
public class GuiTimeline extends Gui implements GuiElement {
protected static final int TEXTURE_WIDTH = 64;
protected static final int BORDER_TOP = 4;
@@ -146,7 +146,10 @@ public class GuiTimeline extends Gui {
rect(cursorX - 2, positionY + BORDER_TOP, 84, 20, 5, 16);
}
}
@Override
public void drawOverlay(Minecraft mc, int mouseX, int mouseY) {
// Draw time under cursor if the mouse is on the timeline
long mouseTime = getTimeAt(mouseX, mouseY);
if (mouseTime != -1) {
@@ -156,6 +159,26 @@ public class GuiTimeline extends Gui {
}
}
@Override
public boolean isHovering(int mouseX, int mouseY) {
return getTimeAt(mouseX, mouseY) != -1;
}
@Override
public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) {
}
@Override
public void mouseDrag(Minecraft mc, int mouseX, int mouseY, int button) {
}
@Override
public void mouseRelease(Minecraft mc, int mouseX, int mouseY, int button) {
}
protected void rect(int x, int y, int u, int v, int width, int height) {
Minecraft.getMinecraft().renderEngine.bindTexture(replay_gui);
glEnable(GL_BLEND);