Files
ReplayModCinematic/src/main/java/eu/crushedpixel/replaymod/gui/GuiEditKeyframe.java
johni0702 a058497727 Fix all warnings
Add and make use of Lombok
Remove Mojang API
Remove ZipFileUtils
Remove StreamTools in favor of Apache IOUtils
Keyframe should be abstract all derivatives final
Replace clone in Keyframe with copy
Move some constants from GuiReplaySetttings to GuiConstants
2015-06-29 21:45:37 +02:00

292 lines
14 KiB
Java

package eu.crushedpixel.replaymod.gui;
import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.events.KeyframesModifyEvent;
import eu.crushedpixel.replaymod.gui.elements.GuiAdvancedTextField;
import eu.crushedpixel.replaymod.gui.elements.GuiArrowButton;
import eu.crushedpixel.replaymod.gui.elements.GuiNumberInput;
import eu.crushedpixel.replaymod.holders.*;
import eu.crushedpixel.replaymod.replay.ReplayHandler;
import eu.crushedpixel.replaymod.utils.TimestampUtils;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.resources.I18n;
import net.minecraftforge.fml.common.FMLCommonHandler;
import org.lwjgl.input.Keyboard;
import java.awt.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class GuiEditKeyframe extends GuiScreen {
private boolean initialized = false;
private GuiButton saveButton, cancelButton;
private GuiArrowButton leftButton, rightButton;
private GuiNumberInput xCoord, yCoord, zCoord, pitch, yaw, roll;
private GuiNumberInput min, sec, ms;
private GuiAdvancedTextField markerNameInput;
private List<GuiTextField> inputs = new ArrayList<GuiTextField>();
private List<GuiTextField> posInputs = new ArrayList<GuiTextField>();
private int virtualHeight = 200;
private int virtualY;
private Keyframe keyframe;
private Keyframe keyframeBackup;
private boolean save;
private boolean posKeyframe;
private boolean markerKeyframe;
private Keyframe previous, next;
private int w2;
private int w3;
private int totalWidth;
private int left;
private String screenTitle;
public GuiEditKeyframe(Keyframe keyframe) {
this.keyframe = keyframe;
this.keyframeBackup = keyframe.copy();
this.posKeyframe = keyframe instanceof PositionKeyframe;
boolean timeKeyframe = keyframe instanceof TimeKeyframe;
this.markerKeyframe = keyframe instanceof MarkerKeyframe;
ReplayHandler.selectKeyframe(null);
if(posKeyframe) {
previous = ReplayHandler.getPreviousPositionKeyframe(keyframe.getRealTimestamp() - 1);
next = ReplayHandler.getNextPositionKeyframe(keyframe.getRealTimestamp() + 1);
screenTitle = I18n.format("replaymod.gui.editkeyframe.title.pos");
} else if(timeKeyframe) {
previous = ReplayHandler.getPreviousTimeKeyframe(keyframe.getRealTimestamp() - 1);
next = ReplayHandler.getNextTimeKeyframe(keyframe.getRealTimestamp() + 1);
screenTitle = I18n.format("replaymod.gui.editkeyframe.title.time");
} else if(markerKeyframe) {
previous = ReplayHandler.getPreviousMarkerKeyframe(keyframe.getRealTimestamp() - 1);
next = ReplayHandler.getNextMarkerKeyframe(keyframe.getRealTimestamp() + 1);
screenTitle = I18n.format("replaymod.gui.editkeyframe.title.marker");
}
ReplayHandler.selectKeyframe(keyframe);
ReplayMod.replaySender.setReplaySpeed(0);
}
@Override
public void initGui() {
Keyboard.enableRepeatEvents(true);
virtualY = this.height - virtualHeight - 10;
if(!initialized) {
saveButton = new GuiButton(GuiConstants.KEYFRAME_EDITOR_SAVE_BUTTON, 0, 0, 100, 20, I18n.format("replaymod.gui.save"));
cancelButton = new GuiButton(GuiConstants.KEYFRAME_EDITOR_CANCEL_BUTTON, 0, 0, 100, 20, I18n.format("replaymod.gui.cancel"));
leftButton = new GuiArrowButton(GuiConstants.KEYFRAME_EDITOR_LEFT_BUTTON, 0, 0, "", GuiArrowButton.Direction.LEFT);
rightButton = new GuiArrowButton(GuiConstants.KEYFRAME_EDITOR_RIGHT_BUTTON, 0, 0, "", GuiArrowButton.Direction.RIGHT);
leftButton.enabled = previous != null;
rightButton.enabled = next != null;
//Real Time Input
int timestamp = keyframe.getRealTimestamp();
min = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_REAL_MIN_INPUT, fontRendererObj, 0, 0, 30, 0, 9, TimestampUtils.getMinutesFromTimestamp(timestamp), false);
sec = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_REAL_SEC_INPUT, fontRendererObj, 0, 0, 25, 0, 59, TimestampUtils.getSecondsFromTimestamp(timestamp), false);
ms = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_REAL_SEC_INPUT, fontRendererObj, 0, 0, 35, 0, 999, TimestampUtils.getMillisecondsFromTimestamp(timestamp), false);
inputs.add(min);
inputs.add(sec);
inputs.add(ms);
//Position/Virtual Time Input
if(posKeyframe) {
Position pos = ((PositionKeyframe)keyframe).getPosition();
xCoord = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_X_INPUT, fontRendererObj, 0, 0, 100, null, null, round(pos.getX()), true);
yCoord = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_Y_INPUT, fontRendererObj, 0, 0, 100, null, null, round(pos.getY()), true);
zCoord = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_Z_INPUT, fontRendererObj, 0, 0, 100, null, null, round(pos.getZ()), true);
yaw = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_YAW_INPUT, fontRendererObj, 0, 0, 100, -90d, 90d, round(pos.getYaw()), true);
pitch = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_PITCH_INPUT, fontRendererObj, 0, 0, 100, -180d, 180d, round(pos.getPitch()), true);
roll = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_ROLL_INPUT, fontRendererObj, 0, 0, 100, null, null, round(pos.getRoll()), true);
posInputs.add(xCoord);
posInputs.add(yCoord);
posInputs.add(zCoord);
posInputs.add(yaw);
posInputs.add(pitch);
posInputs.add(roll);
inputs.addAll(posInputs);
} else if(markerKeyframe) {
markerNameInput = new GuiAdvancedTextField(fontRendererObj, 0, 0, 300, 20);
markerNameInput.setText(((MarkerKeyframe)keyframe).getName() == null ? "" : ((MarkerKeyframe)keyframe).getName());
inputs.add(markerNameInput);
markerNameInput.hint = I18n.format("replaymod.gui.editkeyframe.markername");
}
}
w3 = fontRendererObj.getStringWidth(I18n.format("replaymod.gui.editkeyframe.timelineposition")+":")+10+
fontRendererObj.getStringWidth(I18n.format("replaymod.gui.minutes"))+5+min.width+5+
fontRendererObj.getStringWidth(I18n.format("replaymod.gui.seconds"))+5+sec.width+5+
fontRendererObj.getStringWidth(I18n.format("replaymod.gui.milliseconds"))+5+ms.width;
int l = (this.width-w3)/2;
min.xPosition = fontRendererObj.getStringWidth(I18n.format("replaymod.gui.editkeyframe.timelineposition")+":")+10 + l;
sec.xPosition = fontRendererObj.getStringWidth(I18n.format("replaymod.gui.editkeyframe.timelineposition")+":")+10 + l +
min.width + 5 + fontRendererObj.getStringWidth(I18n.format("replaymod.gui.minutes")) + 5;
ms.xPosition = fontRendererObj.getStringWidth(I18n.format("replaymod.gui.editkeyframe.timelineposition")+":")+10 + l +
min.width + 5 + fontRendererObj.getStringWidth(I18n.format("replaymod.gui.minutes")) + 5
+ sec.width + 5 + fontRendererObj.getStringWidth(I18n.format("replaymod.gui.seconds")) + 5;
min.yPosition = sec.yPosition = ms.yPosition = virtualY+virtualHeight-65;
if(posKeyframe) {
int w = Math.max(fontRendererObj.getStringWidth(I18n.format("replaymod.gui.editkeyframe.xpos")),
Math.max(fontRendererObj.getStringWidth(I18n.format("replaymod.gui.editkeyframe.ypos")),
fontRendererObj.getStringWidth(I18n.format("replaymod.gui.editkeyframe.zpos"))));
w2 = Math.max(fontRendererObj.getStringWidth(I18n.format("replaymod.gui.editkeyframe.camyaw")),
Math.max(fontRendererObj.getStringWidth(I18n.format("replaymod.gui.editkeyframe.campitch")),
fontRendererObj.getStringWidth(I18n.format("replaymod.gui.editkeyframe.camroll"))));
totalWidth = w +100+w2+100+5+5+10;
left = (this.width - totalWidth)/2;
int x = w + left + 5;
int i = 0;
for(GuiTextField input : posInputs) {
input.xPosition = i < 3 ? x : left+totalWidth-100;
input.yPosition = i < 3 ? virtualY + 20 + i*30 : virtualY + 20 + (i-3)*30;
i++;
}
} else if(markerKeyframe) {
markerNameInput.xPosition = (width-markerNameInput.width)/2;
markerNameInput.yPosition = virtualY + (virtualHeight-markerNameInput.height)/2;
}
saveButton.yPosition = cancelButton.yPosition = virtualY + virtualHeight - 20 - 5;
saveButton.xPosition = this.width - 100 - 5 - 10;
cancelButton.xPosition = saveButton.xPosition - 100 - 5;
@SuppressWarnings("unchecked")
List<GuiButton> buttonList = this.buttonList;
buttonList.add(saveButton);
buttonList.add(cancelButton);
leftButton.xPosition = 15;
rightButton.xPosition = width-35;
leftButton.yPosition = rightButton.yPosition = virtualY + ((virtualHeight - leftButton.height)/2);
buttonList.add(leftButton);
buttonList.add(rightButton);
initialized = true;
}
@Override
public void onGuiClosed() {
if(!save) {
ReplayHandler.removeKeyframe(keyframe);
ReplayHandler.addKeyframe(keyframeBackup);
ReplayHandler.selectKeyframe(keyframeBackup);
} else {
keyframe.setRealTimestamp(TimestampUtils.calculateTimestamp(min.getIntValue(), sec.getIntValue(), ms.getIntValue()));
if(posKeyframe) {
((PositionKeyframe)keyframe).setPosition(new Position(xCoord.getPreciseValue(), yCoord.getPreciseValue(),
zCoord.getPreciseValue(), new Float(pitch.getPreciseValue()), (float)yaw.getPreciseValue(),
(float)roll.getPreciseValue()));
} else if(markerKeyframe) {
((MarkerKeyframe)keyframe).setName(markerNameInput.getText().trim());
}
}
FMLCommonHandler.instance().bus().post(new KeyframesModifyEvent(ReplayHandler.getKeyframes()));
Keyboard.enableRepeatEvents(false);
}
@Override
protected void keyTyped(char typedChar, int keyCode) throws IOException {
for(GuiTextField input : inputs) {
if(input != null) input.textboxKeyTyped(typedChar, keyCode);
}
if(keyCode == Keyboard.KEY_ESCAPE) {
save = false;
mc.displayGuiScreen(null);
}
}
@Override
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
for(GuiTextField input : inputs) {
if(input != null) input.mouseClicked(mouseX, mouseY, mouseButton);
}
super.mouseClicked(mouseX, mouseY, mouseButton);
}
@Override
public void updateScreen() {
for(GuiTextField input : inputs) {
if(input != null) input.updateCursorCounter();
}
}
@Override
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
drawGradientRect(10, virtualY, width - 10, virtualY + virtualHeight, -1072689136, -804253680);
drawCenteredString(fontRendererObj, screenTitle, this.width / 2, virtualY + 5, Color.WHITE.getRGB());
drawString(fontRendererObj, I18n.format("replaymod.gui.editkeyframe.timelineposition")+":", (width-w3)/2, min.yPosition + 7, Color.WHITE.getRGB());
drawString(fontRendererObj, I18n.format("replaymod.gui.minutes"), min.xPosition + min.width + 5, min.yPosition + 7, Color.WHITE.getRGB());
drawString(fontRendererObj, I18n.format("replaymod.gui.seconds"), sec.xPosition+sec.width+5, sec.yPosition+7, Color.WHITE.getRGB());
drawString(fontRendererObj, I18n.format("replaymod.gui.milliseconds"), ms.xPosition+ms.width+5, ms.yPosition+7, Color.WHITE.getRGB());
if(posKeyframe) {
drawString(fontRendererObj, I18n.format("replaymod.gui.editkeyframe.xpos"), left, virtualY + 27, Color.WHITE.getRGB());
drawString(fontRendererObj, I18n.format("replaymod.gui.editkeyframe.ypos"), left, virtualY + 57, Color.WHITE.getRGB());
drawString(fontRendererObj, I18n.format("replaymod.gui.editkeyframe.zpos"), left, virtualY + 87, Color.WHITE.getRGB());
drawString(fontRendererObj, I18n.format("replaymod.gui.editkeyframe.camyaw"), left+totalWidth-100-5-w2, virtualY + 27, Color.WHITE.getRGB());
drawString(fontRendererObj, I18n.format("replaymod.gui.editkeyframe.campitch"), left+totalWidth-100-5-w2, virtualY + 57, Color.WHITE.getRGB());
drawString(fontRendererObj, I18n.format("replaymod.gui.editkeyframe.camroll"), left+totalWidth-100-5-w2, virtualY + 87, Color.WHITE.getRGB());
}
for(GuiTextField input : inputs) {
if(input != null) input.drawTextBox();
}
super.drawScreen(mouseX, mouseY, partialTicks);
}
private double round(double val) {
return Math.round(val*100.0) / 100.0;
}
@Override
protected void actionPerformed(GuiButton button) throws IOException {
if(!button.enabled) return;
if(button.id == GuiConstants.KEYFRAME_EDITOR_SAVE_BUTTON) {
save = true;
mc.displayGuiScreen(null);
} else if(button.id == GuiConstants.KEYFRAME_EDITOR_CANCEL_BUTTON) {
save = false;
mc.displayGuiScreen(null);
} else if(button.id == GuiConstants.KEYFRAME_EDITOR_LEFT_BUTTON) {
save = false;
mc.displayGuiScreen(new GuiEditKeyframe(previous));
} else if(button.id == GuiConstants.KEYFRAME_EDITOR_RIGHT_BUTTON) {
save = false;
mc.displayGuiScreen(new GuiEditKeyframe(next));
}
}
}