package com.replaymod.simplepathing.gui; import com.replaymod.pathing.properties.CameraProperties; import com.replaymod.simplepathing.properties.ExplicitInterpolationProperty; 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.interpolation.CubicSplineInterpolator; import com.replaymod.replaystudio.pathing.interpolation.Interpolator; import com.replaymod.replaystudio.pathing.interpolation.LinearInterpolator; import com.replaymod.replaystudio.pathing.path.Keyframe; import com.replaymod.replaystudio.pathing.path.Path; import com.replaymod.replaystudio.pathing.path.PathSegment; import com.replaymod.simplepathing.InterpolatorType; import com.replaymod.simplepathing.SPTimeline; import com.replaymod.simplepathing.SPTimeline.SPPath; import com.replaymod.simplepathing.Setting; import de.johni0702.minecraft.gui.container.AbstractGuiContainer; 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.GuiTooltip; import de.johni0702.minecraft.gui.element.IGuiClickable; import de.johni0702.minecraft.gui.element.IGuiLabel; import de.johni0702.minecraft.gui.element.advanced.GuiDropdownMenu; 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 lombok.Getter; import net.minecraft.client.resources.I18n; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.lwjgl.input.Keyboard; import org.lwjgl.util.ReadablePoint; import java.util.Map; import java.util.Optional; 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 static final Logger logger = LogManager.getLogger(); protected final GuiPathing guiPathing; protected final long time; 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, SPPath path, long time, String type) { super(ReplayModReplay.instance.getReplayHandler().getOverlay()); this.guiPathing = gui; this.time = time; this.path = gui.getMod().getCurrentTimeline().getPath(path); this.keyframe = this.path.getKeyframe(time); 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 != time) { change = CombinedChange.createFromApplied(change, gui.getMod().getCurrentTimeline().moveKeyframe(path, time, newTime)); } gui.getMod().getCurrentTimeline().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, SPPath path, long 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