Skip to content

refactor menu bar into individual classes #261

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import org.quiltmc.enigma.api.Enigma;
import org.quiltmc.enigma.api.EnigmaPlugin;
import org.quiltmc.enigma.api.EnigmaProfile;
import org.quiltmc.enigma.api.stats.GenerationParameters;
import org.quiltmc.enigma.api.stats.ProjectStatsResult;
import org.quiltmc.enigma.api.stats.StatType;
import org.quiltmc.enigma.api.stats.StatsGenerator;
Expand Down Expand Up @@ -47,7 +48,7 @@ public static void run(Path inJar, Path mappings, @Nullable Path profilePath, @N

public static void run(Path inJar, Path mappings, Enigma enigma) throws Exception {
StatsGenerator generator = new StatsGenerator(openProject(inJar, mappings, enigma));
ProjectStatsResult result = generator.generate(new ConsoleProgressListener(), Set.of(StatType.values()), false);
ProjectStatsResult result = generator.generate(new ConsoleProgressListener(), new GenerationParameters(Set.of(StatType.values())));

Logger.info(String.format("Overall mapped: %.2f%% (%s / %s)", result.getPercentage(), result.getMapped(), result.getMappable()));
Logger.info(String.format("Classes: %.2f%% (%s / %s)", result.getPercentage(StatType.CLASSES), result.getMapped(StatType.CLASSES), result.getMappable(StatType.CLASSES)));
Expand Down
4 changes: 2 additions & 2 deletions enigma-swing/src/main/java/org/quiltmc/enigma/gui/Gui.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
import org.quiltmc.enigma.gui.docker.StructureDocker;
import org.quiltmc.enigma.gui.element.EditorTabbedPane;
import org.quiltmc.enigma.gui.element.MainWindow;
import org.quiltmc.enigma.gui.element.MenuBar;
import org.quiltmc.enigma.gui.element.menu_bar.MenuBar;
import org.quiltmc.enigma.gui.panel.EditorPanel;
import org.quiltmc.enigma.gui.panel.IdentifierPanel;
import org.quiltmc.enigma.gui.renderer.MessageListCellRenderer;
Expand Down Expand Up @@ -282,7 +282,7 @@ public boolean isTestEnvironment() {

public void addCrash(Throwable t) {
this.crashHistory.add(t);
this.menuBar.prepareCrashHistoryMenu();
this.menuBar.getFileMenu().prepareCrashHistoryMenu();
}

public DockerManager getDockerManager() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.quiltmc.enigma.api.analysis.EntryReference;
import org.quiltmc.enigma.api.analysis.tree.FieldReferenceTreeNode;
import org.quiltmc.enigma.api.service.ReadWriteService;
import org.quiltmc.enigma.api.stats.GenerationParameters;
import org.quiltmc.enigma.api.translation.representation.entry.LocalVariableEntry;
import org.quiltmc.enigma.gui.dialog.CrashDialog;
import org.quiltmc.enigma.gui.docker.ClassesDocker;
Expand Down Expand Up @@ -166,7 +167,7 @@ public CompletableFuture<Void> openMappings(ReadWriteService readWriteService, P

this.gui.setMappingsFile(path);
Config.insertRecentProject(this.project.getJarPath().toString(), path.toString());
this.gui.getMenuBar().reloadOpenRecentMenu(this.gui);
this.gui.getMenuBar().getFileMenu().reloadOpenRecentMenu();

return ProgressDialog.runOffThread(this.gui, progress -> {
try {
Expand All @@ -179,18 +180,7 @@ public CompletableFuture<Void> openMappings(ReadWriteService readWriteService, P
this.refreshClasses();
this.chp.invalidateJavadoc();
this.statsGenerator = new StatsGenerator(this.project);
new Thread(() -> {
ProgressListener progressListener = ProgressListener.createEmpty();
this.gui.getMainWindow().getStatusBar().syncWith(progressListener);
this.statsGenerator.generate(progressListener, EditableType.toStatTypes(this.gui.getEditableTypes()), false);

// ensure all class tree dockers show the update to the stats icons
for (Docker docker : this.gui.getDockerManager().getActiveDockers().values()) {
if (docker instanceof ClassesDocker) {
docker.repaint();
}
}
}).start();
new Thread(this::regenerateAndUpdateStatIcons).start();
} catch (MappingParseException e) {
JOptionPane.showMessageDialog(this.gui.getFrame(), e.getMessage());
} catch (Exception e) {
Expand All @@ -208,6 +198,26 @@ public void openMappings(EntryTree<EntryMapping> mappings) {
this.chp.invalidateJavadoc();
}

public void regenerateAndUpdateStatIcons() {
if (Config.main().features.enableClassTreeStatIcons.value()) {
ProgressListener progressListener = ProgressListener.createEmpty();
this.gui.getMainWindow().getStatusBar().syncWith(progressListener);

var includedTypes = EditableType.toStatTypes(this.gui.getEditableTypes());
includedTypes.removeIf(type -> !Config.stats().includedStatTypes.value().contains(type));

GenerationParameters parameters = new GenerationParameters(includedTypes, Config.stats().shouldIncludeSyntheticParameters.value(), Config.stats().shouldCountFallbackNames.value());
this.statsGenerator.generate(progressListener, parameters);
}

// ensure all class tree dockers show the update to the stats icons
for (Docker docker : this.gui.getDockerManager().getActiveDockers().values()) {
if (docker instanceof ClassesDocker) {
docker.repaint();
}
}
}

public CompletableFuture<Void> saveMappings(Path path) {
return this.saveMappings(path, this.readWriteService);
}
Expand Down Expand Up @@ -594,7 +604,7 @@ private void applyChange0(ValidationContext vc, EntryChange<?> change, boolean u

public void openStatsTree(Set<StatType> includedTypes) {
ProgressDialog.runOffThread(this.gui, progress -> {
StatsResult overall = this.getStatsGenerator().getResult(EditableType.toStatTypes(this.gui.getEditableTypes()), false).getOverall();
StatsResult overall = this.getStatsGenerator().getResult(new GenerationParameters(EditableType.toStatTypes(this.gui.getEditableTypes()))).getOverall();
StatsTree<Integer> tree = overall.buildTree(Config.main().stats.lastTopLevelPackage.value(), includedTypes);
String treeJson = GSON.toJson(tree.root);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,10 @@ public static Config main() {
return MAIN;
}

public static StatsSection stats() {
return main().stats;
}

public static DockerConfig dockers() {
return DOCKER;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,17 @@
import org.quiltmc.config.api.annotations.SerializedNameConvention;
import org.quiltmc.config.api.metadata.NamingSchemes;
import org.quiltmc.config.api.values.TrackedValue;
import org.quiltmc.config.api.values.ValueList;
import org.quiltmc.enigma.api.stats.StatType;

import java.util.EnumSet;

@SerializedNameConvention(NamingSchemes.SNAKE_CASE)
public class StatsSection extends ReflectiveConfig.Section {
public final TrackedValue<String> lastSelectedDir = this.value("");
public final TrackedValue<String> lastTopLevelPackage = this.value("");

public final TrackedValue<ValueList<StatType>> includedStatTypes = this.list(StatType.CLASSES, EnumSet.allOf(StatType.class).toArray(StatType[]::new));
public final TrackedValue<Boolean> shouldIncludeSyntheticParameters = this.value(false);
public final TrackedValue<Boolean> shouldCountFallbackNames = this.value(false);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.quiltmc.enigma.gui.dialog;

import org.quiltmc.enigma.api.stats.GenerationParameters;
import org.quiltmc.enigma.api.stats.StatsGenerator;
import org.quiltmc.enigma.gui.EditableType;
import org.quiltmc.enigma.gui.Gui;
Expand Down Expand Up @@ -38,7 +39,7 @@ public static void show(Gui gui) {
listener.sync(generator.getOverallProgress());
}

ProjectStatsResult result = gui.getController().getStatsGenerator().getResult(EditableType.toStatTypes(gui.getEditableTypes()), false);
ProjectStatsResult result = gui.getController().getStatsGenerator().getResult(new GenerationParameters(EditableType.toStatTypes(gui.getEditableTypes())));
SwingUtilities.invokeLater(() -> show(gui, result, ""));
});
} else {
Expand Down Expand Up @@ -90,6 +91,11 @@ public static void show(Gui gui, ProjectStatsResult result, String packageName)
syntheticParametersOption.setSelected(Config.main().stats.shouldIncludeSyntheticParameters.value());
contentPane.add(syntheticParametersOption, cb1.pos(0, result.getOverall().getTypes().size() + 4).build());

// show synthetic members option
JCheckBox countFallbackOption = new JCheckBox(I18n.translate("menu.file.stats.count_fallback"));
countFallbackOption.setSelected(Config.main().stats.shouldCountFallbackNames.value());
contentPane.add(countFallbackOption, cb1.pos(0, result.getOverall().getTypes().size() + 3).build());

// show filter button
JButton filterButton = new JButton(I18n.translate("menu.file.stats.filter"));
filterButton.addActionListener(action -> {
Expand All @@ -98,20 +104,22 @@ public static void show(Gui gui, ProjectStatsResult result, String packageName)
String topLevelPackageSlashes = topLevelPackage.getText().replace('.', '/');
Config.main().stats.lastTopLevelPackage.setValue(topLevelPackage.getText(), true);

ProjectStatsResult projectResult = gui.getController().getStatsGenerator().getResult(EditableType.toStatTypes(gui.getEditableTypes()), syntheticParametersOption.isSelected()).filter(topLevelPackageSlashes);
GenerationParameters parameters = new GenerationParameters(EditableType.toStatTypes(gui.getEditableTypes()), syntheticParametersOption.isSelected(), countFallbackOption.isSelected());
StatsGenerator generator = gui.getController().getStatsGenerator();
ProjectStatsResult projectResult = generator.getResult(parameters).filter(topLevelPackageSlashes);

SwingUtilities.invokeLater(() -> show(gui, projectResult, topLevelPackageSlashes));
});
});
contentPane.add(filterButton, cb1.pos(0, result.getOverall().getTypes().size() + 3).anchor(GridBagConstraints.EAST).build());
contentPane.add(filterButton, cb1.pos(0, result.getOverall().getTypes().size() + 5).anchor(GridBagConstraints.EAST).build());

// show generate button
JButton button = new JButton(I18n.translate("menu.file.stats.generate"));
button.setEnabled(false);
button.addActionListener(action -> {
dialog.dispose();

Config.main().stats.lastTopLevelPackage.setValue(topLevelPackage.getText(), true);
Config.main().stats.shouldIncludeSyntheticParameters.setValue(syntheticParametersOption.isSelected(), true);
Config.main().stats.lastTopLevelPackage.setValue(topLevelPackage.getText());

generateStats(gui, checkboxes);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ public CollabDocker(Gui gui) {
connectionButtonPanel.add(this.startServerButton, BorderLayout.NORTH);
connectionButtonPanel.add(this.connectToServerButton, BorderLayout.SOUTH);

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

// we make a copy of the title bar to avoid having to shuffle it around both panels
this.titleCopy = new DockerTitleBar(gui, this, this.titleSupplier);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,14 @@ public Component getTreeCellRendererComponent(JTree tree, Object value, boolean

if ((this.controller.getProject() != null && leaf && value instanceof ClassSelectorClassNode)
|| (this.controller.getProject() != null && value instanceof ClassSelectorPackageNode)) {
TooltipPanel panel;
StatsTooltipPanel panel;
Icon icon;
Function<ProjectStatsResult, Icon> deobfuscationIconGetter;
Runnable reloader;

if (value instanceof ClassSelectorPackageNode node) {
class PackageTooltipPanel extends TooltipPanel {
PackageTooltipPanel(GuiController controller) {
class PackageStatsTooltipPanel extends StatsTooltipPanel {
PackageStatsTooltipPanel(GuiController controller) {
super(controller);
}

Expand All @@ -56,15 +56,15 @@ String getDisplayName() {
}
}

panel = new PackageTooltipPanel(this.controller);
panel = new PackageStatsTooltipPanel(this.controller);
icon = GuiUtil.getFolderIcon(this, tree, node);
deobfuscationIconGetter = projectStatsResult -> GuiUtil.getDeobfuscationIcon(projectStatsResult, node.getPackageName());
reloader = () -> {};
} else {
ClassSelectorClassNode node = (ClassSelectorClassNode) value;

class ClassTooltipPanel extends TooltipPanel {
ClassTooltipPanel(GuiController controller) {
class ClassStatsTooltipPanel extends StatsTooltipPanel {
ClassStatsTooltipPanel(GuiController controller) {
super(controller);
}

Expand All @@ -79,7 +79,7 @@ String getDisplayName() {
}
}

panel = new ClassTooltipPanel(this.controller);
panel = new ClassStatsTooltipPanel(this.controller);
icon = GuiUtil.getClassIcon(this.controller.getGui(), node.getObfEntry());
deobfuscationIconGetter = projectStatsResult -> GuiUtil.getDeobfuscationIcon(projectStatsResult, node.getObfEntry());
reloader = () -> node.reloadStats(this.controller.getGui(), this.selector, false);
Expand Down
Loading