Skip to content

Commit

Permalink
allow modules to define filters
Browse files Browse the repository at this point in the history
  • Loading branch information
ianharrigan committed Jun 26, 2023
1 parent 25443c5 commit 9fa97de
Show file tree
Hide file tree
Showing 13 changed files with 144 additions and 162 deletions.
7 changes: 7 additions & 0 deletions haxe/ui/filters/Blur.hx
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
package haxe.ui.filters;

class Blur extends Filter {
public static var DEFAULTS:Array<Any> = [1];

public var amount:Float;

public override function parse(filterDetails:Array<Any>) {
var copy = Filter.applyDefaults(filterDetails, DEFAULTS);
this.amount = copy[0];
}
}
13 changes: 13 additions & 0 deletions haxe/ui/filters/BoxShadow.hx
Original file line number Diff line number Diff line change
@@ -1,11 +1,24 @@
package haxe.ui.filters;

class BoxShadow extends Filter {
private static var DEFAULTS:Array<Any> = [2, 2, 0, .1, 1, 0, false];

public var offsetX:Float;
public var offsetY:Float;
public var color:Int;
public var alpha:Float;
public var blurRadius:Float;
public var spreadRadius:Float;
public var inset:Bool;

public override function parse(filterDetails:Array<Any>) {
var copy = Filter.applyDefaults(filterDetails, DEFAULTS);
this.offsetX = copy[0];
this.offsetY = copy[1];
this.color = copy[2];
this.alpha = copy[3];
this.blurRadius = copy[4];
this.spreadRadius = copy[5];
this.inset = copy[6];
}
}
15 changes: 15 additions & 0 deletions haxe/ui/filters/DropShadow.hx
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package haxe.ui.filters;

