Skip to content

Commit 94025f3

Browse files
refactor menu bar into individual classes (#261)
* add option for counting fallback items * refactor GenerationParameters to its own class * add count fallback checkbox to stats dialog * add options in menu for changing stat icon settings * fix checkstyle * fix issues * rework config and add more options * refactor menu bar code * break out stats menu * checkstyle * fully break view menu, add default constructor, properly update state in StatsMenu * break out file menu; fix format translations * checkstyle * fix collab menu translations, pass jarOpen and ConnectionState to updateState * apply suggestions Co-authored-by: Will <[email protected]> * naming changes * button group FAIL * fix scale menu weirdness * fix name --------- Co-authored-by: Will <[email protected]>
1 parent 0a34224 commit 94025f3

24 files changed

+1247
-776
lines changed

enigma-swing/src/main/java/org/quiltmc/enigma/gui/Gui.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import org.quiltmc.enigma.gui.docker.StructureDocker;
2828
import org.quiltmc.enigma.gui.element.EditorTabbedPane;
2929
import org.quiltmc.enigma.gui.element.MainWindow;
30-
import org.quiltmc.enigma.gui.element.MenuBar;
30+
import org.quiltmc.enigma.gui.element.menu_bar.MenuBar;
3131
import org.quiltmc.enigma.gui.panel.EditorPanel;
3232
import org.quiltmc.enigma.gui.panel.IdentifierPanel;
3333
import org.quiltmc.enigma.gui.renderer.MessageListCellRenderer;
@@ -287,7 +287,7 @@ public boolean isTestEnvironment() {
287287

288288
public void addCrash(Throwable t) {
289289
this.crashHistory.add(t);
290-
this.menuBar.prepareCrashHistoryMenu();
290+
this.menuBar.getFileMenu().updateState();
291291
}
292292

293293
public DockerManager getDockerManager() {

enigma-swing/src/main/java/org/quiltmc/enigma/gui/GuiController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public CompletableFuture<Void> openMappings(ReadWriteService readWriteService, P
165165

166166
this.gui.setMappingsFile(path);
167167
Config.insertRecentProject(this.project.getJarPath().toString(), path.toString());
168-
this.gui.getMenuBar().reloadOpenRecentMenu(this.gui);
168+
this.gui.getMenuBar().getFileMenu().updateState();
169169

170170
return ProgressDialog.runOffThread(this.gui, progress -> {
171171
try {
@@ -239,7 +239,7 @@ public CompletableFuture<Void> saveMappings(Path path, ReadWriteService service,
239239
if (this.project == null) {
240240
return CompletableFuture.completedFuture(null);
241241
} else if (!service.supportsWriting()) {
242-
String nonWriteableMessage = I18n.translateFormatted("menu.file.save.non_writeable", I18n.translate("mapping_format." + service.getId().split(":")[1].toLowerCase()));
242+
String nonWriteableMessage = I18n.translateFormatted("menu.file.save.non_writeable", I18n.translate(service.getId()));
243243
JOptionPane.showMessageDialog(this.gui.getFrame(), nonWriteableMessage, I18n.translate("menu.file.save.cannot_save"), JOptionPane.ERROR_MESSAGE);
244244
return CompletableFuture.completedFuture(null);
245245
}

enigma-swing/src/main/java/org/quiltmc/enigma/gui/docker/CollabDocker.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ public CollabDocker(Gui gui) {
5454
connectionButtonPanel.add(this.startServerButton, BorderLayout.NORTH);
5555
connectionButtonPanel.add(this.connectToServerButton, BorderLayout.SOUTH);
5656

57-
this.startServerButton.addActionListener(e -> this.gui.getMenuBar().onStartServerClicked());
58-
this.connectToServerButton.addActionListener(e -> this.gui.getMenuBar().onConnectClicked());
57+
this.startServerButton.addActionListener(e -> this.gui.getMenuBar().getCollabMenu().onStartServerClicked());
58+
this.connectToServerButton.addActionListener(e -> this.gui.getMenuBar().getCollabMenu().onConnectClicked());
5959

6060
// we make a copy of the title bar to avoid having to shuffle it around both panels
6161
this.titleCopy = new DockerTitleBar(gui, this, this.titleSupplier);

enigma-swing/src/main/java/org/quiltmc/enigma/gui/element/MenuBar.java

Lines changed: 0 additions & 753 deletions
This file was deleted.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.quiltmc.enigma.gui.element.menu_bar;
2+
3+
import org.quiltmc.enigma.gui.Gui;
4+
5+
import javax.swing.JMenu;
6+
7+
public class AbstractEnigmaMenu extends JMenu implements EnigmaMenu {
8+
protected final Gui gui;
9+
10+
protected AbstractEnigmaMenu(Gui gui) {
11+
this.gui = gui;
12+
}
13+
14+
public void updateState() {
15+
this.updateState(this.gui.isJarOpen(), this.gui.getConnectionState());
16+
}
17+
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package org.quiltmc.enigma.gui.element.menu_bar;
2+
3+
import org.quiltmc.enigma.gui.ConnectionState;
4+
import org.quiltmc.enigma.gui.Gui;
5+
import org.quiltmc.enigma.gui.NotificationManager;
6+
import org.quiltmc.enigma.gui.config.Config;
7+
import org.quiltmc.enigma.gui.dialog.ConnectToServerDialog;
8+
import org.quiltmc.enigma.gui.dialog.CreateServerDialog;
9+
import org.quiltmc.enigma.util.I18n;
10+
import org.quiltmc.enigma.util.validation.Message;
11+
import org.quiltmc.enigma.util.validation.ParameterizedMessage;
12+
13+
import javax.swing.JMenuItem;
14+
import javax.swing.JOptionPane;
15+
import java.io.IOException;
16+
import java.util.Arrays;
17+
18+
public class CollabMenu extends AbstractEnigmaMenu {
19+
private final JMenuItem connectItem = new JMenuItem();
20+
private final JMenuItem startServerItem = new JMenuItem();
21+
22+
public CollabMenu(Gui gui) {
23+
super(gui);
24+
25+
this.add(this.connectItem);
26+
this.add(this.startServerItem);
27+
28+
this.connectItem.addActionListener(e -> this.onConnectClicked());
29+
this.startServerItem.addActionListener(e -> this.onStartServerClicked());
30+
}
31+
32+
@Override
33+
public void retranslate() {
34+
this.setText(I18n.translate("menu.collab"));
35+
this.retranslate(this.gui.getConnectionState());
36+
}
37+
38+
private void retranslate(ConnectionState state) {
39+
this.connectItem.setText(I18n.translate(state != ConnectionState.CONNECTED ? "menu.collab.connect" : "menu.collab.disconnect"));
40+
this.startServerItem.setText(I18n.translate(state != ConnectionState.HOSTING ? "menu.collab.server.start" : "menu.collab.server.stop"));
41+
}
42+
43+
@Override
44+
public void updateState(boolean jarOpen, ConnectionState state) {
45+
this.connectItem.setEnabled(jarOpen && state != ConnectionState.HOSTING);
46+
this.startServerItem.setEnabled(jarOpen && state != ConnectionState.CONNECTED);
47+
this.retranslate(state);
48+
}
49+
50+
public void onConnectClicked() {
51+
if (this.gui.getController().getClient() != null) {
52+
this.gui.getController().disconnectIfConnected(null);
53+
return;
54+
}
55+
56+
ConnectToServerDialog.Result result = ConnectToServerDialog.show(this.gui);
57+
if (result == null) {
58+
return;
59+
}
60+
61+
this.gui.getController().disconnectIfConnected(null);
62+
try {
63+
this.gui.getController().createClient(result.username(), result.address().address, result.address().port, result.password());
64+
if (Config.main().serverNotificationLevel.value() != NotificationManager.ServerNotificationLevel.NONE) {
65+
this.gui.getNotificationManager().notify(new ParameterizedMessage(Message.CONNECTED_TO_SERVER, result.addressStr()));
66+
}
67+
68+
Config.net().username.setValue(result.username(), true);
69+
Config.net().remoteAddress.setValue(result.addressStr(), true);
70+
Config.net().password.setValue(String.valueOf(result.password()), true);
71+
} catch (IOException e) {
72+
JOptionPane.showMessageDialog(this.gui.getFrame(), e.toString(), I18n.translate("menu.collab.connect.error"), JOptionPane.ERROR_MESSAGE);
73+
this.gui.getController().disconnectIfConnected(null);
74+
}
75+
76+
Arrays.fill(result.password(), (char) 0);
77+
}
78+
79+
public void onStartServerClicked() {
80+
if (this.gui.getController().getServer() != null) {
81+
this.gui.getController().disconnectIfConnected(null);
82+
return;
83+
}
84+
85+
CreateServerDialog.Result result = CreateServerDialog.show(this.gui);
86+
if (result == null) {
87+
return;
88+
}
89+
90+
this.gui.getController().disconnectIfConnected(null);
91+
try {
92+
this.gui.getController().createServer(result.username(), result.port(), result.password());
93+
if (Config.main().serverNotificationLevel.value() != NotificationManager.ServerNotificationLevel.NONE) {
94+
this.gui.getNotificationManager().notify(new ParameterizedMessage(Message.SERVER_STARTED, result.port()));
95+
}
96+
97+
Config.net().username.setValue(result.username(), true);
98+
Config.net().serverPort.setValue(result.port(), true);
99+
Config.net().serverPassword.setValue(String.valueOf(result.password()), true);
100+
} catch (IOException e) {
101+
JOptionPane.showMessageDialog(this.gui.getFrame(), e.toString(), I18n.translate("menu.collab.server.start.error"), JOptionPane.ERROR_MESSAGE);
102+
this.gui.getController().disconnectIfConnected(null);
103+
}
104+
}
105+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.quiltmc.enigma.gui.element.menu_bar;
2+
3+
import org.quiltmc.enigma.gui.Gui;
4+
import org.quiltmc.enigma.gui.config.Config;
5+
import org.quiltmc.enigma.gui.config.Decompiler;
6+
import org.quiltmc.enigma.gui.dialog.decompiler.DecompilerSettingsDialog;
7+
import org.quiltmc.enigma.util.I18n;
8+
9+
import javax.swing.ButtonGroup;
10+
import javax.swing.JMenuItem;
11+
import javax.swing.JRadioButtonMenuItem;
12+
13+
public class DecompilerMenu extends AbstractEnigmaMenu {
14+
private final JMenuItem decompilerSettingsItem = new JMenuItem();
15+
16+
public DecompilerMenu(Gui gui) {
17+
super(gui);
18+
19+
ButtonGroup decompilerGroup = new ButtonGroup();
20+
21+
for (Decompiler decompiler : Decompiler.values()) {
22+
JRadioButtonMenuItem decompilerButton = new JRadioButtonMenuItem(decompiler.name);
23+
decompilerGroup.add(decompilerButton);
24+
if (decompiler.equals(Config.decompiler().activeDecompiler.value())) {
25+
decompilerButton.setSelected(true);
26+
}
27+
28+
decompilerButton.addActionListener(event -> {
29+
this.gui.getController().setDecompiler(decompiler.service);
30+
31+
Config.decompiler().activeDecompiler.setValue(decompiler, true);
32+
});
33+
this.add(decompilerButton);
34+
}
35+
36+
this.addSeparator();
37+
this.add(this.decompilerSettingsItem);
38+
39+
this.decompilerSettingsItem.addActionListener(e -> DecompilerSettingsDialog.show(this.gui));
40+
}
41+
42+
@Override
43+
public void retranslate() {
44+
this.setText(I18n.translate("menu.decompiler"));
45+
this.decompilerSettingsItem.setText(I18n.translate("menu.decompiler.settings"));
46+
}
47+
}

enigma-swing/src/main/java/org/quiltmc/enigma/gui/element/DevMenu.java renamed to enigma-swing/src/main/java/org/quiltmc/enigma/gui/element/menu_bar/DevMenu.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
package org.quiltmc.enigma.gui.element;
1+
package org.quiltmc.enigma.gui.element.menu_bar;
22

3+
import org.quiltmc.enigma.gui.ConnectionState;
34
import org.quiltmc.enigma.gui.Gui;
45
import org.quiltmc.enigma.gui.config.Config;
56
import org.quiltmc.enigma.gui.util.ScaleUtil;
@@ -12,7 +13,6 @@
1213
import javax.swing.JCheckBoxMenuItem;
1314
import javax.swing.JFileChooser;
1415
import javax.swing.JFrame;
15-
import javax.swing.JMenu;
1616
import javax.swing.JMenuItem;
1717
import javax.swing.JPanel;
1818
import javax.swing.JScrollPane;
@@ -26,16 +26,14 @@
2626
import java.io.StringWriter;
2727
import java.nio.file.Files;
2828

29-
public class DevMenu extends JMenu {
30-
private final Gui gui;
31-
29+
public class DevMenu extends AbstractEnigmaMenu {
3230
private final JCheckBoxMenuItem showMappingSourcePluginItem = new JCheckBoxMenuItem();
3331
private final JCheckBoxMenuItem debugTokenHighlightsItem = new JCheckBoxMenuItem();
3432
private final JCheckBoxMenuItem logClientPacketsItem = new JCheckBoxMenuItem();
3533
private final JMenuItem printMappingTreeItem = new JMenuItem();
3634

3735
public DevMenu(Gui gui) {
38-
this.gui = gui;
36+
super(gui);
3937

4038
this.add(this.showMappingSourcePluginItem);
4139
this.add(this.debugTokenHighlightsItem);
@@ -48,7 +46,8 @@ public DevMenu(Gui gui) {
4846
this.printMappingTreeItem.addActionListener(e -> this.onPrintMappingTreeClicked());
4947
}
5048

51-
public void retranslateUi() {
49+
@Override
50+
public void retranslate() {
5251
this.setText("Dev");
5352

5453
this.showMappingSourcePluginItem.setText(I18n.translate("dev.menu.show_mapping_source_plugin"));
@@ -57,8 +56,8 @@ public void retranslateUi() {
5756
this.printMappingTreeItem.setText(I18n.translate("dev.menu.print_mapping_tree"));
5857
}
5958

60-
public void updateUiState() {
61-
boolean jarOpen = this.gui.isJarOpen();
59+
@Override
60+
public void updateState(boolean jarOpen, ConnectionState state) {
6261
this.printMappingTreeItem.setEnabled(jarOpen);
6362

6463
this.showMappingSourcePluginItem.setState(Config.main().development.showMappingSourcePlugin.value());
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.quiltmc.enigma.gui.element.menu_bar;
2+
3+
import org.quiltmc.enigma.gui.ConnectionState;
4+
5+
public interface EnigmaMenu {
6+
default void setKeyBinds() {}
7+
8+
default void updateState(boolean jarOpen, ConnectionState state) {}
9+
10+
default void retranslate() {}
11+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.quiltmc.enigma.gui.element.menu_bar;
2+
3+
import org.quiltmc.enigma.gui.Gui;
4+
import org.quiltmc.enigma.gui.dialog.AboutDialog;
5+
import org.quiltmc.enigma.gui.util.GuiUtil;
6+
import org.quiltmc.enigma.util.I18n;
7+
8+
import javax.swing.JMenuItem;
9+
10+
public class HelpMenu extends AbstractEnigmaMenu {
11+
private final JMenuItem aboutItem = new JMenuItem();
12+
private final JMenuItem githubItem = new JMenuItem();
13+
14+
public HelpMenu(Gui gui) {
15+
super(gui);
16+
17+
this.add(this.aboutItem);
18+
this.add(this.githubItem);
19+
20+
this.aboutItem.addActionListener(e -> AboutDialog.show(this.gui.getFrame()));
21+
this.githubItem.addActionListener(e -> this.onGithubClicked());
22+
}
23+
24+
@Override
25+
public void retranslate() {
26+
this.setText(I18n.translate("menu.help"));
27+
this.aboutItem.setText(I18n.translate("menu.help.about"));
28+
this.githubItem.setText(I18n.translate("menu.help.github"));
29+
}
30+
31+
private void onGithubClicked() {
32+
GuiUtil.openUrl("https://github.com/QuiltMC/Enigma");
33+
}
34+
}

0 commit comments

Comments
 (0)