added batchloader

This commit is contained in:
2013-11-29 17:03:17 +04:00
parent 52f7a41d26
commit 3fdc29962f
9 changed files with 161 additions and 5 deletions

View File

@@ -12,9 +12,11 @@ import haxework.gui.TextView;
import haxework.gui.LabelView; import haxework.gui.LabelView;
import haxework.gui.ButtonView; import haxework.gui.ButtonView;
import haxework.gui.ToggleButtonView; import haxework.gui.ToggleButtonView;
import haxework.gui.ProgressView;
import haxework.gui.skin.ColorSkin; import haxework.gui.skin.ColorSkin;
import haxework.gui.skin.ButtonColorSkin; import haxework.gui.skin.ButtonColorSkin;
import haxework.gui.skin.ButtonBitmapSkin; import haxework.gui.skin.ButtonBitmapSkin;
import haxework.gui.skin.ProgressSkin;
import haxework.frame.FrameSwitcher; import haxework.frame.FrameSwitcher;
@@ -49,7 +51,9 @@ class GuiBuilder {
value = Type.createEnum(e, a[1]); value = Type.createEnum(e, a[1]);
} else if (c == "@") { } else if (c == "@") {
var a:Array<String> = s.substr(1).split(":"); var a:Array<String> = s.substr(1).split(":");
value = Reflect.field(Provider.get(IResources), a[0]).get(a[1]); //value = Reflect.field(Provider.get(IResources), a[0]).get(a[1]);
Reflect.field(Provider.get(IResources), a[0]).bind(a[1], object, field);
continue;
} else if (~/0x[A-Fa-f\d]{6}/.match(value)) { } else if (~/0x[A-Fa-f\d]{6}/.match(value)) {
value = Std.parseInt(value); value = Std.parseInt(value);
} }

29
haxework/gui/ProgressView.hx Executable file
View File

@@ -0,0 +1,29 @@
package haxework.gui;
class ProgressView extends View {
public var value(default, set):Int;
public var max(default, set):Int;
public function new() {
super();
value = 0;
max = 1;
}
private function set_value(value:Int):Int {
if (this.value != value) {
this.value = value;
invalidate();
}
return this.value;
}
private function set_max(value:Int):Int {
if (max != value) {
max = value;
invalidate();
}
return max;
}
}

View File

@@ -261,9 +261,13 @@ class Updater {
} }
public function update(?_):Void { public function update(?_):Void {
try {
while (invalidated.length > 0) { while (invalidated.length > 0) {
invalidated.shift().update(); invalidated.shift().update();
} }
} catch (error:Dynamic) {
L.e("UPDATE", "", error);
}
} }
} }

View File

@@ -0,0 +1,21 @@
package haxework.gui.skin;
import flash.display.Graphics;
import flash.display.Sprite;
import haxework.gui.skin.ISkin;
class ProgressSkin implements ISkin<Sprite, ProgressView> {
public var foreColor:Int;
public var backColor:Int;
public function draw(view:ProgressView):Void {
var graphics:Graphics = view.content.graphics;
graphics.clear();
graphics.beginFill(backColor);
graphics.drawRect(0, 0, view.width, view.height);
graphics.beginFill(foreColor);
graphics.drawRect(0, 0, view.width * (view.value / view.max), view.height);
graphics.endFill();
}
}

View File

@@ -28,7 +28,7 @@ class BaseLoader<T> implements ILoader<T> {
this.data = data; this.data = data;
callback = new Callback<T>(); callback = new Callback<T>();
var url:String = this.url; var url:String = this.url;
trace(prepareUrl(url)); //trace(prepareUrl(url));
internalRequest(prepareUrl(url)); internalRequest(prepareUrl(url));
return callback; return callback;
} }

52
haxework/net/BatchLoader.hx Executable file
View File

@@ -0,0 +1,52 @@
package haxework.net;
import haxework.net.callback.Callback;
import haxework.net.callback.ICallback;
import haxework.net.ILoader.Method;
import flash.events.Event;
import flash.net.URLLoader;
class BatchLoader<T> {
public var factory:Class<ILoader<T>>;
public function new(factory:Class<ILoader<T>>) {
this.factory = factory;
}
public function GET(urls:Array<String>):ICallback<Array<T>> {
var callbacks:Array<ICallback<T>> = urls.map(function(url:String):ICallback<T> {
var loader:ILoader<T> = Type.createInstance(factory, []);
return loader.GET(url);
});
return new BatchCallback(callbacks);
}
}
class BatchCallback<T> extends Callback<Array<T>> {
private var data:Array<T>;
private var counter:Int;
public function new(callbacks:Array<ICallback<T>>) {
super();
data = new Array<T>();
counter = callbacks.length;
for (i in 0...callbacks.length) {
register(callbacks[i], i);
}
}
private function register(callback:ICallback<T>, index:Int):Void {
callback
.success(function(d:T):Void {
data[index] = d;
if (--counter == 0) callSuccess(data);
})
.fail(function(error:Dynamic):Void {
L.e("BatchLoader", "", error);
if (--counter == 0) callSuccess(data);
});
}
}

11
haxework/net/XmlLoader.hx Executable file
View File

@@ -0,0 +1,11 @@
package haxework.net;
import flash.events.Event;
import flash.net.URLLoader;
class XmlLoader extends BaseURLLoader<Xml> {
override private function extrudeResult(e:Event):Xml {
return Xml.parse(Std.string(cast(e.currentTarget, URLLoader).data));
}
}

View File

@@ -37,7 +37,7 @@ class Callback<T> implements ICallback<T> {
try { try {
if (_fail != null) _fail(error); if (_fail != null) _fail(error);
} catch (error:Dynamic) { } catch (error:Dynamic) {
trace(error); L.d("Callback", "", error);
} }
} }

View File

@@ -1,14 +1,49 @@
package haxework.resources; package haxework.resources;
import haxework.core.Tuple;
import haxe.ds.StringMap;
import flash.display.BitmapData; import flash.display.BitmapData;
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>>();
}
override public function set(key:String, value:T):Void {
super.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);
}
}
class Resources implements IResources { class Resources implements IResources {
public var image(default, null):Map<String, BitmapData>; public var image(default, null):Map<String, BitmapData>;
public var color(default, null):Map<String, Int>; public var color(default, null):Map<String, Int>;
public function new() { public function new() {
image = new Map<String, BitmapData>(); image = new ResMap<BitmapData>();
color = new Map<String, Int>(); color = new ResMap<Int>();
} }
} }