From ddeb3087fa1fc2acccf4a57e1101b2a8b24a2b50 Mon Sep 17 00:00:00 2001 From: PiTheGuy Date: Wed, 21 May 2025 16:03:00 -0500 Subject: [PATCH 1/4] Autosave mappings --- .../org/quiltmc/enigma/gui/GuiController.java | 46 +++++++++++++------ .../quiltmc/enigma/gui/element/MenuBar.java | 2 +- .../enigma/gui/panel/IdentifierPanel.java | 2 + .../serde/enigma/EnigmaMappingsWriter.java | 2 + enigma/src/main/resources/lang/en_us.json | 1 + 5 files changed, 37 insertions(+), 16 deletions(-) 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..327dd48a 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,7 +208,11 @@ public void openMappings(EntryTree mappings) { } public CompletableFuture saveMappings(Path path) { - return this.saveMappings(path, this.readWriteService); + return saveMappings(path, false); + } + + public CompletableFuture saveMappings(Path path, boolean background) { + return this.saveMappings(path, this.readWriteService, background); } /** @@ -222,7 +226,7 @@ public CompletableFuture saveMappings(Path path) { * @param service the writer for the mapping type * @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()) { @@ -230,23 +234,35 @@ public CompletableFuture saveMappings(Path path, ReadWriteService service) JOptionPane.showMessageDialog(this.gui.getFrame(), nonWriteableMessage, I18n.translate("menu.file.save.cannot_save"), JOptionPane.ERROR_MESSAGE); return CompletableFuture.completedFuture(null); } + 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 -> { + doSave(path, service, progress); + }); + } + } - return ProgressDialog.runOffThread(this.gui, progress -> { - EntryRemapper mapper = this.project.getRemapper(); - MappingSaveParameters saveParameters = this.enigma.getProfile().getMappingSaveParameters(); + private void doSave(Path path, ReadWriteService service, ProgressListener progress) { + EntryRemapper mapper = this.project.getRemapper(); + MappingSaveParameters saveParameters = this.enigma.getProfile().getMappingSaveParameters(); - MappingDelta delta = mapper.takeMappingDelta(); - boolean saveAll = !path.equals(this.loadedMappingPath); + MappingDelta delta = mapper.takeMappingDelta(); + boolean saveAll = !path.equals(this.loadedMappingPath); - this.readWriteService = service; - this.loadedMappingPath = path; + this.readWriteService = service; + this.loadedMappingPath = path; - if (saveAll) { - service.write(mapper.getMappings(), path, progress, saveParameters); - } else { - service.write(mapper.getMappings(), delta, path, progress, saveParameters); - } - }); + 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/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..cb46c62e 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,8 @@ public void onStopEditing(ConvertingTextField field, boolean abort) { IdentifierPanel.this.vc.setNotifier(IdentifierPanel.this.gui.getNotificationManager()); IdentifierPanel.this.vc.reset(); IdentifierPanel.this.doRename(field.getText()); + 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..b2d0a97c 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,7 @@ 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 +103,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", From b329578c765a9a9c9ac2a0e42bccaaa1e894220b Mon Sep 17 00:00:00 2001 From: PiTheGuy Date: Wed, 21 May 2025 16:13:24 -0500 Subject: [PATCH 2/4] Add config option --- .../java/org/quiltmc/enigma/gui/config/FeaturesSection.java | 2 ++ .../java/org/quiltmc/enigma/gui/panel/IdentifierPanel.java | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) 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/panel/IdentifierPanel.java b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/panel/IdentifierPanel.java index cb46c62e..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,8 +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()); - IdentifierPanel.this.gui.getController().saveMappings(IdentifierPanel.this.gui.mappingsFileChooser.getSelectedFile().toPath(), true); - + 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(); From 0c0f5a997bc82f846767d995244e29231f564d9c Mon Sep 17 00:00:00 2001 From: PiTheGuy Date: Wed, 21 May 2025 16:32:29 -0500 Subject: [PATCH 3/4] Checkstyle + update javadoc --- .../main/java/org/quiltmc/enigma/gui/GuiController.java | 7 +++++-- .../mapping/serde/enigma/EnigmaMappingsWriter.java | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) 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 327dd48a..d33d7ccb 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 @@ -216,7 +216,9 @@ public CompletableFuture saveMappings(Path path, boolean 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 @@ -224,6 +226,7 @@ public CompletableFuture saveMappings(Path path, boolean background) { * * @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, boolean background) { @@ -243,7 +246,7 @@ public CompletableFuture saveMappings(Path path, ReadWriteService service, }); } else { return ProgressDialog.runOffThread(this.gui, progress -> { - doSave(path, service, progress); + this.doSave(path, service, progress); }); } } 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 b2d0a97c..b9f33516 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,7 @@ 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); From 632fa3c14766da7bf3d43890e6e5eb919fd8dbaf Mon Sep 17 00:00:00 2001 From: PiTheGuy Date: Wed, 21 May 2025 16:36:55 -0500 Subject: [PATCH 4/4] Checkstyle --- .../src/main/java/org/quiltmc/enigma/gui/GuiController.java | 3 ++- .../translation/mapping/serde/enigma/EnigmaMappingsWriter.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) 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 d33d7ccb..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,7 +208,7 @@ public void openMappings(EntryTree mappings) { } public CompletableFuture saveMappings(Path path) { - return saveMappings(path, false); + return this.saveMappings(path, false); } public CompletableFuture saveMappings(Path path, boolean background) { @@ -237,6 +237,7 @@ public CompletableFuture saveMappings(Path path, ReadWriteService service, JOptionPane.showMessageDialog(this.gui.getFrame(), nonWriteableMessage, I18n.translate("menu.file.save.cannot_save"), JOptionPane.ERROR_MESSAGE); return CompletableFuture.completedFuture(null); } + if (background) { return CompletableFuture.supplyAsync(() -> { ProgressListener progress = ProgressListener.createEmpty(); 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 b9f33516..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,7 +58,7 @@ 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);