e14d5da997
Additionally cleaned up Javadoc A LOT in IconUtil and banned the word "icon" from appearing in Javadoc there (it returns an Image, not an Icon).
161 lines
5.8 KiB
Java
161 lines
5.8 KiB
Java
package envoy.client.ui;
|
|
|
|
import java.util.EnumMap;
|
|
import java.util.EnumSet;
|
|
import java.util.logging.Level;
|
|
|
|
import javafx.scene.image.Image;
|
|
|
|
import envoy.client.data.Settings;
|
|
import envoy.util.EnvoyLog;
|
|
|
|
/**
|
|
* Provides static utility methods for loading icons from the resource
|
|
* folder.
|
|
* <p>
|
|
* Project: <strong>envoy-client</strong><br>
|
|
* File: <strong>IconUtil.java</strong><br>
|
|
* Created: <strong>16.03.2020</strong><br>
|
|
*
|
|
* @author Kai S. K. Engelbart
|
|
* @since Envoy Client v0.1-beta
|
|
*/
|
|
public class IconUtil {
|
|
|
|
private IconUtil() {}
|
|
|
|
/**
|
|
* Loads an image from the resource folder.
|
|
*
|
|
* @param path the path to the icon inside the resource folder
|
|
* @return the loaded image
|
|
* @since Envoy Client v0.1-beta
|
|
*/
|
|
public static Image load(String path) {
|
|
Image image = null;
|
|
try {
|
|
image = new Image(IconUtil.class.getResource(path).toExternalForm());
|
|
} catch (final NullPointerException e) {
|
|
EnvoyLog.getLogger(IconUtil.class).log(Level.WARNING, String.format("Could not load image at path %s: ", path), e);
|
|
}
|
|
return image;
|
|
}
|
|
|
|
/**
|
|
* Loads an image from the resource folder and scales it to the given size.
|
|
*
|
|
* @param path the path to the icon inside the resource folder
|
|
* @param size the size to scale the icon to
|
|
* @return the scaled image
|
|
* @since Envoy Client v0.1-beta
|
|
*/
|
|
public static Image load(String path, int size) {
|
|
Image image = null;
|
|
try {
|
|
image = new Image(IconUtil.class.getResource(path).toExternalForm(), size, size, true, true);
|
|
} catch (final NullPointerException e) {
|
|
EnvoyLog.getLogger(IconUtil.class).log(Level.WARNING, String.format("Could not load image at path %s: ", path), e);
|
|
}
|
|
return image;
|
|
}
|
|
|
|
/**
|
|
* Loads a {@code .png} image from the sub-folder {@code /icons/} of the
|
|
* resource folder.<br>
|
|
* The suffix {@code .png} is automatically appended.
|
|
*
|
|
* @param name the image name without the .png suffix
|
|
* @return the loaded image
|
|
* @since Envoy Client v0.1-beta
|
|
* @apiNote let's load a sample image {@code /icons/abc.png}.<br>
|
|
* To do that, we only have to call {@code IconUtil.loadIcon("abc")}
|
|
*/
|
|
public static Image loadIcon(String name) { return load("/icons/" + name + ".png"); }
|
|
|
|
/**
|
|
* Loads a {@code .png} image from the sub-folder {@code /icons/} of the
|
|
* resource folder and scales it to the given size.<br>
|
|
* The suffix {@code .png} is automatically appended.
|
|
*
|
|
* @param name the image name without the .png suffix
|
|
* @param size the size of the image to scale to
|
|
* @return the loaded image
|
|
* @since Envoy Client v0.1-beta
|
|
* @apiNote let's load a sample image {@code /icons/abc.png} in size 16.<br>
|
|
* To do that, we only have to call
|
|
* {@code IconUtil.loadIcon("abc", 16)}
|
|
*/
|
|
public static Image loadIcon(String name, int size) { return load("/icons/" + name + ".png", size); }
|
|
|
|
/**
|
|
* Loads a {@code .png} image whose design depends on the currently active theme
|
|
* from the sub-folder {@code /icons/dark/} or {@code /icons/light/} of the
|
|
* resource folder.
|
|
* <p>
|
|
* The suffix {@code .png} is automatically appended.
|
|
*
|
|
* @param name the image name without the "black" or "white" suffix and without
|
|
* the .png suffix
|
|
* @return the loaded image
|
|
* @since Envoy Client v0.1-beta
|
|
* @apiNote let's take two sample images {@code /icons/dark/abc.png} and
|
|
* {@code /icons/light/abc.png}, and load one of them.<br>
|
|
* To do that theme sensitive, we only have to call
|
|
* {@code IconUtil.loadIconThemeSensitive("abc")}
|
|
*/
|
|
public static Image loadIconThemeSensitive(String name) { return loadIcon(themeSpecificSubFolder() + name); }
|
|
|
|
/**
|
|
* Loads a {@code .png} image whose design depends on the currently active theme
|
|
* from the sub-folder {@code /icons/dark/} or {@code /icons/light/} of the
|
|
* resource folder and scales it to the given size.
|
|
* <p>
|
|
* The suffix {@code .png} is automatically appended.
|
|
*
|
|
* @param name the image name without the .png suffix
|
|
* @param size the size of the image to scale to
|
|
* @return the loaded image
|
|
* @since Envoy Client v0.1-beta
|
|
* @apiNote let's take two sample images {@code /icons/dark/abc.png} and
|
|
* {@code /icons/light/abc.png}, and load one of them in size 16.<br>
|
|
* To do that theme sensitive, we only have to call
|
|
* {@code IconUtil.loadIconThemeSensitive("abc", 16)}
|
|
*/
|
|
public static Image loadIconThemeSensitive(String name, int size) { return loadIcon(themeSpecificSubFolder() + name, size); }
|
|
|
|
/**
|
|
*
|
|
* Loads images specified by an enum. The images have to be named like the
|
|
* lowercase enum constants with {@code .png} extension and be located inside a
|
|
* folder with the lowercase name of the enum, which must be contained inside
|
|
* the {@code /icons/} folder.
|
|
*
|
|
* @param <T> the enum that specifies the images to load
|
|
* @param enumClass the class of the enum
|
|
* @param size the size to scale the images to
|
|
* @return a map containing the loaded images with the corresponding enum
|
|
* constants as keys
|
|
* @since Envoy Client v0.1-beta
|
|
*/
|
|
public static <T extends Enum<T>> EnumMap<T, Image> loadByEnum(Class<T> enumClass, int size) {
|
|
final var icons = new EnumMap<T, Image>(enumClass);
|
|
final var path = "/icons/" + enumClass.getSimpleName().toLowerCase() + "/";
|
|
for (final var e : EnumSet.allOf(enumClass))
|
|
icons.put(e, load(path + e.toString().toLowerCase() + ".png", size));
|
|
return icons;
|
|
}
|
|
|
|
/**
|
|
* This method should be called if the display of an image depends upon the
|
|
* currently active theme.<br>
|
|
* In case of a default theme, the string returned will be
|
|
* ({@code dark/} or {@code light/}), otherwise it will be empty.
|
|
*
|
|
* @return the theme specific folder
|
|
* @since Envoy Client v0.1-beta
|
|
*/
|
|
public static String themeSpecificSubFolder() {
|
|
return Settings.getInstance().isUsingDefaultTheme() ? Settings.getInstance().getCurrentTheme() + "/" : "";
|
|
}
|
|
}
|