From 3030b646ae58cc9448721f429ab5591fab4ca897 Mon Sep 17 00:00:00 2001 From: Juuz Date: Sat, 6 Apr 2024 14:06:40 +0300 Subject: Add file extensions to open and save dialogs (#532) * Add file extensions to Save As dialog * Include leading dots in file extensions for simplicity * Add file extensions to open mappings dialogs * Remove unused tinyMappingsFileChooser * Use the same file chooser for all mapping IO * Fix NPE by using Enigma directories as the default mapping format Fixes #533. * Fix code style * Allow .mappings extension for single Enigma files * gradlew.bat --------- Co-authored-by: NebelNidas --- .../translation/mapping/serde/MappingFormat.java | 62 +++++++++++++++++----- 1 file changed, 49 insertions(+), 13 deletions(-) (limited to 'enigma/src/main/java') diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java index 4521591..aeac9db 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java @@ -33,28 +33,30 @@ import cuchaz.enigma.translation.mapping.tree.EntryTree; import cuchaz.enigma.utils.I18n; public enum MappingFormat { - ENIGMA_FILE(EnigmaMappingsWriter.FILE, EnigmaMappingsReader.FILE, net.fabricmc.mappingio.format.MappingFormat.ENIGMA_FILE, true), - ENIGMA_DIRECTORY(EnigmaMappingsWriter.DIRECTORY, EnigmaMappingsReader.DIRECTORY, net.fabricmc.mappingio.format.MappingFormat.ENIGMA_DIR, true), - ENIGMA_ZIP(EnigmaMappingsWriter.ZIP, EnigmaMappingsReader.ZIP, null, false), - TINY_V2(new TinyV2Writer("intermediary", "named"), new TinyV2Reader(), net.fabricmc.mappingio.format.MappingFormat.TINY_2_FILE, true), - TINY_FILE(TinyMappingsWriter.INSTANCE, TinyMappingsReader.INSTANCE, net.fabricmc.mappingio.format.MappingFormat.TINY_FILE, true), - SRG_FILE(SrgMappingsWriter.INSTANCE, null, net.fabricmc.mappingio.format.MappingFormat.SRG_FILE, true), - XSRG_FILE(null, null, net.fabricmc.mappingio.format.MappingFormat.XSRG_FILE, true), - CSRG_FILE(null, null, net.fabricmc.mappingio.format.MappingFormat.CSRG_FILE, false), - TSRG_FILE(null, null, net.fabricmc.mappingio.format.MappingFormat.TSRG_FILE, false), - TSRG_2_FILE(null, null, net.fabricmc.mappingio.format.MappingFormat.TSRG_2_FILE, false), - PROGUARD(null, ProguardMappingsReader.INSTANCE, net.fabricmc.mappingio.format.MappingFormat.PROGUARD_FILE, true), - RECAF(RecafMappingsWriter.INSTANCE, RecafMappingsReader.INSTANCE, null, false); + ENIGMA_FILE(EnigmaMappingsWriter.FILE, EnigmaMappingsReader.FILE, FileType.MAPPING, net.fabricmc.mappingio.format.MappingFormat.ENIGMA_FILE, true), + ENIGMA_DIRECTORY(EnigmaMappingsWriter.DIRECTORY, EnigmaMappingsReader.DIRECTORY, FileType.DIRECTORY, net.fabricmc.mappingio.format.MappingFormat.ENIGMA_DIR, true), + ENIGMA_ZIP(EnigmaMappingsWriter.ZIP, EnigmaMappingsReader.ZIP, FileType.ZIP, null, false), + TINY_V2(new TinyV2Writer("intermediary", "named"), new TinyV2Reader(), FileType.TINY, net.fabricmc.mappingio.format.MappingFormat.TINY_2_FILE, true), + TINY_FILE(TinyMappingsWriter.INSTANCE, TinyMappingsReader.INSTANCE, FileType.TINY, net.fabricmc.mappingio.format.MappingFormat.TINY_FILE, true), + SRG_FILE(SrgMappingsWriter.INSTANCE, null, FileType.SRG, net.fabricmc.mappingio.format.MappingFormat.SRG_FILE, true), + XSRG_FILE(null, null, FileType.XSRG, net.fabricmc.mappingio.format.MappingFormat.XSRG_FILE, true), + CSRG_FILE(null, null, FileType.CSRG, net.fabricmc.mappingio.format.MappingFormat.CSRG_FILE, false), + TSRG_FILE(null, null, FileType.TSRG, net.fabricmc.mappingio.format.MappingFormat.TSRG_FILE, false), + TSRG_2_FILE(null, null, FileType.TSRG, net.fabricmc.mappingio.format.MappingFormat.TSRG_2_FILE, false), + PROGUARD(null, ProguardMappingsReader.INSTANCE, FileType.TXT, net.fabricmc.mappingio.format.MappingFormat.PROGUARD_FILE, true), + RECAF(RecafMappingsWriter.INSTANCE, RecafMappingsReader.INSTANCE, FileType.TXT, null, false); private final MappingsWriter writer; private final MappingsReader reader; + private final FileType fileType; private final net.fabricmc.mappingio.format.MappingFormat mappingIoCounterpart; private final boolean hasMappingIoWriter; private boolean lastUsedMappingIoWriter; - MappingFormat(MappingsWriter writer, MappingsReader reader, net.fabricmc.mappingio.format.MappingFormat mappingIoCounterpart, boolean hasMappingIoWriter) { + MappingFormat(MappingsWriter writer, MappingsReader reader, FileType fileType, net.fabricmc.mappingio.format.MappingFormat mappingIoCounterpart, boolean hasMappingIoWriter) { this.writer = writer; this.reader = reader; + this.fileType = fileType; this.mappingIoCounterpart = mappingIoCounterpart; this.hasMappingIoWriter = hasMappingIoWriter; } @@ -126,6 +128,11 @@ public enum MappingFormat { return reader; } + @ApiStatus.Internal + public FileType getFileType() { + return fileType; + } + @Nullable @ApiStatus.Internal public net.fabricmc.mappingio.format.MappingFormat getMappingIoCounterpart() { @@ -164,4 +171,33 @@ public enum MappingFormat { .filter(MappingFormat::isWritable) .toList(); } + + /** + * A file type. It can be either a single file with an extension, or a directory + * with a {@code null} extension. + * + *

If a file type has multiple extensions, the default for saving will be the first one. + * + * @param extensions the file extensions with the leading dot {@code .}, or an empty list for a directory + */ + @ApiStatus.Internal + public record FileType(List extensions) { + public static final FileType DIRECTORY = new FileType(); + public static final FileType MAPPING = new FileType(".mapping", ".mappings"); + public static final FileType SRG = new FileType(".srg"); + public static final FileType XSRG = new FileType(".xsrg"); + public static final FileType CSRG = new FileType(".csrg"); + public static final FileType TSRG = new FileType(".tsrg"); + public static final FileType TINY = new FileType(".tiny"); + public static final FileType TXT = new FileType(".txt"); + public static final FileType ZIP = new FileType(".zip"); + + public FileType(String... extensions) { + this(List.of(extensions)); + } + + public boolean isDirectory() { + return extensions.isEmpty(); + } + } } -- cgit v1.2.3