Files
haxework/haxework/resources/Resources.hx
2015-06-04 16:57:55 +03:00

75 lines
2.0 KiB
Haxe
Executable File

package haxework.resources;
import openfl.Assets;
import haxe.Json;
import flash.display.MovieClip;
import haxework.core.Tuple;
import haxe.ds.StringMap;
import flash.display.BitmapData;
private typedef F = Tuple2<Dynamic, String>
class ResMap<T> extends StringMap<T> {
private var listeners:Map<String, Array<F>>;
public function new() {
super();
listeners = new Map<String, Array<F>>();
}
public function put(key:String, value:T):Void {
set(key, value);
if (listeners.exists(key)) {
for (f in listeners.get(key)) call(f, value);
}
}
public function bind(key:String, object:Dynamic, field:String):Void {
var f:F = Tuple.two(object, field);
if (listeners.exists(key)) {
listeners.get(key).push(f);
} else {
listeners.set(key, [f]);
}
if (exists(key)) call(f, get(key));
}
private function call(field:F, value:T):Void {
Reflect.setProperty(field.first, field.second, value);
}
public function merge(value:Dynamic<T>):Void {
for (field in Reflect.fields(value)) {
put(field, Reflect.field(value, field));
}
}
}
class Resources implements IResources {
public var image(default, null):ResMap<BitmapData>;
public var color(default, null):ResMap<Int>;
public var movie(default, null):ResMap<MovieClip>;
public var text(default, null):ResMap<String>;
public var float(default, null):ResMap<Float>;
public var styles(default, null):ResMap<Dynamic>;
public var any(default, null):ResMap<Dynamic>;
public function new() {
image = new ResMap<BitmapData>();
color = new ResMap<Int>();
movie = new ResMap<MovieClip>();
text = new ResMap<String>();
float = new ResMap<Float>();
styles = new ResMap<Dynamic>();
any = new ResMap<Dynamic>();
}
public function loadStyles(asset:String):Void {
var stylesData = Json.parse(Assets.getText(asset));
for (key in Reflect.fields(stylesData)) {
styles.put(key, Reflect.field(stylesData, key));
}
}
}