diff --git a/property-loader/src/main/java/com/github/weisj/darklaf/icons/IconColorMapper.java b/property-loader/src/main/java/com/github/weisj/darklaf/icons/IconColorMapper.java index a7880678..acfa3f69 100644 --- a/property-loader/src/main/java/com/github/weisj/darklaf/icons/IconColorMapper.java +++ b/property-loader/src/main/java/com/github/weisj/darklaf/icons/IconColorMapper.java @@ -87,10 +87,11 @@ public final class IconColorMapper { if (child instanceof LinearGradient) { LinearGradient grad = (LinearGradient) child; String id = grad.getId(); - StyleAttribute fallbacks = getFallbacks(grad); + StyleAttribute colorFallbacks = getAttribute("fallback", grad); + StyleAttribute opacityFallbacks = getAttribute("opacity-fallback", grad); String opacityKey = getOpacityKey(grad); - float opacity = getOpacity(opacityKey, defaults); + float opacity = getOpacity(opacityKey, getFallbacks(opacityFallbacks), defaults); float opacity1 = opacity; float opacity2 = opacity; if (opacity < 0) { @@ -113,8 +114,9 @@ public final class IconColorMapper { if (opacity2 < 0) opacity2 = opacity; } - Color c = resolveColor(id, getFallbacks(fallbacks), FALLBACK_COLOR, defaults); - Pair result = createColor(c, id, opacityKey, fallbacks, opacity1, opacity2); + Color c = resolveColor(id, getFallbacks(colorFallbacks), FALLBACK_COLOR, defaults); + Pair result = createColor(c, id, opacityKey, colorFallbacks, opacity1, + opacity2); LinearGradient gradient = result.getFirst(); Runnable finalizer = result.getSecond(); themedDefs.loaderAddChild(null, gradient); @@ -125,32 +127,30 @@ public final class IconColorMapper { public static float getOpacity(final LinearGradient gradient, final Map propertyMap) { String opacityKey = getOpacityKey(gradient); - return getOpacity(opacityKey, propertyMap); + return getOpacity(opacityKey, null, propertyMap); } public static Color getColor(final LinearGradient gradient, final Map propertyMap) { String id = (gradient).getId(); - StyleAttribute fallbacks = getFallbacks(gradient); + StyleAttribute fallbacks = getAttribute("fallback", gradient); return resolveColor(id, getFallbacks(fallbacks), FALLBACK_COLOR, propertyMap); } private static Color resolveColor(final String key, final String[] fallbacks, final Color fallbackColor, final Map propertyMap) { - Object color = propertyMap.get(key); - for (int i = 0; i < fallbacks.length && !(color instanceof Color); i++) { - color = propertyMap.get(fallbacks[i]); - } - if (!(color instanceof Color)) { + Color color = get(propertyMap, key, fallbacks, Color.class); + + if (color == null) { color = fallbackColor; LOGGER.warning("Could not load color with id '" + key + "' fallbacks" + Arrays.toString(fallbacks) + ". Using color '" + fallbackColor + "' instead."); } - return (Color) color; + return color; } - private static StyleAttribute getFallbacks(final LinearGradient child) { + private static StyleAttribute getAttribute(final String key, final LinearGradient child) { StyleAttribute attribute = new StyleAttribute(); - attribute.setName("fallback"); + attribute.setName(key); try { child.getStyle(attribute); } catch (SVGException e) { @@ -175,17 +175,17 @@ public final class IconColorMapper { return fallbacks.getStringList(); } - private static float getOpacity(final String key, final Map propertyMap) { - // UIManager defaults to 0, if the values isn't an integer (or null). - Object obj = propertyMap.get(key); + private static float getOpacity(final String key, final String[] fallbacks, final Map propertyMap) { + // UIManager defaults to 0, if the value isn't an integer (or null). + Number obj = get(propertyMap, key, fallbacks, Number.class); if (obj instanceof Integer) { - return ((Integer) obj) / 100.0f; + return obj.intValue() / 100.0f; } else if (obj instanceof Long) { - return ((Long) obj) / 100.0f; + return obj.intValue() / 100.0f; } else if (obj instanceof Float) { - return (Float) obj; + return obj.floatValue(); } else if (obj instanceof Double) { - return ((Double) obj).floatValue(); + return obj.floatValue(); } if (key != null && !key.isEmpty()) { LOGGER.warning(obj + " is an invalid opacity value. Key = '" + key + "'"); @@ -242,6 +242,29 @@ public final class IconColorMapper { }); } + private static T get(final Map map, final Object key, final Class type) { + return getFromMap(map, key, null, type); + } + + private static T get(final Map map, final Object key, final Object[] fallbacks, + final Class type) { + T obj = getFromMap(map, key, fallbacks, type); + if (obj == null) return getFromMap(UIManager.getDefaults(), key, fallbacks, type); + return obj; + } + + private static T getFromMap(final Map map, final Object key, final Object[] fallbacks, + final Class type) { + Object obj = map.get(key); + if (fallbacks != null) { + for (int i = 0; i < fallbacks.length && !type.isInstance(obj); i++) { + obj = map.get(fallbacks[i]); + } + } + if (type.isInstance(obj)) return type.cast(obj); + return null; + } + private static String toHexString(final Color color) { return "#" + ColorUtil.toHex(color); }