diff --git a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/config/Config.java b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/config/Config.java index 00b271e0b..7035e5588 100644 --- a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/config/Config.java +++ b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/config/Config.java @@ -63,6 +63,9 @@ public final class Config extends ReflectiveConfig { public final StatsSection stats = new StatsSection(); + @Comment("You shouldn't enable options in this section unless you know what you're doing") + public final DevSection development = new DevSection(); + /** * The look and feel stored in the config: do not use this unless setting! Use {@link #activeLookAndFeel} instead, * since look and feel is final once loaded. diff --git a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/config/DevSection.java b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/config/DevSection.java new file mode 100644 index 000000000..b521f9474 --- /dev/null +++ b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/config/DevSection.java @@ -0,0 +1,21 @@ +package org.quiltmc.enigma.gui.config; + +import com.google.gson.annotations.SerializedName; +import org.quiltmc.config.api.ReflectiveConfig; +import org.quiltmc.config.api.annotations.Processor; +import org.quiltmc.config.api.values.TrackedValue; +import org.quiltmc.enigma.api.source.DecompiledClassSource; + +public class DevSection extends ReflectiveConfig.Section { + @SerializedName("show_mapping_source_plugin") + public final TrackedValue showMappingSourcePlugin = this.value(false); + + @SerializedName("debug_token_highlights") + @Processor("processDebugTokenHighlights") + public final TrackedValue debugTokenHighlights = this.value(false); + + @SuppressWarnings("unused") + public void processDebugTokenHighlights(TrackedValue.Builder builder) { + builder.callback(trackedValue -> DecompiledClassSource.DEBUG_TOKEN_HIGHLIGHTS = trackedValue.value()); + } +} 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 b4fed2697..ba08f7e33 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 @@ -26,16 +26,19 @@ import org.quiltmc.enigma.util.Pair; import org.quiltmc.enigma.util.validation.Message; import org.quiltmc.enigma.util.validation.ParameterizedMessage; +import org.tinylog.Logger; import javax.annotation.Nullable; import javax.swing.ButtonGroup; import javax.swing.JButton; +import javax.swing.JCheckBoxMenuItem; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; +import javax.swing.JPanel; import javax.swing.JRadioButtonMenuItem; import javax.swing.JScrollPane; import javax.swing.JTextArea; @@ -103,6 +106,8 @@ public class MenuBar { // Enabled with system property "enigma.development" or "--development" flag private final JMenu devMenu = new JMenu(); + private final JCheckBoxMenuItem showMappingSourcePluginItem = new JCheckBoxMenuItem(); + private final JCheckBoxMenuItem debugTokenHighlightsItem = new JCheckBoxMenuItem(); private final JMenuItem printMappingTreeItem = new JMenuItem(); private final Gui gui; @@ -174,6 +179,8 @@ public MenuBar(Gui gui) { this.helpMenu.add(this.githubItem); ui.add(this.helpMenu); + this.devMenu.add(this.showMappingSourcePluginItem); + this.devMenu.add(this.debugTokenHighlightsItem); this.devMenu.add(this.printMappingTreeItem); if (System.getProperty("enigma.development", "false").equalsIgnoreCase("true")) { ui.add(this.devMenu); @@ -207,6 +214,8 @@ public MenuBar(Gui gui) { this.startServerItem.addActionListener(e -> this.onStartServerClicked()); this.aboutItem.addActionListener(e -> AboutDialog.show(this.gui.getFrame())); this.githubItem.addActionListener(e -> this.onGithubClicked()); + this.showMappingSourcePluginItem.addActionListener(e -> this.onShowMappingSourcePluginClicked()); + this.debugTokenHighlightsItem.addActionListener(e -> this.onDebugTokenHighlightsClicked()); this.printMappingTreeItem.addActionListener(e -> this.onPrintMappingTreeClicked()); } @@ -243,6 +252,9 @@ public void updateUiState() { this.exportJarItem.setEnabled(jarOpen); this.statsItem.setEnabled(jarOpen); this.printMappingTreeItem.setEnabled(jarOpen); + + this.showMappingSourcePluginItem.setState(Config.main().development.showMappingSourcePlugin.value()); + this.debugTokenHighlightsItem.setState(Config.main().development.debugTokenHighlights.value()); } public void retranslateUi() { @@ -292,7 +304,9 @@ public void retranslateUi() { this.githubItem.setText(I18n.translate("menu.help.github")); this.devMenu.setText("Dev"); - this.printMappingTreeItem.setText("Print mapping tree"); + this.showMappingSourcePluginItem.setText(I18n.translate("dev.menu.show_mapping_source_plugin")); + this.debugTokenHighlightsItem.setText(I18n.translate("dev.menu.debug_token_highlights")); + this.printMappingTreeItem.setText(I18n.translate("dev.menu.print_mapping_tree")); } private void onOpenJarClicked() { @@ -479,22 +493,51 @@ private void onGithubClicked() { GuiUtil.openUrl("https://github.com/QuiltMC/Enigma"); } + private void onShowMappingSourcePluginClicked() { + var value = this.showMappingSourcePluginItem.getState(); + Config.main().development.showMappingSourcePlugin.setValue(value, true); + } + + private void onDebugTokenHighlightsClicked() { + var value = this.debugTokenHighlightsItem.getState(); + Config.main().development.debugTokenHighlights.setValue(value, true); + } + private void onPrintMappingTreeClicked() { var mappings = this.gui.getController().getProject().getRemapper().getMappings(); - StringWriter text = new StringWriter(); + var text = new StringWriter(); EntryTreePrinter.print(new PrintWriter(text), mappings); - var frame = new JFrame("Mapping Tree"); + var frame = new JFrame(I18n.translate("dev.mapping_tree")); var pane = frame.getContentPane(); pane.setLayout(new BorderLayout()); var textArea = new JTextArea(text.toString()); textArea.setFont(ScaleUtil.getFont(Font.MONOSPACED, Font.PLAIN, 12)); pane.add(new JScrollPane(textArea), BorderLayout.CENTER); - var button = new JButton("Close"); - button.addActionListener(e -> frame.dispose()); - pane.add(button, BorderLayout.SOUTH); + + var buttonPane = new JPanel(); + + var saveButton = new JButton(I18n.translate("prompt.save")); + saveButton.addActionListener(e -> { + var chooser = new JFileChooser(); + chooser.setSelectedFile(new File("mapping_tree.txt")); + if (chooser.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION) { + try { + Files.writeString(chooser.getSelectedFile().toPath(), text.toString()); + } catch (IOException ex) { + Logger.error(ex, "Failed to save the mapping tree"); + } + } + }); + buttonPane.add(saveButton); + + var closeButton = new JButton(I18n.translate("prompt.ok")); + closeButton.addActionListener(e -> frame.dispose()); + buttonPane.add(closeButton); + + pane.add(buttonPane, BorderLayout.SOUTH); frame.setSize(ScaleUtil.getDimension(1200, 400)); frame.setLocationRelativeTo(this.gui.getFrame()); 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 b4c589713..20696a766 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 @@ -2,6 +2,7 @@ import org.quiltmc.enigma.gui.EditableType; import org.quiltmc.enigma.gui.Gui; +import org.quiltmc.enigma.gui.config.Config; import org.quiltmc.enigma.gui.element.ConvertingTextField; import org.quiltmc.enigma.gui.event.ConvertingTextFieldListener; import org.quiltmc.enigma.gui.util.GridBagConstraintsBuilder; @@ -150,6 +151,11 @@ public void refreshReference() { } else { throw new IllegalStateException("unreachable"); } + + if (Config.main().development.showMappingSourcePlugin.value()) { + var mapping = this.gui.getController().getProject().getRemapper().getMapping(this.entry); + th.addStringRow(I18n.translate("dev.source_plugin"), mapping.sourcePluginId()); + } } th.end(); diff --git a/enigma/src/main/java/org/quiltmc/enigma/api/source/DecompiledClassSource.java b/enigma/src/main/java/org/quiltmc/enigma/api/source/DecompiledClassSource.java index ccfa3fc61..6d3050167 100644 --- a/enigma/src/main/java/org/quiltmc/enigma/api/source/DecompiledClassSource.java +++ b/enigma/src/main/java/org/quiltmc/enigma/api/source/DecompiledClassSource.java @@ -17,7 +17,7 @@ import java.util.Map; public class DecompiledClassSource { - protected static final boolean DEBUG_TOKEN_HIGHLIGHTS = false; + public static boolean DEBUG_TOKEN_HIGHLIGHTS = false; private final ClassEntry classEntry; diff --git a/enigma/src/main/java/org/quiltmc/enigma/util/EntryTreePrinter.java b/enigma/src/main/java/org/quiltmc/enigma/util/EntryTreePrinter.java index de6477264..c1d21fad2 100644 --- a/enigma/src/main/java/org/quiltmc/enigma/util/EntryTreePrinter.java +++ b/enigma/src/main/java/org/quiltmc/enigma/util/EntryTreePrinter.java @@ -46,7 +46,7 @@ private void printNode(EntryTreeNode node, boolean hasNext, String indent var iterator = node.getChildNodes().iterator(); while (iterator.hasNext()) { var child = iterator.next(); - var childIndent = indent + (hasNext ? "│\u00A0\u00A0 " : " "); // \u00A0 is non-breaking space + var childIndent = indent + (hasNext ? "│ " : " "); this.printNode(child, iterator.hasNext(), childIndent); } diff --git a/enigma/src/main/resources/lang/en_us.json b/enigma/src/main/resources/lang/en_us.json index dbb25bb56..49eaedc4d 100644 --- a/enigma/src/main/resources/lang/en_us.json +++ b/enigma/src/main/resources/lang/en_us.json @@ -343,5 +343,11 @@ "notification.type.info": "Info", "notification.level.none": "No server notifications", "notification.level.no_chat": "No chat messages", - "notification.level.full": "All server notifications" + "notification.level.full": "All server notifications", + + "dev.menu.show_mapping_source_plugin": "Show mapping source plugin", + "dev.menu.debug_token_highlights": "Debug token highlights", + "dev.menu.print_mapping_tree": "Print mapping tree", + "dev.mapping_tree": "Mapping tree", + "dev.source_plugin": "Source plugin" }