class DropShadow extends Filter {
private static var DEFAULTS:Array<Any> = [4, 45, 0, 1, 4, 4, 1, 1, false, false, false];

public var distance:Float;
public var angle:Float;
public var color:Int;
Expand All @@ -10,4 +12,17 @@ class DropShadow extends Filter {
public var strength:Float;
public var quality:Int;
public var inner:Bool;

public override function parse(filterDetails:Array<Any>) {
var copy = Filter.applyDefaults(filterDetails, DEFAULTS);
this.distance = copy[0];
this.angle = copy[1];
this.color = copy[2];
this.alpha = copy[3];
this.blurX = copy[4];
this.blurY = copy[5];
this.strength = copy[6];
this.quality = copy[7];
this.inner = copy[8];
}
}
23 changes: 23 additions & 0 deletions haxe/ui/filters/Filter.hx
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,27 @@ package haxe.ui.filters;
class Filter {
public function new() {
}

public function parse(filterDetails:Array<Any>) {
trace("WARNING: css filter '" + Type.getClassName(Type.getClass(this)) + "' has not implemented parse function");
}

private static function applyDefaults(params:Array<Any>, defaults:Array<Any>):Array<Any> {
var copy:Array<Dynamic> = [];

if (defaults != null) {
for (p in defaults) {
copy.push(p);
}
}
if (params != null) {
var n:Int = 0;
for (p in params) {
copy[n] = p;
n++;
}
}

return copy;
}
}
168 changes: 9 additions & 159 deletions haxe/ui/filters/FilterParser.hx
Original file line number Diff line number Diff line change
@@ -1,169 +1,19 @@
package haxe.ui.filters;

import haxe.ui.styles.CssFilters;

class FilterParser {
private static var filterParamDefaults:Map<String, Array<Dynamic>>;

public static function parseFilter(filterDetails:Array<Dynamic>):Filter {
var filter:Filter = null;
if (filterDetails[0] == "drop-shadow") {
filter = parseDropShadow(filterDetails);
} else if (filterDetails[0] == "box-shadow") {
filter = parseBoxShadow(filterDetails);
} else if (filterDetails[0] == "blur") {
filter = parseBlur(filterDetails);
} else if (filterDetails[0] == "outline") {
filter = parseOutline(filterDetails);
} else if (filterDetails[0] == "grayscale") {
filter = parseGrayscale(filterDetails);
}
return filter;
}

public static function parseDropShadow(filterDetails:Array<Dynamic>):DropShadow {
if (filterDetails == null || filterDetails.length == 0) {
return null;
}

var copy:Array<Dynamic> = filterDetails.copy();
buildDefaults();

var filterName = copy[0];
copy.remove(filterName);

copy = copyFilterDefaults(filterName, copy);

var dropShadow:DropShadow = new DropShadow();
dropShadow.distance = copy[0];
dropShadow.angle = copy[1];
dropShadow.color = copy[2];
dropShadow.alpha = copy[3];
dropShadow.blurX = copy[4];
dropShadow.blurY = copy[5];
dropShadow.strength = copy[6];
dropShadow.quality = copy[7];
dropShadow.inner = copy[8];
return dropShadow;
}

public static function parseBoxShadow(filterDetails:Array<Dynamic>):BoxShadow {
if (filterDetails == null || filterDetails.length == 0) {
return null;
}

var copy:Array<Dynamic> = filterDetails.copy();
buildDefaults();

var filterName = copy[0];
copy.remove(filterName);

copy = copyFilterDefaults(filterName, copy);

var boxShadow:BoxShadow = new BoxShadow();
boxShadow.offsetX = copy[0];
boxShadow.offsetY = copy[1];
boxShadow.color = copy[2];
boxShadow.alpha = copy[3];
boxShadow.blurRadius = copy[4];
boxShadow.spreadRadius = copy[5];
boxShadow.inset = copy[6];
return boxShadow;
}

public static function parseBlur(filterDetails:Array<Dynamic>):Blur {
if (filterDetails == null || filterDetails.length == 0) {
return null;
}

var copy:Array<Dynamic> = filterDetails.copy();
buildDefaults();

var filterName = copy[0];
copy.remove(filterName);

copy = copyFilterDefaults(filterName, copy);

var blur:Blur = new Blur();
blur.amount = copy[0];
return blur;
}

public static function parseOutline(filterDetails:Array<Dynamic>):Outline {
if (filterDetails == null || filterDetails.length == 0) {
public static function parseFilter(filterDetails:Array<Any>):Filter {
var filterName = filterDetails.shift();
if (!CssFilters.hasCssFilter(filterName)) {
return null;
}

var copy:Array<Dynamic> = filterDetails.copy();
buildDefaults();

var filterName = copy[0];
copy.remove(filterName);

copy = copyFilterDefaults(filterName, copy);

var outline:Outline = new Outline();
outline.color = copy[0];
outline.size = copy[1];
return outline;
}

private static function copyFilterDefaults(filterName:String, params:Array<Dynamic>):Array<Dynamic> {
var copy:Array<Dynamic> = [];

var defaultParams:Array<Dynamic> = filterParamDefaults[filterName];
if (defaultParams != null) {
for (p in defaultParams) {
copy.push(p);
}
}
if (params != null) {
var n:Int = 0;
for (p in params) {
copy[n] = p;
n++;
}
}

return copy;
}

public static function parseGrayscale(filterDetails:Array<Dynamic>):Grayscale {
if (filterDetails == null || filterDetails.length == 0) {
return null;
}

var copy:Array<Dynamic> = filterDetails.copy();
buildDefaults();

var filterName = copy[0];
copy.remove(filterName);

copy = copyFilterDefaults(filterName, copy);

var grayscale:Grayscale = new Grayscale();
grayscale.amount = copy[0];
return grayscale;
}

private static function buildDefaults() {
if (filterParamDefaults != null) {
return;
}

filterParamDefaults = new Map<String, Array<Dynamic>>();
filterParamDefaults["drop-shadow"] = [];
filterParamDefaults["drop-shadow"] = filterParamDefaults["drop-shadow"].concat([4, 45, 0, 1, 4, 4, 1, 1, false, false, false]);

filterParamDefaults["box-shadow"] = [];
filterParamDefaults["box-shadow"] = filterParamDefaults["box-shadow"].concat([2, 2, 0, .1, 1, 0, false]);

filterParamDefaults["blur"] = [];
filterParamDefaults["blur"] = filterParamDefaults["blur"].concat([1]);

filterParamDefaults["outline"] = [];
filterParamDefaults["outline"] = filterParamDefaults["outline"].concat([0, 1]);

filterParamDefaults["grayscale"] = [];
filterParamDefaults["grayscale"] = filterParamDefaults["grayscale"].concat([100]);

var ctor = CssFilters.getCssFilter(filterName);
var filter:Filter = ctor();
filter.parse(filterDetails);
return filter;
}
}
7 changes: 7 additions & 0 deletions haxe/ui/filters/Grayscale.hx
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
package haxe.ui.filters;

class Grayscale extends Filter {
public static var DEFAULTS:Array<Any> = [100];

public var amount:Float;

public override function parse(filterDetails:Array<Any>) {
var copy = Filter.applyDefaults(filterDetails, DEFAULTS);
this.amount = copy[0];
}
}
8 changes: 8 additions & 0 deletions haxe/ui/filters/Outline.hx
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
package haxe.ui.filters;

class Outline extends Filter {
public static var DEFAULTS:Array<Any> = [0, 1];

public var color:Int;
public var size:Int;

public override function parse(filterDetails:Array<Any>) {
var copy = Filter.applyDefaults(filterDetails, DEFAULTS);
this.color = copy[0];
this.size = copy[1];
}
}
7 changes: 7 additions & 0 deletions haxe/ui/macros/ModuleMacros.hx
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,13 @@ class ModuleMacros {
haxe.ui.styles.CssFunctions.registerCssFunction($v{cssFunction.name}, $p{cssFunction.call.split(".")})
);
}

for (cssFilter in m.cssFilters) {
var ctor = cssFilter.className + ".new";
builder.add(macro
haxe.ui.styles.CssFilters.registerCssFilter($v{cssFilter.name}, $p{ctor.split(".")})
);
}
}

if (preloadAll) {
Expand Down
5 changes: 5 additions & 0 deletions haxe/ui/module.xml
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,11 @@
<cssFunction name="theme-image" call="haxe.ui.styles.CssFunctions.themeIcon" />
<cssFunction name="rgb" call="haxe.ui.styles.CssFunctions.rgb" />
<cssFunction name="lookup" call="haxe.ui.styles.CssFunctions.lookup" />
<cssFilter name="blur" class="haxe.ui.filters.Blur" />
<cssFilter name="box-shadow" class="haxe.ui.filters.BoxShadow" />
<cssFilter name="drop-shadow" class="haxe.ui.filters.DropShadow" />
<cssFilter name="grayscale" class="haxe.ui.filters.Grayscale" />
<cssFilter name="outline" class="haxe.ui.filters.Outline" />
</cssExtensions>

<actions>
Expand Down
10 changes: 10 additions & 0 deletions haxe/ui/parsers/modules/Module.hx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class Module {
public var namespaces(default, default):Map<String, String>;
public var imageLoaders(default, default):Array<ModuleImageLoaderEntry>;
public var cssFunctions(default, default):Array<ModuleCssFunctionEntry>;
public var cssFilters(default, default):Array<ModuleCssFilterEntry>;

public function new() {
resourceEntries = [];
Expand All @@ -36,6 +37,7 @@ class Module {
namespaces = new Map<String, String>();
imageLoaders = [];
cssFunctions = [];
cssFilters = [];
}

public function validate() {
Expand Down Expand Up @@ -175,6 +177,14 @@ class ModuleCssFunctionEntry {
public var name(default, default):String;
public var call(default, default):String;

public function new() {
}
}

class ModuleCssFilterEntry {
public var name(default, default):String;
public var className(default, default):String;

public function new() {
}
}
11 changes: 11 additions & 0 deletions haxe/ui/parsers/modules/XMLParser.hx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package haxe.ui.parsers.modules;

import haxe.ui.parsers.modules.Module.ModuleCssFilterEntry;
import haxe.ui.parsers.modules.Module.ModuleCssFunctionEntry;
import haxe.ui.parsers.modules.Module.ModuleImageLoaderEntry;
import haxe.ui.parsers.modules.Module.ModuleThemeImageEntry;
Expand Down Expand Up @@ -48,6 +49,7 @@ class XMLParser extends ModuleParser {
parseLoaders(el, module, defines, context);
} else if (nodeName == "cssExtensions" && checkCondition(el, defines) == true) {
parseCssFunctions(el, module, defines, context);
parseCssFilters(el, module, defines, context);
}
}

Expand Down Expand Up @@ -353,6 +355,15 @@ class XMLParser extends ModuleParser {
}
}

private function parseCssFilters(el:Xml, module:Module, defines:Map<String, String>, context:String) {
for (el in el.elementsNamed("cssFilter")) {
var cssFilterEntry:ModuleCssFilterEntry = new ModuleCssFilterEntry();
cssFilterEntry.name = el.get("name");
cssFilterEntry.className = el.get("class");
module.cssFilters.push(cssFilterEntry);
}
}

private function parseImageLoaders(el:Xml, module:Module, defines:Map<String, String>, context:String) {
for (imageLoaderNode in el.elementsNamed("image-loader")) {
var imageLoaderEntry:ModuleImageLoaderEntry = new ModuleImageLoaderEntry();
Expand Down
Loading

0 comments on commit 9fa97de

Please sign in to comment.