Add "Add to Queue" button to keyframe repository (closes #168)

This commit is contained in:
Jonas Herzig
2020-08-29 19:13:59 +02:00
parent a92aa9cbbd
commit 4a6c0acc8b
4 changed files with 66 additions and 3 deletions

2
jGui

Submodule jGui updated: 6aeba190a6...87fd32049b

View File

@@ -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<String> selected = selectedEntries.stream().map(e -> e.name).collect(Collectors.toSet());
ArrayDeque<Map.Entry<String, Timeline>> 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<String, Timeline> entry : timelines.entrySet()) {
if (selected.contains(entry.getKey())) {
toBeAdded.offerLast(entry);
}
}
new Runnable() {
@Override
public void run() {
Map.Entry<String, Timeline> 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<String, Timeline> 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

View File

@@ -235,7 +235,7 @@ public class GuiRenderQueue extends AbstractGuiPopup<GuiRenderQueue> 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<GuiRenderQueue> implements
public void updateButtons() {
int selected = selectedEntries.size();
addButton.setEnabled(timelineSupplier != null);
editButton.setEnabled(selected == 1);
removeButton.setEnabled(selected >= 1);
renderButton.setEnabled(selected > 0);

View File

@@ -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<GuiRenderSettings> {
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(".")) {