Files
ReplayModCinematic/src/main/java/eu/crushedpixel/replaymod/gui/GuiObjectManager.java
CrushedPixel ef39c7466d Renamed the commonly used Position POJO into AdvancedPosition, as it also hold pitch, yaw and roll
Made GuiDropdown only accept instances of GuiEntryListEntry to avoid unneccessary toString() methods returning the name
Added GuiEntryListValueEntry which holds a Value and a Name to be displayed
Continued work on GuiObjectManager
2015-07-10 04:27:15 +02:00

395 lines
16 KiB
Java

package eu.crushedpixel.replaymod.gui;
import eu.crushedpixel.replaymod.assets.CustomImageObject;
import eu.crushedpixel.replaymod.assets.ReplayAsset;
import eu.crushedpixel.replaymod.gui.elements.*;
import eu.crushedpixel.replaymod.gui.elements.listeners.SelectionListener;
import eu.crushedpixel.replaymod.gui.elements.timelines.GuiTimeline;
import eu.crushedpixel.replaymod.gui.overlay.GuiReplayOverlay;
import eu.crushedpixel.replaymod.holders.GuiEntryListValueEntry;
import eu.crushedpixel.replaymod.interpolation.KeyframeList;
import eu.crushedpixel.replaymod.replay.ReplayHandler;
import eu.crushedpixel.replaymod.utils.MouseUtils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.resources.I18n;
import org.lwjgl.util.Point;
import java.awt.*;
import java.io.IOException;
import java.util.UUID;
public class GuiObjectManager extends GuiScreen {
private boolean initialized = false;
private KeyframeList[] keyframeLists;
private GuiEntryList<CustomImageObject> objectList;
private GuiAdvancedButton addButton, removeButton;
private GuiAdvancedTextField nameInput;
private GuiString dropdownLabel;
private GuiDropdown<GuiEntryListValueEntry<UUID>> assetDropdown;
private GuiDraggingNumberInput anchorXInput, anchorYInput, anchorZInput;
private GuiDraggingNumberInput positionXInput, positionYInput, positionZInput;
private GuiDraggingNumberInput scaleXInput, scaleYInput, scaleZInput;
private GuiDraggingNumberInput orientationXInput, orientationYInput, orientationZInput;
private GuiDraggingNumberInput opacityInput;
private GuiObjectKeyframeTimeline objectKeyframeTimeline;
private GuiScrollbar timelineScrollbar;
private GuiTexturedButton zoomInButton, zoomOutButton;
private ComposedElement anchorInputs, positionInputs, scaleInputs, orientationInputs, opacityInputs, numberInputs;
private ComposedElement disableElements, allElements;
private static final int KEYFRAME_BUTTON_X = 80;
private static final int KEYFRAME_BUTTON_Y = 40;
private static final float ZOOM_STEPS = 0.05f;
private DelegatingElement keyframeButton(final int x, final int y, final int line) {
return new DelegatingElement() {
private GuiTexturedButton normal = new GuiTexturedButton(0, x, y, 20, 20,
GuiReplayOverlay.replay_gui, KEYFRAME_BUTTON_X, KEYFRAME_BUTTON_Y,
GuiReplayOverlay.TEXTURE_SIZE, GuiReplayOverlay.TEXTURE_SIZE, new Runnable() {
@Override
public void run() {
addKeyframe(line);
}
},
null);
private GuiTexturedButton selected = new GuiTexturedButton(0, x, y, 20, 20,
GuiReplayOverlay.replay_gui, KEYFRAME_BUTTON_X, KEYFRAME_BUTTON_Y+20,
GuiReplayOverlay.TEXTURE_SIZE, GuiReplayOverlay.TEXTURE_SIZE, new Runnable() {
@Override
public void run() {
removeKeyframe(line);
}
},
null);
@Override
public GuiElement delegate() {
boolean sel = false; //TODO
if(sel) {
return selected;
} else {
return normal;
}
}
@Override
public void setEnabled(boolean enabled) {
selected.setEnabled(enabled);
normal.setEnabled(enabled);
}
};
}
private void addKeyframe(int line) {
}
private void removeKeyframe(int line) {
}
@Override
public void initGui() {
if(!initialized) {
anchorXInput = new GuiDraggingNumberInput(fontRendererObj, 0, 0, 50, null, null, 0d, true);
anchorYInput = new GuiDraggingNumberInput(fontRendererObj, 0, 0, 50, null, null, 0d, true);
anchorZInput = new GuiDraggingNumberInput(fontRendererObj, 0, 0, 50, null, null, 0d, true);
positionXInput = new GuiDraggingNumberInput(fontRendererObj, 0, 0, 50, null, null, 0d, true);
positionYInput = new GuiDraggingNumberInput(fontRendererObj, 0, 0, 50, null, null, 0d, true);
positionZInput = new GuiDraggingNumberInput(fontRendererObj, 0, 0, 50, null, null, 0d, true);
scaleXInput = new GuiDraggingNumberInput(fontRendererObj, 0, 0, 50, null, null, 100d, true, "%");
scaleYInput = new GuiDraggingNumberInput(fontRendererObj, 0, 0, 50, null, null, 100d, true, "%");
scaleZInput = new GuiDraggingNumberInput(fontRendererObj, 0, 0, 50, null, null, 100d, true, "%");
orientationXInput = new GuiDraggingNumberInput(fontRendererObj, 0, 0, 50, null, null, 0d, true);
orientationYInput = new GuiDraggingNumberInput(fontRendererObj, 0, 0, 50, null, null, 0d, true);
orientationZInput = new GuiDraggingNumberInput(fontRendererObj, 0, 0, 50, null, null, 0d, true);
opacityInput = new GuiDraggingNumberInput(fontRendererObj, 0, 0, 50, 0d, 100d, 100d, true, "%");
dropdownLabel = new GuiString(0, 0, Color.WHITE, I18n.format("replaymod.gui.assets.filechooser")+": ");
assetDropdown = new GuiDropdown<GuiEntryListValueEntry<UUID>>(fontRendererObj, 0, 0, 0, 5);
if(ReplayHandler.getAssetRepository().getCopyOfReplayAssets().isEmpty()) {
assetDropdown.addElement(new GuiEntryListValueEntry<UUID>(I18n.format("replaymod.gui.assets.emptylist"), null));
} else {
for(ReplayAsset asset : ReplayHandler.getAssetRepository().getCopyOfReplayAssets()) {
assetDropdown.addElement(new GuiEntryListValueEntry<UUID>(
asset.getDisplayString(), ReplayHandler.getAssetRepository().getUUIDForAsset(asset)));
}
}
objectList = new GuiEntryList<CustomImageObject>(fontRendererObj, 0, 0, 0, 0);
objectList.setEmptyMessage(I18n.format("replaymod.gui.objects.empty"));
addButton = new GuiAdvancedButton(0, 0, 0, 20, I18n.format("replaymod.gui.add"), new Runnable() {
@Override
public void run() {
CustomImageObject customImageObject = new CustomImageObject(I18n.format("replaymod.gui.objects.defaultname"), null);
objectList.addElement(customImageObject);
}
}, null);
removeButton = new GuiAdvancedButton(0, 0, 0, 20, I18n.format("replaymod.gui.remove"), new Runnable() {
@Override
public void run() {
if(objectList.getElement(objectList.getSelectionIndex()) != null)
objectList.removeElement(objectList.getSelectionIndex());
}
}, null);
nameInput = new GuiAdvancedTextField(fontRendererObj, 0, 0, 0, 20);
nameInput.hint = I18n.format("replaymod.gui.objects.properties.name");
keyframeLists = new KeyframeList[5];
objectList.addSelectionListener(new SelectionListener() {
@Override
public void onSelectionChanged(int selectionIndex) {
CustomImageObject selectedObject = objectList.getElement(selectionIndex);
if(selectedObject != null) {
disableElements.setEnabled(true);
} else {
disableElements.setEnabled(false);
}
}
});
}
String[] labelStrings = new String[] {
I18n.format("replaymod.gui.objects.properties.anchor"),
I18n.format("replaymod.gui.objects.properties.position"),
I18n.format("replaymod.gui.objects.properties.scale"),
I18n.format("replaymod.gui.objects.properties.orientation"),
I18n.format("replaymod.gui.objects.properties.opacity"),
};
int maxStringWidth = 0;
for(String label : labelStrings) {
int stringWidth = fontRendererObj.getStringWidth(label);
if(stringWidth > maxStringWidth) {
maxStringWidth = stringWidth;
}
}
disableElements = new ComposedElement();
allElements = new ComposedElement();
int inputWidth = 40;
anchorInputs = new ComposedElement(anchorXInput, anchorYInput, anchorZInput);
positionInputs = new ComposedElement(positionXInput, positionYInput, positionZInput);
scaleInputs = new ComposedElement(scaleXInput, scaleYInput, scaleZInput);
orientationInputs = new ComposedElement(orientationXInput, orientationYInput, orientationZInput);
opacityInputs = new ComposedElement(opacityInput);
numberInputs = new ComposedElement(anchorInputs, positionInputs, scaleInputs, orientationInputs, opacityInputs);
for(int i = numberInputs.getParts().length-1; i >= 0; i--) {
int yPos = this.height-5-10-(25*(numberInputs.getParts().length-i));
DelegatingElement button = keyframeButton(10, yPos, i);
GuiString label = new GuiString(35, yPos + 6, Color.WHITE, labelStrings[i]);
ComposedElement child = (ComposedElement)numberInputs.getParts()[i];
int x = 0;
for(GuiElement el : child.getParts()) {
GuiDraggingNumberInput dni = (GuiDraggingNumberInput)el;
dni.width = inputWidth;
dni.xPosition = 35+maxStringWidth+5 + (x*(inputWidth+5));
dni.yPosition = yPos;
x++;
}
child.addPart(button);
child.addPart(label);
disableElements.addPart(child);
}
int timelineX = anchorZInput.xPosition + anchorZInput.width + 5 - 1;
int timelineY = anchorZInput.yPosition - 1;
int timelineWidth = this.width-10-timelineX + 2;
int timelineHeight = this.height-10-10-timelineY + 2;
objectKeyframeTimeline = new GuiObjectKeyframeTimeline(timelineX, timelineY, timelineWidth, timelineHeight, keyframeLists);
disableElements.addPart(objectKeyframeTimeline);
timelineScrollbar = new GuiScrollbar(timelineX, this.height-15, timelineWidth-21) {
@Override
public void dragged() {
objectKeyframeTimeline.timeStart = (float)sliderPosition;
}
};
timelineScrollbar.size = objectKeyframeTimeline.zoom;
timelineScrollbar.sliderPosition = objectKeyframeTimeline.timeStart;
disableElements.addPart(timelineScrollbar);
zoomInButton = GuiReplayOverlay.texturedButton(width - 28, this.height-15, 40, 20, 9, new Runnable() {
@Override
public void run() {
objectKeyframeTimeline.zoom = Math.max(0.025f, objectKeyframeTimeline.zoom - ZOOM_STEPS);
}
}, "replaymod.gui.ingame.menu.zoomin");
zoomOutButton = GuiReplayOverlay.texturedButton(width - 18, this.height-15, 40, 30, 9, new Runnable() {
@Override
public void run() {
objectKeyframeTimeline.zoom = Math.min(1f, objectKeyframeTimeline.zoom + ZOOM_STEPS);
objectKeyframeTimeline.timeStart = Math.min(objectKeyframeTimeline.timeStart, 1f - objectKeyframeTimeline.zoom);
}
}, "replaymod.gui.ingame.menu.zoomout");
disableElements.addPart(zoomInButton);
disableElements.addPart(zoomOutButton);
objectList.xPosition = 11;
objectList.yPosition = 11;
objectList.width = width/2 - 11 - 5;
int visibleElements = (int)((anchorXInput.yPosition-5 - objectList.yPosition)/14f);
objectList.setVisibleElements(visibleElements);
allElements.addPart(objectList);
nameInput.xPosition = width/2 + 5;
nameInput.yPosition = objectList.yPosition;
nameInput.width = objectList.width;
disableElements.addPart(nameInput);
dropdownLabel.positionX = (width/2)+5;
int strWidth = fontRendererObj.getStringWidth(I18n.format("replaymod.gui.assets.filechooser")+": ");
assetDropdown.xPosition = dropdownLabel.positionX+strWidth+5;
assetDropdown.yPosition = objectList.yPosition+25;
dropdownLabel.positionY = assetDropdown.yPosition + 6;
assetDropdown.width = (objectList.width-strWidth-5);
disableElements.addPart(dropdownLabel);
disableElements.addPart(assetDropdown);
addButton.xPosition = nameInput.xPosition;
addButton.width = removeButton.width = nameInput.width/2 - 2;
removeButton.xPosition = addButton.xPosition + nameInput.width/2 + 2;
addButton.yPosition = removeButton.yPosition = objectList.yPosition+objectList.height-20;
allElements.addPart(addButton);
disableElements.addPart(removeButton);
allElements.addPart(disableElements);
objectList.setSelectionIndex(objectList.getSelectionIndex()); // trigger an event for the SelectionListener
initialized = true;
}
@Override
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
this.drawDefaultBackground();
allElements.draw(mc, mouseX, mouseY);
GlStateManager.enableBlend();
super.drawScreen(mouseX, mouseY, partialTicks);
}
@Override
protected void keyTyped(char typedChar, int keyCode) throws IOException {
Point mousePos = MouseUtils.getMousePos();
allElements.buttonPressed(mc, mousePos.getX(), mousePos.getY(), typedChar, keyCode);
super.keyTyped(typedChar, keyCode);
}
@Override
public void updateScreen() {
allElements.tick(mc);
super.updateScreen();
}
@Override
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
allElements.mouseClick(mc, mouseX, mouseY, mouseButton);
super.mouseClicked(mouseX, mouseY, mouseButton);
}
@Override
protected void mouseClickMove(int mouseX, int mouseY, int mouseButton, long timeSinceLastClick) {
allElements.mouseDrag(mc, mouseX, mouseY, mouseButton);
super.mouseClickMove(mouseX, mouseY, mouseButton, timeSinceLastClick);
}
@Override
protected void mouseReleased(int mouseX, int mouseY, int mouseButton) {
allElements.mouseRelease(mc, mouseX, mouseY, mouseButton);
super.mouseReleased(mouseX, mouseY, mouseButton);
}
public class GuiObjectKeyframeTimeline extends GuiTimeline {
private KeyframeList[] keyframeLists;
public int x, y, width, height;
private boolean dragging = false;
public GuiObjectKeyframeTimeline(int x, int y, int width, int height, KeyframeList... keyframeLists) {
super(x, y, width, height);
this.keyframeLists = keyframeLists;
this.zoom = 0.1;
this.timelineLength = 10 * 60 * 1000;
this.showMarkers = true;
}
@Override
public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) {
if(!enabled) return;
super.mouseClick(mc, mouseX, mouseY, button);
int time = (int) getTimeAt(mouseX, mouseY);
if(time != -1) {
cursorPosition = time;
dragging = true;
}
}
@Override
public void mouseDrag(Minecraft mc, int mouseX, int mouseY, int button) {
if(!enabled) return;
super.mouseDrag(mc, mouseX, mouseY, button);
if(dragging) {
int time = (int) getTimeAt(mouseX, mouseY);
if(time != -1) cursorPosition = time;
}
}
@Override
public void mouseRelease(Minecraft mc, int mouseX, int mouseY, int button) {
if(!enabled) return;
super.mouseRelease(mc, mouseX, mouseY, button);
this.dragging = false;
}
}
}