package com.replaymod.simplepathing.gui; import com.replaymod.pathing.properties.CameraProperties; import com.replaymod.pathing.properties.TimestampProperty; import com.replaymod.replay.ReplayModReplay; import com.replaymod.replaystudio.pathing.change.Change; import com.replaymod.replaystudio.pathing.change.CombinedChange; import com.replaymod.replaystudio.pathing.change.UpdateKeyframeProperties; import com.replaymod.replaystudio.pathing.path.Keyframe; import com.replaymod.replaystudio.pathing.path.Path; import de.johni0702.minecraft.gui.container.GuiPanel; import de.johni0702.minecraft.gui.element.GuiButton; import de.johni0702.minecraft.gui.element.GuiLabel; import de.johni0702.minecraft.gui.element.GuiNumberField; import de.johni0702.minecraft.gui.element.IGuiLabel; import de.johni0702.minecraft.gui.function.Typeable; import de.johni0702.minecraft.gui.layout.GridLayout; import de.johni0702.minecraft.gui.layout.HorizontalLayout; import de.johni0702.minecraft.gui.layout.VerticalLayout; import de.johni0702.minecraft.gui.popup.AbstractGuiPopup; import de.johni0702.minecraft.gui.utils.Colors; import de.johni0702.minecraft.gui.utils.Consumer; import org.apache.commons.lang3.tuple.Triple; import org.lwjgl.input.Keyboard; import org.lwjgl.util.ReadablePoint; import static de.johni0702.minecraft.gui.utils.Utils.link; public abstract class GuiEditKeyframe> extends AbstractGuiPopup implements Typeable { private static GuiNumberField newGuiNumberField() { return new GuiNumberField().setPrecision(0).setValidateOnFocusChange(true); } protected final Keyframe keyframe; protected final Path path; public final GuiLabel title = new GuiLabel(); public final GuiPanel inputs = new GuiPanel(); public final GuiNumberField timeMinField = newGuiNumberField().setSize(30, 20).setMinValue(0); public final GuiNumberField timeSecField = newGuiNumberField().setSize(20, 20).setMinValue(0).setMaxValue(59); public final GuiNumberField timeMSecField = newGuiNumberField().setSize(30, 20).setMinValue(0).setMaxValue(999); public final GuiPanel timePanel = new GuiPanel() .setLayout(new HorizontalLayout(HorizontalLayout.Alignment.RIGHT).setSpacing(3)) .addElements(new HorizontalLayout.Data(0.5), new GuiLabel().setI18nText("replaymod.gui.editkeyframe.timelineposition"), timeMinField, new GuiLabel().setI18nText("replaymod.gui.minutes"), timeSecField, new GuiLabel().setI18nText("replaymod.gui.seconds"), timeMSecField, new GuiLabel().setI18nText("replaymod.gui.milliseconds")); public final GuiButton saveButton = new GuiButton().setSize(150, 20).setI18nLabel("replaymod.gui.save"); public final GuiButton cancelButton = new GuiButton() .onClick(this::close).setSize(150, 20).setI18nLabel("replaymod.gui.cancel"); public final GuiPanel buttons = new GuiPanel() .setLayout(new HorizontalLayout(HorizontalLayout.Alignment.CENTER).setSpacing(7)) .addElements(new HorizontalLayout.Data(0.5), saveButton, cancelButton); { setBackgroundColor(Colors.DARK_TRANSPARENT); popup.setLayout(new VerticalLayout().setSpacing(10)) .addElements(new VerticalLayout.Data(0.5, false), title, inputs, timePanel, buttons); } public GuiEditKeyframe(GuiPathing gui, Path path, Keyframe keyframe, String type) { super(ReplayModReplay.instance.getReplayHandler().getOverlay()); this.keyframe = keyframe; this.path = path; long time = keyframe.getTime(); Consumer updateSaveButtonState = s -> saveButton.setEnabled(canSave()); timeMinField.setValue(time / 1000 / 60).onTextChanged(updateSaveButtonState); timeSecField.setValue(time / 1000 % 60).onTextChanged(updateSaveButtonState); timeMSecField.setValue(time % 1000).onTextChanged(updateSaveButtonState); title.setI18nText("replaymod.gui.editkeyframe.title." + type); saveButton.onClick(() -> { Change change = save(); long newTime = (timeMinField.getInteger() * 60 + timeSecField.getInteger()) * 1000 + timeMSecField.getInteger(); if (newTime != keyframe.getTime()) { change = CombinedChange.createFromApplied(change, gui.moveKeyframe(path, keyframe, newTime)); } path.getTimeline().pushChange(change); close(); }); } private boolean canSave() { long newTime = (timeMinField.getInteger() * 60 + timeSecField.getInteger()) * 1000 + timeMSecField.getInteger(); if (newTime != keyframe.getTime() && path.getKeyframe(newTime) != null) { return false; } return true; } @Override public boolean typeKey(ReadablePoint mousePosition, int keyCode, char keyChar, boolean ctrlDown, boolean shiftDown) { if (keyCode == Keyboard.KEY_ESCAPE) { cancelButton.onClick(); return true; } return false; } @Override public void open() { super.open(); } protected abstract Change save(); public static class Spectator extends GuiEditKeyframe { public Spectator(GuiPathing gui, Path path, Keyframe keyframe) { super(gui, path, keyframe, "spec"); link(timeMinField, timeSecField, timeMSecField); popup.forEach(IGuiLabel.class).setColor(Colors.BLACK); } @Override protected Change save() { return CombinedChange.createFromApplied(); } @Override protected Spectator getThis() { return this; } } public static class Time extends GuiEditKeyframe