diff --git a/jGui b/jGui index 6aeba190..87fd3204 160000 --- a/jGui +++ b/jGui @@ -1 +1 @@ -Subproject commit 6aeba190a60af65ea69f2d912d5802913c855aee +Subproject commit 87fd32049b24422f2a2e469be6d7376779fd2703 diff --git a/src/main/java/com/replaymod/pathing/gui/GuiKeyframeRepository.java b/src/main/java/com/replaymod/pathing/gui/GuiKeyframeRepository.java index 5475c581..34760873 100644 --- a/src/main/java/com/replaymod/pathing/gui/GuiKeyframeRepository.java +++ b/src/main/java/com/replaymod/pathing/gui/GuiKeyframeRepository.java @@ -6,6 +6,9 @@ import com.google.common.util.concurrent.SettableFuture; import com.replaymod.core.ReplayMod; import com.replaymod.core.utils.Utils; import com.replaymod.core.versions.MCVer; +import com.replaymod.render.gui.GuiRenderQueue; +import com.replaymod.render.gui.GuiRenderSettings; +import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayModReplay; import com.replaymod.replaystudio.pathing.PathingRegistry; import com.replaymod.replaystudio.pathing.path.Path; @@ -39,11 +42,13 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.IOException; +import java.util.ArrayDeque; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import static de.johni0702.minecraft.gui.versions.MCVer.getClipboardString; import static de.johni0702.minecraft.gui.versions.MCVer.setClipboardString; @@ -245,6 +250,45 @@ public class GuiKeyframeRepository extends GuiScreen implements Closeable, Typea } }).setSize(75, 20).setI18nLabel("replaymod.gui.paste"); + public final GuiButton addToQueueButton = new GuiButton().onClick(new Runnable() { + @Override + public void run() { + ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler(); + GuiRenderQueue queue = new GuiRenderQueue(GuiKeyframeRepository.this, replayHandler, null); + queue.open(); + + Set selected = selectedEntries.stream().map(e -> e.name).collect(Collectors.toSet()); + ArrayDeque> toBeAdded = new ArrayDeque<>(); + // Iterating over timelines to get consistent ordering (cause selectedEntries is an unordered set) + // and we need to get the Timelines anyway. + for (Map.Entry entry : timelines.entrySet()) { + if (selected.contains(entry.getKey())) { + toBeAdded.offerLast(entry); + } + } + new Runnable() { + @Override + public void run() { + Map.Entry entry = toBeAdded.pollFirst(); + if (entry == null) { + return; + } + String name = entry.getKey(); + Timeline timeline = entry.getValue(); + GuiRenderSettings settingsGui = queue.addJob(timeline); + settingsGui.buttonPanel.removeElement(settingsGui.renderButton); + settingsGui.setOutputFileBaseName(name); + Runnable orgOnClick = settingsGui.queueButton.getOnClick(); + settingsGui.queueButton.onClick(() -> { + orgOnClick.run(); + this.run(); + }); + settingsGui.open(); + } + }.run(); + } + }).setSize(75, 20).setI18nLabel("replaymod.gui.rendersettings.addtoqueue"); + public final GuiPanel buttonPanel = new GuiPanel(contentPanel) .setLayout(new GridLayout() .setColumns(4) @@ -252,7 +296,7 @@ public class GuiKeyframeRepository extends GuiScreen implements Closeable, Typea .setSpacingY(5)) .addElements(null, overwriteButton, saveAsButton, renameButton, removeButton, - loadButton, copyButton, pasteButton); + loadButton, addToQueueButton, copyButton, pasteButton); private final Map timelines = new LinkedHashMap<>(); private final Timeline currentTimeline; @@ -298,6 +342,8 @@ public class GuiKeyframeRepository extends GuiScreen implements Closeable, Typea if (entry.getKey().isEmpty()) continue; // don't show auto-save slot list.getListPanel().addElements(null, new Entry(entry.getKey())); } + + updateButtons(); } private void updateButtons() { @@ -308,6 +354,7 @@ public class GuiKeyframeRepository extends GuiScreen implements Closeable, Typea renameButton.setEnabled(selected == 1); removeButton.setEnabled(selected >= 1); copyButton.setEnabled(selected >= 1); + addToQueueButton.setEnabled(selected >= 1); } @Override diff --git a/src/main/java/com/replaymod/render/gui/GuiRenderQueue.java b/src/main/java/com/replaymod/render/gui/GuiRenderQueue.java index 8666f1ae..e8067b07 100644 --- a/src/main/java/com/replaymod/render/gui/GuiRenderQueue.java +++ b/src/main/java/com/replaymod/render/gui/GuiRenderQueue.java @@ -235,7 +235,7 @@ public class GuiRenderQueue extends AbstractGuiPopup implements @Override public void open() { - if (jobs.isEmpty()) { + if (jobs.isEmpty() && timelineSupplier != null) { if (addButtonClicked() == null) { close(); } @@ -261,6 +261,7 @@ public class GuiRenderQueue extends AbstractGuiPopup implements public void updateButtons() { int selected = selectedEntries.size(); + addButton.setEnabled(timelineSupplier != null); editButton.setEnabled(selected == 1); removeButton.setEnabled(selected >= 1); renderButton.setEnabled(selected > 0); diff --git a/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java b/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java index 44911560..9343612f 100644 --- a/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java +++ b/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java @@ -45,6 +45,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.nio.file.InvalidPathException; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.text.SimpleDateFormat; @@ -573,6 +574,20 @@ public class GuiRenderSettings extends AbstractGuiPopup { return screen; } + public void setOutputFileBaseName(String base) { + RenderSettings.EncodingPreset preset = encodingPresetDropdown.getSelectedValue(); + File file = new File(outputFile.getParentFile(), base + "." + preset.getFileExtension()); + // Ensure the file name is valid + try { + //noinspection ResultOfMethodCallIgnored + file.toPath(); + outputFile = file; + outputFileButton.setLabel(file.getName()); + } catch (InvalidPathException ignored) { + setOutputFileBaseName("filename_invalid_" + base.hashCode()); + } + } + protected File conformExtension(File file, RenderSettings.EncodingPreset preset) { String name = file.getName(); if (name.contains(".")) {