Use component like system for gui overlay
Add missing abort path replay button
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user