From 76aed83ecd26751094a8ebdfe698b95e3233aae4 Mon Sep 17 00:00:00 2001 From: Daniel Chýlek Date: Thu, 8 Jul 2021 16:28:39 +0200 Subject: Add --single-class-tree argument that puts all classes into deobf panel & hides obf panel (#406) * Add --single-class-tree argument that puts all classes into deobf panel & hides obf panel Parchment uses a jar with already remapped classes, but Enigma puts them into panel with obf classes which sorts classes by length. This option puts all classes into the deobf panel, and completely hides the obf panel. * Address comments * Comment begone--- .../src/main/java/cuchaz/enigma/gui/Gui.java | 21 ++++++++++++++++----- .../main/java/cuchaz/enigma/gui/GuiController.java | 9 ++++++++- .../src/main/java/cuchaz/enigma/gui/Main.java | 6 ++++++ .../java/cuchaz/enigma/gui/panels/DeobfPanel.java | 2 +- enigma/src/main/resources/lang/en_us.json | 1 + 5 files changed, 32 insertions(+), 7 deletions(-) diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/Gui.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/Gui.java index 30bf4d3..a657d17 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/Gui.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/Gui.java @@ -75,6 +75,7 @@ public class Gui implements LanguageChangeListener { private ConnectionState connectionState; private boolean isJarOpen; private final Set editableTypes; + private boolean singleClassTree; public JFileChooser jarFileChooser; public JFileChooser tinyMappingsFileChooser; @@ -424,7 +425,19 @@ public class Gui implements LanguageChangeListener { public GuiController getController() { return this.controller; } - + + public void setSingleClassTree(boolean singleClassTree) { + this.singleClassTree = singleClassTree; + this.classesPanel.removeAll(); + this.classesPanel.add(isSingleClassTree() ? deobfPanel : splitClasses); + getController().refreshClasses(); + retranslateUi(); + } + + public boolean isSingleClassTree() { + return singleClassTree; + } + public void onStartOpenJar() { this.classesPanel.removeAll(); redraw(); @@ -434,7 +447,7 @@ public class Gui implements LanguageChangeListener { // update gui this.frame.setTitle(Enigma.NAME + " - " + jarName); this.classesPanel.removeAll(); - this.classesPanel.add(splitClasses); + this.classesPanel.add(isSingleClassTree() ? deobfPanel : splitClasses); closeAllEditorTabs(); // update menu @@ -816,8 +829,6 @@ public class Gui implements LanguageChangeListener { } else if (data instanceof ClassEntry) { // class rename - // assume this is deobf since the obf tree doesn't allow renaming in - // the first place // TODO optimize reverse class lookup, although it looks like it's // fast enough for now EntryRemapper mapper = this.controller.project.getMapper(); @@ -826,7 +837,7 @@ public class Gui implements LanguageChangeListener { .filter(e -> e instanceof ClassEntry) .map(e -> (ClassEntry) e) .filter(e -> mapper.deobfuscate(e).equals(deobf)) - .findAny().get(); + .findAny().orElse(deobf); this.controller.rename(vc, new EntryReference<>(obf, obf.getFullName()), ((ClassEntry) data).getFullName(), false); if (!vc.canProceed()) return; 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 e28271e..2b75655 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java @@ -359,7 +359,9 @@ public class GuiController implements ClientPacketHandler { openReference(reference); } - private void refreshClasses() { + public void refreshClasses() { + if (project == null) return; + List obfClasses = Lists.newArrayList(); List deobfClasses = Lists.newArrayList(); this.addSeparatedClasses(obfClasses, deobfClasses); @@ -375,6 +377,11 @@ public class GuiController implements ClientPacketHandler { .filter(entry -> !entry.isInnerClass()); visibleClasses.forEach(entry -> { + if (gui.isSingleClassTree()) { + deobfClasses.add(entry); + return; + } + ClassEntry deobfEntry = mapper.deobfuscate(entry); List obfService = enigma.getServices().get(ObfuscationTestService.TYPE); diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/Main.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/Main.java index cd968fc..f6a03f5 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/Main.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/Main.java @@ -60,6 +60,8 @@ public class Main { parser.acceptsAll(List.of("edit-javadocs", "d"), "Enable editing Javadocs"); parser.acceptsAll(List.of("no-edit-javadocs", "D"), "Disable editing Javadocs"); + parser.accepts("single-class-tree", "Unify the deobfuscated and obfuscated class panels"); + parser.accepts("help", "Displays help information"); try { @@ -107,6 +109,10 @@ public class Main { Gui gui = new Gui(parsedProfile, editables); GuiController controller = gui.getController(); + + if (options.has("single-class-tree")) { + gui.setSingleClassTree(true); + } if (options.has(jar)) { Path jarPath = options.valueOf(jar); diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/DeobfPanel.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/DeobfPanel.java index 3e357cb..5b7882b 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/DeobfPanel.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/DeobfPanel.java @@ -32,7 +32,7 @@ public class DeobfPanel extends JPanel { } public void retranslateUi() { - this.title.setText(I18n.translate("info_panel.classes.deobfuscated")); + this.title.setText(I18n.translate(gui.isSingleClassTree() ? "info_panel.classes" : "info_panel.classes.deobfuscated")); } } diff --git a/enigma/src/main/resources/lang/en_us.json b/enigma/src/main/resources/lang/en_us.json index b3085be..4488bb2 100644 --- a/enigma/src/main/resources/lang/en_us.json +++ b/enigma/src/main/resources/lang/en_us.json @@ -92,6 +92,7 @@ "editor.decompile_error": "An error was encountered while decompiling.", "editor.remap_error": "An error was encountered while remapping.", + "info_panel.classes": "Classes", "info_panel.classes.obfuscated": "Obfuscated Classes", "info_panel.classes.deobfuscated": "De-obfuscated Classes", "info_panel.identifier": "Identifier Info", -- cgit v1.2.3