From a6f5931e7ed9446bb3cc58309da53c7cad6fc88b Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sun, 28 Jun 2020 20:21:52 +0200 Subject: [PATCH] Fix output file render setting not being saved (fixes #229) --- .../render/gui/GuiRenderSettings.java | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java b/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java index c2173f1b..75c105a3 100644 --- a/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java +++ b/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java @@ -95,10 +95,9 @@ public class GuiRenderSettings extends GuiScreen implements Closeable { } // Update export arguments to match new Preset exportArguments.setText(newPreset.getValue()); - // If the user hasn't changed the output file by themselves, - if (!outputFileManuallySet) { - // generate a new output file name with updated file extension - outputFile = generateOutputFile(newPreset); + // Update output file ending + if (outputFile != null) { + outputFile = conformExtension(outputFile, newPreset); outputFileButton.setLabel(outputFile.getName()); } updateInputs(); @@ -135,8 +134,10 @@ public class GuiRenderSettings extends GuiScreen implements Closeable { @Override public void onSuccess(@Nullable File result) { if (result != null) { + if (!result.getName().equals(outputFile.getName())) { + userDefinedOutputFileName = true; + } outputFile = result; - outputFileManuallySet = true; outputFileButton.setLabel(result.getName()); } } @@ -321,7 +322,7 @@ public class GuiRenderSettings extends GuiScreen implements Closeable { private final ReplayHandler replayHandler; private final Timeline timeline; private File outputFile; - private boolean outputFileManuallySet; + private boolean userDefinedOutputFileName; public GuiRenderSettings(ReplayHandler replayHandler, Timeline timeline) { this.replayHandler = replayHandler; @@ -503,14 +504,19 @@ public class GuiRenderSettings extends GuiScreen implements Closeable { bitRateField.setValue(settings.getBitRate()); bitRateUnit.setSelected(0); } - if (settings.getOutputFile() == null) { - outputFile = generateOutputFile(settings.getEncodingPreset()); - outputFileManuallySet = false; + File savedOutputFile = settings.getOutputFile(); + if (savedOutputFile == null || !savedOutputFile.getParentFile().exists()) { + this.outputFile = generateOutputFile(settings.getEncodingPreset()); + userDefinedOutputFileName = false; + } else if (savedOutputFile.exists()) { + String name = generateOutputFile(settings.getEncodingPreset()).getName(); + this.outputFile = new File(savedOutputFile.isDirectory() ? savedOutputFile : savedOutputFile.getParentFile(), name); + userDefinedOutputFileName = false; } else { - outputFile = settings.getOutputFile(); - outputFileManuallySet = true; + this.outputFile = conformExtension(savedOutputFile, settings.getEncodingPreset()); + userDefinedOutputFileName = true; } - outputFileButton.setLabel(outputFile.getName()); + outputFileButton.setLabel(this.outputFile.getName()); nametagCheckbox.setChecked(settings.isRenderNameTags()); stabilizeYaw.setChecked(settings.isStabilizeYaw()); stabilizePitch.setChecked(settings.isStabilizePitch()); @@ -546,7 +552,7 @@ public class GuiRenderSettings extends GuiScreen implements Closeable { videoHeight.getInteger(), frameRateSlider.getValue() + 10, bitRateField.getInteger() << (10 * bitRateUnit.getSelected()), - serialize ? null : outputFile, + serialize && !userDefinedOutputFileName ? outputFile.getParentFile() : outputFile, nametagCheckbox.isChecked(), stabilizeYaw.isChecked() && (serialize || stabilizeYaw.isEnabled()), stabilizePitch.isChecked() && (serialize || stabilizePitch.isEnabled()), @@ -567,6 +573,14 @@ public class GuiRenderSettings extends GuiScreen implements Closeable { return new File(folder, fileName + "." + encodingPreset.getFileExtension()); } + protected File conformExtension(File file, RenderSettings.EncodingPreset preset) { + String name = file.getName(); + if (name.contains(".")) { + name = name.substring(0, name.lastIndexOf('.')); + } + return new File(file.getParentFile(), name + "." + preset.getFileExtension()); + } + protected Path getSettingsPath() { return ReplayModRender.instance.getRenderSettingsPath(); }