From d75dc9e70c359e4f99b0fca13dc31479af3aff5a Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 18 Apr 2021 16:37:24 +0200 Subject: [PATCH] FlatSVGIcon: support light and dark mappings in single color filter --- .../formdev/flatlaf/extras/FlatSVGIcon.java | 103 +++++++++++++++--- 1 file changed, 86 insertions(+), 17 deletions(-) diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatSVGIcon.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatSVGIcon.java index e6d1559c..5899ea9e 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatSVGIcon.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatSVGIcon.java @@ -29,6 +29,7 @@ import java.awt.image.BufferedImage; import java.awt.image.RGBImageFilter; import java.net.URISyntaxException; import java.net.URL; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.function.Function; @@ -478,7 +479,7 @@ public class FlatSVGIcon private static Boolean darkLaf; - private static boolean isDarkLaf() { + public static boolean isDarkLaf() { if( darkLaf == null ) { lafChanged(); @@ -512,7 +513,8 @@ public class FlatSVGIcon private static ColorFilter instance; private Map rgb2keyMap; - private Map color2colorMap; + private Map colorMap; + private Map darkColorMap; private Function mapper; /** @@ -582,29 +584,85 @@ public class FlatSVGIcon } /** - * Adds color mappings. + * Returns the color mappings used for light themes. + * + * @since 1.2 */ - public void addAll( Map from2toMap ) { - if( color2colorMap == null ) - color2colorMap = new HashMap<>(); - color2colorMap.putAll( from2toMap ); + public Map getLightColorMap() { + return (colorMap != null) + ? Collections.unmodifiableMap( colorMap ) + : Collections.emptyMap(); } /** - * Adds a color mapping. + * Returns the color mappings used for dark themes. + * + * @since 1.2 + */ + public Map getDarkColorMap() { + return (darkColorMap != null) + ? Collections.unmodifiableMap( darkColorMap ) + : getLightColorMap(); + } + + /** + * Adds color mappings. Used for light and dark themes. + */ + public void addAll( Map from2toMap ) { + ensureColorMap(); + + colorMap.putAll( from2toMap ); + if( darkColorMap != null ) + darkColorMap.putAll( from2toMap ); + } + + /** + * Adds a color mappings, which has different colors for light and dark themes. + * + * @since 1.2 + */ + public void addAll( Map from2toLightMap, Map from2toDarkMap ) { + ensureColorMap(); + ensureDarkColorMap(); + + colorMap.putAll( from2toLightMap ); + darkColorMap.putAll( from2toDarkMap ); + } + + /** + * Adds a color mapping. Used for light and dark themes. */ public void add( Color from, Color to ) { - if( color2colorMap == null ) - color2colorMap = new HashMap<>(); - color2colorMap.put( from, to ); + ensureColorMap(); + + colorMap.put( from, to ); + if( darkColorMap != null ) + darkColorMap.put( from, to ); + } + + /** + * Adds a color mapping, which has different colors for light and dark themes. + * + * @since 1.2 + */ + public void add( Color from, Color toLight, Color toDark ) { + ensureColorMap(); + ensureDarkColorMap(); + + if( toLight != null ) + colorMap.put( from, toLight ); + if( toDark != null ) + darkColorMap.put( from, toDark ); } /** * Removes a specific color mapping. */ public void remove( Color from ) { - if( color2colorMap != null ) - color2colorMap.remove( from ); + if( colorMap != null ) + colorMap.remove( from ); + if( darkColorMap != null ) + darkColorMap.remove( from ); } /** @@ -613,8 +671,18 @@ public class FlatSVGIcon * @since 1.2 */ public void removeAll() { - if( color2colorMap != null ) - color2colorMap.clear(); + colorMap = null; + darkColorMap = null; + } + + private void ensureColorMap() { + if( colorMap == null ) + colorMap = new HashMap<>(); + } + + private void ensureDarkColorMap() { + if( darkColorMap == null ) + darkColorMap = new HashMap<>( colorMap ); } public Color filter( Color color ) { @@ -629,8 +697,9 @@ public class FlatSVGIcon }; private Color applyMappings( Color color ) { - if( color2colorMap != null ) { - Color newColor = color2colorMap.get( color ); + if( colorMap != null ) { + Map map = (darkColorMap != null && isDarkLaf()) ? darkColorMap : colorMap; + Color newColor = map.get( color ); if( newColor != null ) return newColor; }