UIDefaultsLoader: added changeHue(), changeSaturation(), changeLightness() and changeAlpha() color functions (inspired by Sass CSS color.change() function)

This commit is contained in:
Karl Tauber
2021-08-05 11:40:28 +02:00
parent 6fcee03752
commit 7f7f9e3c7c
5 changed files with 101 additions and 2 deletions

View File

@@ -604,6 +604,10 @@ class UIDefaultsLoader
case "fadeout": return parseColorHSLIncreaseDecrease( 3, false, params, resolver, reportError ); case "fadeout": return parseColorHSLIncreaseDecrease( 3, false, params, resolver, reportError );
case "fade": return parseColorFade( params, resolver, reportError ); case "fade": return parseColorFade( params, resolver, reportError );
case "spin": return parseColorSpin( params, resolver, reportError ); case "spin": return parseColorSpin( params, resolver, reportError );
case "changeHue": return parseColorChange( 0, params, resolver, reportError );
case "changeSaturation":return parseColorChange( 1, params, resolver, reportError );
case "changeLightness": return parseColorChange( 2, params, resolver, reportError );
case "changeAlpha": return parseColorChange( 3, params, resolver, reportError );
} }
} finally { } finally {
parseColorDepth--; parseColorDepth--;
@@ -753,6 +757,36 @@ class UIDefaultsLoader
return parseFunctionBaseColor( colorStr, function, derived, resolver, reportError ); return parseFunctionBaseColor( colorStr, function, derived, resolver, reportError );
} }
/**
* Syntax: changeHue(color,value[,options]) or
* changeSaturation(color,value[,options]) or
* changeLightness(color,value[,options]) or
* changeAlpha(color,value[,options])
* - color: a color (e.g. #f00) or a color function
* - value: for hue: number of degrees; otherwise: percentage 0-100%
* - options: [derived]
*/
private static Object parseColorChange( int hslIndex,
List<String> params, Function<String, String> resolver, boolean reportError )
{
String colorStr = params.get( 0 );
int value = (hslIndex == 0)
? parseInteger( params.get( 1 ), true )
: parsePercentage( params.get( 1 ) );
boolean derived = false;
if( params.size() > 2 ) {
String options = params.get( 2 );
derived = options.contains( "derived" );
}
// create function
ColorFunction function = new ColorFunctions.HSLChange( hslIndex, value );
// parse base color, apply function and create derived color
return parseFunctionBaseColor( colorStr, function, derived, resolver, reportError );
}
private static Object parseFunctionBaseColor( String colorStr, ColorFunction function, private static Object parseFunctionBaseColor( String colorStr, ColorFunction function,
boolean derived, Function<String, String> resolver, boolean reportError ) boolean derived, Function<String, String> resolver, boolean reportError )
{ {

View File

@@ -145,7 +145,46 @@ public class ColorFunctions
} }
} }
//---- class HSLIncreaseDecrease ------------------------------------------ //---- class HSLChange ----------------------------------------------------
/**
* Set the hue, saturation, luminance or alpha of a color.
*
* @since 1.6
*/
public static class HSLChange
implements ColorFunction
{
public final int hslIndex;
public final float value;
public HSLChange( int hslIndex, float value ) {
this.hslIndex = hslIndex;
this.value = value;
}
@Override
public void apply( float[] hsla ) {
hsla[hslIndex] = (hslIndex == 0)
? value % 360
: clamp( value );
}
@Override
public String toString() {
String name;
switch( hslIndex ) {
case 0: name = "changeHue"; break;
case 1: name = "changeSaturation"; break;
case 2: name = "changeLightness"; break;
case 3: name = "changeAlpha"; break;
default: throw new IllegalArgumentException();
}
return String.format( "%s(%.0f%s)", name, value, (hslIndex == 0 ? "" : "%") );
}
}
//---- class Fade ---------------------------------------------------------
/** /**
* Set the alpha of a color. * Set the alpha of a color.

View File

@@ -355,8 +355,21 @@ class FlatCompletionProvider
"options", "(optional) [derived]" ); "options", "(optional) [derived]" );
addFunction( "spin", addFunction( "spin",
"color", colorParamDesc, "color", colorParamDesc,
"angle", "number of degrees to rotate", "angle", "number of degrees to rotate (0-360)",
"options", "(optional) [derived]" ); "options", "(optional) [derived]" );
addFunction( "changeHue",
"color", colorParamDesc,
"angle", "number of degrees (0-360)",
"options", "(optional) [derived]" );
String[] hslChangeParams = {
"color", colorParamDesc,
"value", "0-100%",
"options", "(optional) [derived]"
};
addFunction( "changeSaturation", hslChangeParams );
addFunction( "changeLightness", hslChangeParams );
addFunction( "changeAlpha", hslChangeParams );
} }
private void addFunction( String name, String... paramNamesAndDescs ) { private void addFunction( String name, String... paramNamesAndDescs ) {

View File

@@ -60,6 +60,14 @@ public class FlatThemeTokenMaker
tokenMap.put( "darken", TOKEN_FUNCTION ); tokenMap.put( "darken", TOKEN_FUNCTION );
tokenMap.put( "saturate", TOKEN_FUNCTION ); tokenMap.put( "saturate", TOKEN_FUNCTION );
tokenMap.put( "desaturate", TOKEN_FUNCTION ); tokenMap.put( "desaturate", TOKEN_FUNCTION );
tokenMap.put( "fadein", TOKEN_FUNCTION );
tokenMap.put( "fadeout", TOKEN_FUNCTION );
tokenMap.put( "fade", TOKEN_FUNCTION );
tokenMap.put( "spin", TOKEN_FUNCTION );
tokenMap.put( "changeHue", TOKEN_FUNCTION );
tokenMap.put( "changeSaturation", TOKEN_FUNCTION );
tokenMap.put( "changeLightness", TOKEN_FUNCTION );
tokenMap.put( "changeAlpha", TOKEN_FUNCTION );
tokenMap.put( "lazy", TOKEN_FUNCTION ); tokenMap.put( "lazy", TOKEN_FUNCTION );
// function options // function options

View File

@@ -49,3 +49,8 @@ Prop.colorFunc13 = spin($Prop.colorFunc12,40)
Prop.colorFunc14 = spin($Prop.colorFunc12,-40) Prop.colorFunc14 = spin($Prop.colorFunc12,-40)
Prop.colorFunc15 = spin($Prop.colorFunc12,400) Prop.colorFunc15 = spin($Prop.colorFunc12,400)
Prop.colorFunc16 = spin($Prop.colorFunc12,-400) Prop.colorFunc16 = spin($Prop.colorFunc12,-400)
Prop.colorFunc20 = changeHue(#f00,180)
Prop.colorFunc21 = changeSaturation(#f00,50%)
Prop.colorFunc22 = changeLightness(#f00,80%)
Prop.colorFunc23 = changeAlpha(#f00,50%)