haxe/ui/styles/StyleSheet.hx
package haxe.ui.styles;
import haxe.ui.core.Component;
import haxe.ui.styles.elements.AnimationKeyFrames;
import haxe.ui.styles.elements.ImportElement;
import haxe.ui.styles.elements.MediaQuery;
import haxe.ui.styles.elements.RuleElement;
class StyleSheet {
public var name:String;
private var _imports:Array<ImportElement> = [];
private var _rules:Array<RuleElement> = [];
private var _mediaQueries:Array<MediaQuery> = [];
private var _animations:Map<String, AnimationKeyFrames> = new Map<String, AnimationKeyFrames>();
public var animations(get, never):Map<String, AnimationKeyFrames>;
private function get_animations():Map<String, AnimationKeyFrames> {
return _animations;
}
public function new() {
}
public function addImport(el:ImportElement) {
_imports.push(el);
}
public var imports(get, null):Array<ImportElement>;
private function get_imports():Array<ImportElement> {
return _imports;
}
public var rules(get, null):Array<RuleElement>;
private function get_rules():Array<RuleElement> {
var r = _rules.copy();
for (mq in _mediaQueries) {
if (mq.relevant) {
r = r.concat(mq.styleSheet.rules);
}
}
return r;
}
public var hasMediaQueries(get, null):Bool;
private function get_hasMediaQueries():Bool {
return _mediaQueries.length > 0;
}
public function findRule(selector:String, useCache = false):RuleElement {
for (r in rules) {
if (r.selector.toString() == selector) {
return r;
}
}
return null;
}
public function findMatchingRules(selector:String, useCache = false):Array<RuleElement> {
var m = [];
for (r in rules) {
if (r.selector.toString() == selector) {
m.push(r);
}
}
return m;
}
public function removeRule(selector:String) {
var r = findRule(selector);
if (r != null) {
_rules.remove(r);
}
}
public function removeAllRules() {
_rules = [];
}
public function clear() {
removeAllRules();
_imports = [];
_mediaQueries = [];
_animations = new Map<String, AnimationKeyFrames>();
}
public function addRule(el:RuleElement) {
if (el.directiveCount == 0) {
return;
}
_rules.push(el);
}
public function addMediaQuery(el:MediaQuery) {
_mediaQueries.push(el);
}
public function addAnimation(el:AnimationKeyFrames) {
_animations.set(el.id, el);
}
public function parse(css:String) {
var parser = new Parser();
var ss = parser.parse(css);
var f = new StyleSheet();
for (i in ss.imports) {
var importCss = ToolkitAssets.instance.getText(i.url);
var importStyleSheet = new Parser().parse(importCss);
f.merge(importStyleSheet);
}
f.merge(ss);
merge(f);
}
public function merge(styleSheet:StyleSheet) {
_imports = _imports.concat(styleSheet._imports);
_rules = _rules.concat(styleSheet._rules);
_mediaQueries = _mediaQueries.concat(styleSheet._mediaQueries);
for (k in styleSheet._animations.keys()) {
_animations.set(k, styleSheet._animations.get(k));
}
}
public function buildStyleFor(c:Component, style:Style = null):Style {
if (style == null) {
style = {};
}
for (r in rules) {
if (!r.match(c)) {
continue;
}
style.mergeDirectives(r.directives);
}
return style;
}
}