diff --git a/haxework/gui/GuiBuilder.hx b/haxework/gui/GuiBuilder.hx index b841238..0175d99 100755 --- a/haxework/gui/GuiBuilder.hx +++ b/haxework/gui/GuiBuilder.hx @@ -39,7 +39,7 @@ class GuiBuilder { } } - private static function fill(object:Dynamic, data:Dynamic, ?links:Dynamic):Void { + public static function fill(object:Dynamic, data:Dynamic, ?links:Dynamic):Void { var fields:Array = Reflect.fields(data); for (field in fields) { var value:Dynamic = Reflect.field(data, field); diff --git a/haxework/gui/LabelView.hx b/haxework/gui/LabelView.hx index 18fec13..ee5f7ee 100755 --- a/haxework/gui/LabelView.hx +++ b/haxework/gui/LabelView.hx @@ -6,6 +6,7 @@ class LabelView extends TextView { public function new() { super(); + textField.selectable = false; textField.autoSize = TextFieldAutoSize.LEFT; } diff --git a/haxework/gui/TextView.hx b/haxework/gui/TextView.hx index ff38fa2..d784b7e 100755 --- a/haxework/gui/TextView.hx +++ b/haxework/gui/TextView.hx @@ -29,7 +29,7 @@ class TextView extends SpriteView implements ITextView { private function set_text(value:String):String { if (text != value) { text = value; - textField.text = text; + //textField.text = text; invalidate(); } return text; @@ -72,6 +72,7 @@ class TextView extends SpriteView implements ITextView { override public function update():Void { textField.setTextFormat(textFormat); + if (text != null) textField.text = text; if (contentSize && !Std.is(skin, ISize)) { width = textField.width; height = textField.height; diff --git a/haxework/net/BaseLoader.hx b/haxework/net/BaseLoader.hx index a64df6b..9f9804b 100755 --- a/haxework/net/BaseLoader.hx +++ b/haxework/net/BaseLoader.hx @@ -8,6 +8,8 @@ import haxework.net.ILoader.Method; class BaseLoader implements ILoader { + private static inline var TAG:String = "Loader"; + public static var urlProcessors(default, null):ArrayString> = new ArrayString>(); public static function prepareUrl(url:String):String { for (p in urlProcessors) url = p(url); return url; }; @@ -28,7 +30,7 @@ class BaseLoader implements ILoader { this.data = data; callback = new Callback(); var url:String = this.url; - //trace(prepareUrl(url)); + L.d(TAG, "Request: " + prepareUrl(url)); internalRequest(prepareUrl(url)); return callback; } diff --git a/haxework/net/callback/Callback.hx b/haxework/net/callback/Callback.hx index 57cca66..4df2093 100755 --- a/haxework/net/callback/Callback.hx +++ b/haxework/net/callback/Callback.hx @@ -25,6 +25,7 @@ class Callback implements ICallback { } catch (error:Dynamic) { callFail(error); } + dispose(); } public function callSuccessAsync(data:T):Void { @@ -39,6 +40,7 @@ class Callback implements ICallback { } catch (error:Dynamic) { L.d("Callback", "", error); } + dispose(); } public function callFailAsync(error:Dynamic):Void { diff --git a/haxework/net/order/IOrderSupplier.hx b/haxework/net/order/IOrderSupplier.hx new file mode 100755 index 0000000..e56c0ed --- /dev/null +++ b/haxework/net/order/IOrderSupplier.hx @@ -0,0 +1,8 @@ +package haxework.net.order; + +import haxework.net.callback.ICallback; + +interface IOrderSupplier { + public function request(url:String, clazz:Class):ICallback; + public function release(url:String):Void; +} \ No newline at end of file diff --git a/haxework/net/order/OrderSupplier.hx b/haxework/net/order/OrderSupplier.hx new file mode 100755 index 0000000..322b16a --- /dev/null +++ b/haxework/net/order/OrderSupplier.hx @@ -0,0 +1,96 @@ +package haxework.net.order; + +import Lambda; +import haxework.net.callback.Callback; +import Type.ValueType; +import com.abit.umix.prepare.AutoCallback; +import flash.display.BitmapData; +import haxework.net.callback.ICallback; + +typedef Order = { + var id:String; + var data:Null; + var callbacks:Array>; + var clients:Int; +} + +class OrderSupplier implements IOrderSupplier { + + private static inline var TAG:String = "OrderSupplier"; + + private var orders:Map>; + + public function new() { + orders = new Map>(); + } + + public function request(url:String, clazz:Class):ICallback { + if (orders.exists(url)) { + var order:Order = orders.get(url); + order.clients++; + //L.d(TAG, "Request(" + order.clients + "): " + url); + if (order.data == null) { + var callback:ICallback = new Callback(); + order.callbacks.push(callback); + return callback; + } else { + return AutoCallback.success(order.data); + } + } else { + var callback:ICallback = new Callback(); + var order:Order = { + id:url, + data:null, + callbacks:[callback], + clients:1 + } + //L.d(TAG, "Request(" + order.clients + "): " + url); + orders.set(url, order); + var loader:ILoader = buildLoader(clazz); + loader.GET(url) + .success(function(data:T):Void { + if (orders.exists(url)) { + var order:Order = orders.get(url); + order.data = data; + for (callback in order.callbacks) callback.callSuccess(data); + order.callbacks = []; + } + }) + .fail(function(error:Dynamic):Void { + if (orders.exists(url)) for (callback in orders.get(url).callbacks) callback.callFail(error); + orders.remove(url); + }); + return callback; + } + } + + public function release(url:String):Void { + if (orders.exists(url)) { + var order:Order = orders.get(url); + if (--order.clients <= 0) { + var data:Dynamic = order.data; + if (Std.is(data, BitmapData)) { + cast(data, BitmapData).dispose(); + } + orders.remove(url); + } + //L.d(TAG, "Release(" + order.clients + "): " + url); + //log(); + } + } + + private function buildLoader(clazz:Class):ILoader { + var c:Class = clazz; + return if (c == BitmapData) { + untyped new ImageLoader(); + } else { + throw "Unsupported order: " + c; + } + } + + private function log():Void { + L.d(TAG, "\n" + Lambda.map(orders, function(order:Order):String { + return "(" + order.clients + ") " + order.id; + }).join("\n")); + } +} \ No newline at end of file