diff --git a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/GuiController.java b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/GuiController.java index 89f35f5a..62f48ab7 100644 --- a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/GuiController.java +++ b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/GuiController.java @@ -208,11 +208,17 @@ public void openMappings(EntryTree mappings) { } public CompletableFuture saveMappings(Path path) { - return this.saveMappings(path, this.readWriteService); + return this.saveMappings(path, false); + } + + public CompletableFuture saveMappings(Path path, boolean background) { + return this.saveMappings(path, this.readWriteService, background); } /** - * Saves the mappings, with a dialog popping up, showing the progress. + * Saves the mappings. If {@code background} is false, a dialog will pop up + * showing the progress. Otherwise, the progress will be shown in the + * status bar. * *

Notice the returned completable future has to be completed by * {@link SwingUtilities#invokeLater(Runnable)}. Hence, do not try to @@ -220,9 +226,10 @@ public CompletableFuture saveMappings(Path path) { * * @param path the path of the save * @param service the writer for the mapping type + * @param background whether the progress should be shown in the status bar * @return the future of saving */ - public CompletableFuture saveMappings(Path path, ReadWriteService service) { + public CompletableFuture saveMappings(Path path, ReadWriteService service, boolean background) { if (this.project == null) { return CompletableFuture.completedFuture(null); } else if (!service.supportsWriting()) { @@ -231,22 +238,35 @@ public CompletableFuture saveMappings(Path path, ReadWriteService service) return CompletableFuture.completedFuture(null); } - return ProgressDialog.runOffThread(this.gui, progress -> { - EntryRemapper mapper = this.project.getRemapper(); - MappingSaveParameters saveParameters = this.enigma.getProfile().getMappingSaveParameters(); + if (background) { + return CompletableFuture.supplyAsync(() -> { + ProgressListener progress = ProgressListener.createEmpty(); + this.gui.getMainWindow().getStatusBar().syncWith(progress); + this.doSave(path, service, progress); + return null; + }); + } else { + return ProgressDialog.runOffThread(this.gui, progress -> { + this.doSave(path, service, progress); + }); + } + } - MappingDelta delta = mapper.takeMappingDelta(); - boolean saveAll = !path.equals(this.loadedMappingPath); + private void doSave(Path path, ReadWriteService service, ProgressListener progress) { + EntryRemapper mapper = this.project.getRemapper(); + MappingSaveParameters saveParameters = this.enigma.getProfile().getMappingSaveParameters(); - this.readWriteService = service; - this.loadedMappingPath = path; + MappingDelta delta = mapper.takeMappingDelta(); + boolean saveAll = !path.equals(this.loadedMappingPath); - if (saveAll) { - service.write(mapper.getMappings(), path, progress, saveParameters); - } else { - service.write(mapper.getMappings(), delta, path, progress, saveParameters); - } - }); + this.readWriteService = service; + this.loadedMappingPath = path; + + if (saveAll) { + service.write(mapper.getMappings(), path, progress, saveParameters); + } else { + service.write(mapper.getMappings(), delta, path, progress, saveParameters); + } } public void closeMappings() { diff --git a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/config/FeaturesSection.java b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/config/FeaturesSection.java index 9567ec17..5a21cee8 100644 --- a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/config/FeaturesSection.java +++ b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/config/FeaturesSection.java @@ -10,4 +10,6 @@ public class FeaturesSection extends ReflectiveConfig.Section { @Comment("Enables statistic icons in the class tree. This has a major performance impact on JAR files with lots of classes.") public final TrackedValue enableClassTreeStatIcons = this.value(true); + @Comment("Enables auto save functionality, which will automatically save mappings when a change is made.") + public final TrackedValue autoSaveMappings = this.value(true); } diff --git a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/element/MenuBar.java b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/element/MenuBar.java index f8771687..ca8472ee 100644 --- a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/element/MenuBar.java +++ b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/element/MenuBar.java @@ -568,7 +568,7 @@ private static void prepareSaveMappingsAsMenu(JMenu saveMappingsAsMenu, JMenuIte if (fileChooser.showSaveDialog(gui.getFrame()) == JFileChooser.APPROVE_OPTION) { Path savePath = ExtensionFileFilter.getSavePath(fileChooser); - gui.getController().saveMappings(savePath, format); + gui.getController().saveMappings(savePath, format, false); saveMappingsItem.setEnabled(true); Config.main().stats.lastSelectedDir.setValue(fileChooser.getCurrentDirectory().toString()); } diff --git a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/panel/IdentifierPanel.java b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/panel/IdentifierPanel.java index 305dd13a..249bc670 100644 --- a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/panel/IdentifierPanel.java +++ b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/panel/IdentifierPanel.java @@ -210,6 +210,9 @@ public void onStopEditing(ConvertingTextField field, boolean abort) { IdentifierPanel.this.vc.setNotifier(IdentifierPanel.this.gui.getNotificationManager()); IdentifierPanel.this.vc.reset(); IdentifierPanel.this.doRename(field.getText()); + if (Config.main().features.autoSaveMappings.value() && IdentifierPanel.this.gui.mappingsFileChooser.getSelectedFile() != null) { + IdentifierPanel.this.gui.getController().saveMappings(IdentifierPanel.this.gui.mappingsFileChooser.getSelectedFile().toPath(), true); + } } EditorPanel e = IdentifierPanel.this.gui.getActiveEditor(); diff --git a/enigma/src/main/java/org/quiltmc/enigma/api/translation/mapping/serde/enigma/EnigmaMappingsWriter.java b/enigma/src/main/java/org/quiltmc/enigma/api/translation/mapping/serde/enigma/EnigmaMappingsWriter.java index a9e4f091..391fce18 100644 --- a/enigma/src/main/java/org/quiltmc/enigma/api/translation/mapping/serde/enigma/EnigmaMappingsWriter.java +++ b/enigma/src/main/java/org/quiltmc/enigma/api/translation/mapping/serde/enigma/EnigmaMappingsWriter.java @@ -58,6 +58,8 @@ public void write(EntryTree mappings, MappingDelta d progress.step(steps++, classEntry.getFullName()); this.writeRoot(writer, writtenMappings, classEntry); } + + progress.step(steps, I18n.translate("progress.mappings.enigma_file.done")); } catch (IOException e) { Logger.error(e, "Error while writing mappings to file {}", path); } @@ -102,6 +104,7 @@ public void write(EntryTree mappings, MappingDelta d Logger.error(e, "Failed to write class '{}'", classEntry.getFullName()); } }); + progress.step(steps.get(), I18n.translate("progress.mappings.enigma_directory.done")); } private void applyDeletions(Path root, Collection changedClasses, EntryTree mappings, EntryTree oldMappings, MappingFileNameFormat fileNameFormat) { diff --git a/enigma/src/main/resources/lang/en_us.json b/enigma/src/main/resources/lang/en_us.json index 9cf16317..e10d6f42 100644 --- a/enigma/src/main/resources/lang/en_us.json +++ b/enigma/src/main/resources/lang/en_us.json @@ -209,6 +209,7 @@ "progress.mappings.enigma_file.writing": "Writing classes", "progress.mappings.enigma_directory.loading": "Loading mapping files", "progress.mappings.enigma_directory.writing": "Writing classes", + "progress.mappings.enigma_directory.done": "Done!", "progress.mappings.tiny_file.loading": "Loading mapping file", "progress.mappings.tiny_v2.loading": "Loading mapping file", "progress.mappings.srg_file.generating": "Generating mappings",