From 161132891d6623b2a88fdbcc14a6fdbfcf3ec34b Mon Sep 17 00:00:00 2001 From: Peter Jakubco Date: Sun, 3 Sep 2023 09:12:45 +0200 Subject: [PATCH] [#76] Fixed loading icon --- .../emulib/runtime/interaction/GuiUtils.java | 6 ++++- .../runtime/interaction/ToolbarButton.java | 21 ++++++++++++++++++ .../interaction/ToolbarToggleButton.java | 22 +++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/emustudio/emulib/runtime/interaction/GuiUtils.java b/src/main/java/net/emustudio/emulib/runtime/interaction/GuiUtils.java index 5595386..8d47c7a 100644 --- a/src/main/java/net/emustudio/emulib/runtime/interaction/GuiUtils.java +++ b/src/main/java/net/emustudio/emulib/runtime/interaction/GuiUtils.java @@ -28,6 +28,8 @@ import java.util.Map; import java.util.Objects; +import static java.lang.StackWalker.Option.RETAIN_CLASS_REFERENCE; + @SuppressWarnings("unused") public class GuiUtils { @@ -96,7 +98,9 @@ public static Font loadFontResource(String path, Class resourceClass, int siz * @return loaded icon, or null if the icon could not be loaded */ public static ImageIcon loadIcon(String resource) { - URL url = GuiUtils.class.getResource(resource); + // emuLib is loaded at the system level, so it does not see resources of a plugin + Class klass = StackWalker.getInstance(RETAIN_CLASS_REFERENCE).getCallerClass(); + URL url = (klass == null ? GuiUtils.class : klass).getResource(resource); return url == null ? null : new ImageIcon(url); } } diff --git a/src/main/java/net/emustudio/emulib/runtime/interaction/ToolbarButton.java b/src/main/java/net/emustudio/emulib/runtime/interaction/ToolbarButton.java index 89cc553..aed1f88 100644 --- a/src/main/java/net/emustudio/emulib/runtime/interaction/ToolbarButton.java +++ b/src/main/java/net/emustudio/emulib/runtime/interaction/ToolbarButton.java @@ -23,6 +23,8 @@ import java.util.function.Consumer; import static javax.swing.Action.SHORT_DESCRIPTION; +import static javax.swing.Action.SMALL_ICON; +import static net.emustudio.emulib.runtime.interaction.GuiUtils.loadIcon; /** * Toolbar button - a button ready to add to a toolbar. @@ -50,6 +52,25 @@ public ToolbarButton(Action action) { setFocusable(false); } + /** + * Creates a new toolbar button. + *

+ * Tooltip text is set to Action.SHORT_DESCRIPTION. + * Icon is set to Action.SMALL_ICON. + * + * @param action action to be performed when the button is pressed + * @param iconResource icon resource path + * @param tooltipText tooltip text + */ + public ToolbarButton(Action action, String iconResource, String tooltipText) { + super(action); + action.putValue(SHORT_DESCRIPTION, tooltipText); + action.putValue(SMALL_ICON, loadIcon(iconResource)); + setHideActionText(true); + setToolTipText(tooltipText); + setFocusable(false); + } + /** * Creates a new toolbar button. * diff --git a/src/main/java/net/emustudio/emulib/runtime/interaction/ToolbarToggleButton.java b/src/main/java/net/emustudio/emulib/runtime/interaction/ToolbarToggleButton.java index 5cd3b7d..7b9214f 100644 --- a/src/main/java/net/emustudio/emulib/runtime/interaction/ToolbarToggleButton.java +++ b/src/main/java/net/emustudio/emulib/runtime/interaction/ToolbarToggleButton.java @@ -23,6 +23,8 @@ import java.util.function.Consumer; import static javax.swing.Action.SHORT_DESCRIPTION; +import static javax.swing.Action.SMALL_ICON; +import static net.emustudio.emulib.runtime.interaction.GuiUtils.loadIcon; /** * Toolbar toggle button - a JToggleButton ready to add to a toolbar. @@ -50,6 +52,26 @@ public ToolbarToggleButton(Action action) { setFocusable(false); } + + /** + * Creates a new toolbar toggle button. + *

+ * Tooltip text is set to Action.SHORT_DESCRIPTION. + * Icon is set to Action.SMALL_ICON. + * + * @param action action to be performed when the button is pressed + * @param iconResource icon resource path + * @param tooltipText tooltip text + */ + public ToolbarToggleButton(Action action, String iconResource, String tooltipText) { + super(action); + action.putValue(SHORT_DESCRIPTION, tooltipText); + action.putValue(SMALL_ICON, loadIcon(iconResource)); + setHideActionText(true); + setToolTipText(tooltipText); + setFocusable(false); + } + /** * Creates a new toolbar toggle button. *