From 47de69a821c6e089b01187e93f4f916aceeeea85 Mon Sep 17 00:00:00 2001 From: NebelNidas Date: Thu, 22 Sep 2022 11:59:53 +0200 Subject: Add initial Mapping-IO export support --- .../main/java/cuchaz/enigma/gui/GuiController.java | 45 ++++++++++++++++++++++ .../java/cuchaz/enigma/gui/elements/MenuBar.java | 23 +++++++++++ 2 files changed, 68 insertions(+) (limited to 'enigma-swing/src/main/java/cuchaz/enigma/gui') diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java index 91037b0..e7e7566 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java @@ -29,6 +29,8 @@ import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import com.google.common.collect.Lists; +import net.fabricmc.mappingio.MappingWriter; +import net.fabricmc.mappingio.tree.MemoryMappingTree; import cuchaz.enigma.Enigma; import cuchaz.enigma.EnigmaProfile; @@ -77,6 +79,7 @@ import cuchaz.enigma.translation.mapping.EntryUtil; import cuchaz.enigma.translation.mapping.MappingDelta; import cuchaz.enigma.translation.mapping.ResolutionStrategy; import cuchaz.enigma.translation.mapping.serde.MappingFormat; +import cuchaz.enigma.translation.mapping.serde.MappingIoConverter; import cuchaz.enigma.translation.mapping.serde.MappingParseException; import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; import cuchaz.enigma.translation.mapping.tree.EntryTree; @@ -213,6 +216,48 @@ public class GuiController implements ClientPacketHandler { }); } + public CompletableFuture saveMappings(Path path, net.fabricmc.mappingio.format.MappingFormat format) { + if (project == null) { + return CompletableFuture.completedFuture(null); + } + + return ProgressDialog.runOffThread(this.gui.getFrame(), progress -> { + EntryRemapper mapper = project.getMapper(); + MappingSaveParameters saveParameters = enigma.getProfile().getMappingSaveParameters(); + + MappingDelta delta = mapper.takeMappingDelta(); + boolean saveAll = !path.equals(loadedMappingPath); + + switch (format) { + case ENIGMA: + loadedMappingFormat = MappingFormat.ENIGMA_DIRECTORY; + loadedMappingPath = path; + break; + case PROGUARD: + loadedMappingFormat = MappingFormat.PROGUARD; + loadedMappingPath = path; + break; + case SRG: + loadedMappingFormat = MappingFormat.SRG_FILE; + loadedMappingPath = path; + break; + case TINY: + loadedMappingFormat = MappingFormat.TINY_FILE; + loadedMappingPath = path; + break; + case TINY_2: + loadedMappingFormat = MappingFormat.TINY_V2; + loadedMappingPath = path; + break; + } + + MemoryMappingTree mappingTree = MappingIoConverter.toMappingIo(mapper.getObfToDeobf()); + MappingWriter writer = MappingWriter.create(path, format); + mappingTree.accept(writer); + writer.close(); + }); + } + public void closeMappings() { if (project == null) { return; diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java index 1cfad50..1d4c1ca 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java @@ -7,6 +7,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.stream.Collectors; @@ -439,6 +440,28 @@ public class MenuBar { saveMappingsAsMenu.add(item); } } + + saveMappingsAsMenu.addSeparator(); + + List writableMappingIoFormats = Arrays.asList( + net.fabricmc.mappingio.format.MappingFormat.ENIGMA, + net.fabricmc.mappingio.format.MappingFormat.TINY_2); + for (net.fabricmc.mappingio.format.MappingFormat format : writableMappingIoFormats) { + JMenuItem item = new JMenuItem(format.name + " (via mapping-io, experimental)"); + item.addActionListener(event -> { + // TODO: Use a specific file chooser for it + if (gui.enigmaMappingsFileChooser.getCurrentDirectory() == null) { + gui.enigmaMappingsFileChooser.setCurrentDirectory(new File(UiConfig.getLastSelectedDir())); + } + + if (gui.enigmaMappingsFileChooser.showSaveDialog(gui.getFrame()) == JFileChooser.APPROVE_OPTION) { + gui.getController().saveMappings(gui.enigmaMappingsFileChooser.getSelectedFile().toPath(), format); + saveMappingsItem.setEnabled(true); + UiConfig.setLastSelectedDir(gui.enigmaMappingsFileChooser.getCurrentDirectory().toString()); + } + }); + saveMappingsAsMenu.add(item); + } } private static void prepareDecompilerMenu(JMenu decompilerMenu, Gui gui) { -- cgit v1.2.3