From cb338dd7e6ab834a1446b65ea9adcc47b233217b Mon Sep 17 00:00:00 2001 From: Juuxel Date: Sat, 20 Mar 2021 14:02:47 +0200 Subject: Switch to SVG icons instead of PNGs and add icon for records The PNG icons scaled horribly on FlatLaf but these ones look smooth on any scaling level. Note: even though the icons are FlatSVGIcons from FlatLaf, they work properly on all LaFs if the FlatLaf UI scale property is set to the correct value (which LookAndFeel.setGlobalLAF does). --- enigma-swing/build.gradle | 1 + .../java/cuchaz/enigma/gui/config/LookAndFeel.java | 1 + .../main/java/cuchaz/enigma/gui/util/GuiUtil.java | 20 ++-- .../src/main/resources/icons/annotation.png | Bin 877 -> 0 bytes .../src/main/resources/icons/annotation.svg | 112 ++++++++++++++++++++ enigma-swing/src/main/resources/icons/class.png | Bin 768 -> 0 bytes enigma-swing/src/main/resources/icons/class.svg | 88 ++++++++++++++++ .../src/main/resources/icons/constructor.png | Bin 751 -> 0 bytes .../src/main/resources/icons/constructor.svg | 113 +++++++++++++++++++++ enigma-swing/src/main/resources/icons/enum.png | Bin 506 -> 0 bytes enigma-swing/src/main/resources/icons/enum.svg | 88 ++++++++++++++++ enigma-swing/src/main/resources/icons/field.png | Bin 534 -> 0 bytes enigma-swing/src/main/resources/icons/field.svg | 88 ++++++++++++++++ .../src/main/resources/icons/interface.png | Bin 538 -> 0 bytes .../src/main/resources/icons/interface.svg | 88 ++++++++++++++++ enigma-swing/src/main/resources/icons/method.png | Bin 633 -> 0 bytes enigma-swing/src/main/resources/icons/method.svg | 113 +++++++++++++++++++++ enigma-swing/src/main/resources/icons/record.svg | 88 ++++++++++++++++ .../translation/representation/AccessFlags.java | 4 + 19 files changed, 791 insertions(+), 13 deletions(-) delete mode 100644 enigma-swing/src/main/resources/icons/annotation.png create mode 100644 enigma-swing/src/main/resources/icons/annotation.svg delete mode 100644 enigma-swing/src/main/resources/icons/class.png create mode 100644 enigma-swing/src/main/resources/icons/class.svg delete mode 100644 enigma-swing/src/main/resources/icons/constructor.png create mode 100644 enigma-swing/src/main/resources/icons/constructor.svg delete mode 100644 enigma-swing/src/main/resources/icons/enum.png create mode 100644 enigma-swing/src/main/resources/icons/enum.svg delete mode 100644 enigma-swing/src/main/resources/icons/field.png create mode 100644 enigma-swing/src/main/resources/icons/field.svg delete mode 100644 enigma-swing/src/main/resources/icons/interface.png create mode 100644 enigma-swing/src/main/resources/icons/interface.svg delete mode 100644 enigma-swing/src/main/resources/icons/method.png create mode 100644 enigma-swing/src/main/resources/icons/method.svg create mode 100644 enigma-swing/src/main/resources/icons/record.svg diff --git a/enigma-swing/build.gradle b/enigma-swing/build.gradle index 06b28bb3..319f73a3 100644 --- a/enigma-swing/build.gradle +++ b/enigma-swing/build.gradle @@ -9,6 +9,7 @@ dependencies { implementation 'net.sf.jopt-simple:jopt-simple:6.0-alpha-3' implementation 'com.formdev:flatlaf:1.0' + implementation 'com.formdev:flatlaf-extras:1.0' // for SVG icons implementation 'de.sciss:syntaxpane:1.2.0' implementation 'com.github.lukeu:swing-dpi:0.9' implementation 'org.drjekyll:fontchooser:2.4' diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/config/LookAndFeel.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/config/LookAndFeel.java index e21ef52c..3edc87a2 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/config/LookAndFeel.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/config/LookAndFeel.java @@ -36,6 +36,7 @@ public enum LookAndFeel { public void setGlobalLAF() { // Configure FlatLaf's UI scale to be our scale factor. + // This is also used for the SVG icons, so it applies even when some other LaF is active. System.setProperty(FlatSystemProperties.UI_SCALE, Float.toString(ScaleUtil.getScaleFactor())); try { diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java index 1a86148d..60414f99 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java @@ -1,19 +1,18 @@ package cuchaz.enigma.gui.util; +import com.formdev.flatlaf.extras.FlatSVGIcon; import cuchaz.enigma.gui.Gui; import cuchaz.enigma.translation.representation.AccessFlags; import cuchaz.enigma.translation.representation.entry.ClassEntry; import cuchaz.enigma.translation.representation.entry.MethodEntry; import cuchaz.enigma.utils.Os; -import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.font.TextAttribute; import java.io.IOException; -import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.util.Map; @@ -23,6 +22,7 @@ public class GuiUtil { public static final Icon INTERFACE_ICON = loadIcon("interface"); public static final Icon ENUM_ICON = loadIcon("enum"); public static final Icon ANNOTATION_ICON = loadIcon("annotation"); + public static final Icon RECORD_ICON = loadIcon("record"); public static final Icon METHOD_ICON = loadIcon("method"); public static final Icon FIELD_ICON = loadIcon("field"); public static final Icon CONSTRUCTOR_ICON = loadIcon("constructor"); @@ -79,15 +79,9 @@ public class GuiUtil { } public static Icon loadIcon(String name) { - try { - InputStream inputStream = GuiUtil.class.getResourceAsStream("/icons/" + name + ".png"); - Image image = ImageIO.read(inputStream).getScaledInstance(ScaleUtil.scale(16), ScaleUtil.scale(16), Image.SCALE_DEFAULT); - return new ImageIcon(image); - } catch (IOException e) { - e.printStackTrace(); - } - - return null; + // Note: the width and height are scaled automatically because the FlatLaf UI scale + // is set in LookAndFeel.setGlobalLAF() + return new FlatSVGIcon("icons/" + name + ".svg", 16, 16, GuiUtil.class.getClassLoader()); } public static Icon getClassIcon(Gui gui, ClassEntry entry) { @@ -100,9 +94,9 @@ public class GuiUtil { return INTERFACE_ICON; } else if (access.isEnum()) { return ENUM_ICON; + } else if (access.isRecord()) { + return RECORD_ICON; } - - // TODO: Record icon? } return CLASS_ICON; diff --git a/enigma-swing/src/main/resources/icons/annotation.png b/enigma-swing/src/main/resources/icons/annotation.png deleted file mode 100644 index 9589a67e..00000000 Binary files a/enigma-swing/src/main/resources/icons/annotation.png and /dev/null differ diff --git a/enigma-swing/src/main/resources/icons/annotation.svg b/enigma-swing/src/main/resources/icons/annotation.svg new file mode 100644 index 00000000..b6855571 --- /dev/null +++ b/enigma-swing/src/main/resources/icons/annotation.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/enigma-swing/src/main/resources/icons/class.png b/enigma-swing/src/main/resources/icons/class.png deleted file mode 100644 index 17d82ecd..00000000 Binary files a/enigma-swing/src/main/resources/icons/class.png and /dev/null differ diff --git a/enigma-swing/src/main/resources/icons/class.svg b/enigma-swing/src/main/resources/icons/class.svg new file mode 100644 index 00000000..bd76406d --- /dev/null +++ b/enigma-swing/src/main/resources/icons/class.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/enigma-swing/src/main/resources/icons/constructor.png b/enigma-swing/src/main/resources/icons/constructor.png deleted file mode 100644 index 3728b554..00000000 Binary files a/enigma-swing/src/main/resources/icons/constructor.png and /dev/null differ diff --git a/enigma-swing/src/main/resources/icons/constructor.svg b/enigma-swing/src/main/resources/icons/constructor.svg new file mode 100644 index 00000000..8dd8f679 --- /dev/null +++ b/enigma-swing/src/main/resources/icons/constructor.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/enigma-swing/src/main/resources/icons/enum.png b/enigma-swing/src/main/resources/icons/enum.png deleted file mode 100644 index b64dc829..00000000 Binary files a/enigma-swing/src/main/resources/icons/enum.png and /dev/null differ diff --git a/enigma-swing/src/main/resources/icons/enum.svg b/enigma-swing/src/main/resources/icons/enum.svg new file mode 100644 index 00000000..25eaf0bb --- /dev/null +++ b/enigma-swing/src/main/resources/icons/enum.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/enigma-swing/src/main/resources/icons/field.png b/enigma-swing/src/main/resources/icons/field.png deleted file mode 100644 index 4ac1aab9..00000000 Binary files a/enigma-swing/src/main/resources/icons/field.png and /dev/null differ diff --git a/enigma-swing/src/main/resources/icons/field.svg b/enigma-swing/src/main/resources/icons/field.svg new file mode 100644 index 00000000..6a89f3a8 --- /dev/null +++ b/enigma-swing/src/main/resources/icons/field.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/enigma-swing/src/main/resources/icons/interface.png b/enigma-swing/src/main/resources/icons/interface.png deleted file mode 100644 index fc2bfe56..00000000 Binary files a/enigma-swing/src/main/resources/icons/interface.png and /dev/null differ diff --git a/enigma-swing/src/main/resources/icons/interface.svg b/enigma-swing/src/main/resources/icons/interface.svg new file mode 100644 index 00000000..750e8125 --- /dev/null +++ b/enigma-swing/src/main/resources/icons/interface.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/enigma-swing/src/main/resources/icons/method.png b/enigma-swing/src/main/resources/icons/method.png deleted file mode 100644 index e4e96797..00000000 Binary files a/enigma-swing/src/main/resources/icons/method.png and /dev/null differ diff --git a/enigma-swing/src/main/resources/icons/method.svg b/enigma-swing/src/main/resources/icons/method.svg new file mode 100644 index 00000000..751ea55d --- /dev/null +++ b/enigma-swing/src/main/resources/icons/method.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/enigma-swing/src/main/resources/icons/record.svg b/enigma-swing/src/main/resources/icons/record.svg new file mode 100644 index 00000000..32f2e5f0 --- /dev/null +++ b/enigma-swing/src/main/resources/icons/record.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/enigma/src/main/java/cuchaz/enigma/translation/representation/AccessFlags.java b/enigma/src/main/java/cuchaz/enigma/translation/representation/AccessFlags.java index e8480a26..21e6ef4e 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/representation/AccessFlags.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/representation/AccessFlags.java @@ -39,6 +39,10 @@ public class AccessFlags { return (flags & Opcodes.ACC_ENUM) != 0; } + public boolean isRecord() { + return (flags & Opcodes.ACC_RECORD) != 0; + } + public boolean isBridge() { return (flags & Opcodes.ACC_BRIDGE) != 0; } -- cgit v1.2.3 From 6feac8fd8839f54c1f91176cc0412c397de2b19e Mon Sep 17 00:00:00 2001 From: Juuxel Date: Sat, 20 Mar 2021 14:19:41 +0200 Subject: Add a check for missing SVG icon files Improves debugging if the icon is missing as FlatLaf's own error is thrown at render time. --- enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java index 60414f99..cfa02cbd 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java @@ -16,6 +16,7 @@ import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.Map; +import java.util.NoSuchElementException; public class GuiUtil { public static final Icon CLASS_ICON = loadIcon("class"); @@ -79,9 +80,16 @@ public class GuiUtil { } public static Icon loadIcon(String name) { + String path = "icons/" + name + ".svg"; + + // Do an eager check for a missing icon since FlatSVGIcon does it later at render time + if (GuiUtil.class.getResource(path) == null) { + throw new NoSuchElementException("Missing icon: '" + name + "' at " + path); + } + // Note: the width and height are scaled automatically because the FlatLaf UI scale // is set in LookAndFeel.setGlobalLAF() - return new FlatSVGIcon("icons/" + name + ".svg", 16, 16, GuiUtil.class.getClassLoader()); + return new FlatSVGIcon(path, 16, 16, GuiUtil.class.getClassLoader()); } public static Icon getClassIcon(Gui gui, ClassEntry entry) { -- cgit v1.2.3 From 3599ef60d245960d591fc022c4fcdacb085d55dc Mon Sep 17 00:00:00 2001 From: Juuxel Date: Sat, 20 Mar 2021 14:21:42 +0200 Subject: Fix missing icon check --- enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java index cfa02cbd..7f08fc25 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java @@ -83,7 +83,7 @@ public class GuiUtil { String path = "icons/" + name + ".svg"; // Do an eager check for a missing icon since FlatSVGIcon does it later at render time - if (GuiUtil.class.getResource(path) == null) { + if (GuiUtil.class.getResource('/' + path) == null) { throw new NoSuchElementException("Missing icon: '" + name + "' at " + path); } -- cgit v1.2.3