Merge pull request #17 from aartzrc/master

Added bindAllWithOrigin
This commit is contained in:
Dima Granetchi
2018-05-12 22:39:52 +03:00
committed by GitHub
5 changed files with 52 additions and 2 deletions
+4
View File
@@ -29,4 +29,8 @@ class Bind {
@:noUsing macro static public function bindAll(object:ExprOf<IBindable>, listener:Expr, force:Bool = true):Expr { @:noUsing macro static public function bindAll(object:ExprOf<IBindable>, listener:Expr, force:Bool = true):Expr {
return BindMacros.bindAll(object, listener, force); return BindMacros.bindAll(object, listener, force);
} }
@:noUsing macro static public function bindAllWithOrigin(object:ExprOf<IBindable>, listener:Expr, force:Bool = true):Expr {
return BindMacros.bindAllWithOrigin(object, listener, force);
}
} }
+35 -2
View File
@@ -38,7 +38,7 @@ class SignalTools {
* @param force = true - force instantiate all lazy signals * @param force = true - force instantiate all lazy signals
* @return Void -> Void * @return Void -> Void
*/ */
static public function bindAll(bindable:bindx.IBindable, callback:String -> Dynamic -> Dynamic -> Void, force = true):Void -> Void { static public function bindAll(bindable:bindx.IBindable, callback: String -> Dynamic -> Dynamic -> Void, force = true):Void -> Void {
var listeners = new Map<bindx.BindSignal.Signal<Function>, Function>(); var listeners = new Map<bindx.BindSignal.Signal<Function>, Function>();
var signals = getSignals(bindable, force); var signals = getSignals(bindable, force);
@@ -64,6 +64,39 @@ class SignalTools {
} }
} }
/**
* Bind all bindable fields/methods (use reflection api), include IBindable source object in callback
* @param bindable - target object
* @param callback -
* @param force = true - force instantiate all lazy signals
* @return Void -> Void
*/
static public function bindAllWithOrigin (bindable:bindx.IBindable, callback: bindx.IBindable -> String -> Dynamic -> Dynamic -> Void, force = true):Void -> Void {
var listeners = new Map<bindx.BindSignal.Signal<Function>, Function>();
var signals = getSignals(bindable, force);
for (name in signals.keys()) {
var signal = signals.get(name);
if (signal == null) continue;
if (std.Std.is(signal, bindx.BindSignal.FieldSignal)) {
var listener = function (from:Dynamic, to:Dynamic) callback(bindable, name, from, to);
listeners.set(signal, listener);
signal.add(listener);
} else {
var listener = function () callback(bindable, name, null, null);
listeners.set(signal, listener);
signal.add(listener);
}
}
return function () {
for (signal in listeners.keys()) {
var listener = listeners.get(signal);
signal.remove(listener);
}
}
}
/** /**
* Get all binding signals (use reflection api) * Get all binding signals (use reflection api)
* @param bindable - target object * @param bindable - target object
@@ -92,4 +125,4 @@ class SignalTools {
} }
return signals; return signals;
} }
} }
+8
View File
@@ -46,6 +46,14 @@ class BindMacros {
return BindableMacros.bindingSignalProvider.getBindAllExpr(object, type, listener, force); return BindableMacros.bindingSignalProvider.getBindAllExpr(object, type, listener, force);
} }
static inline function bindAllWithOrigin(object:ExprOf<IBindable>, listener:Expr, force:Bool = true):Expr {
var type = object.deepTypeof();
if (!isBindable(type.getClass())) {
Context.error('\'${object.toString()}\' must be bindx.IBindable', object.pos);
}
return BindableMacros.bindingSignalProvider.getBindAllWithOriginExpr(object, type, listener, force);
}
static inline function warnCheckField(field:Expr):{e:Expr, field:ClassField} { static inline function warnCheckField(field:Expr):{e:Expr, field:ClassField} {
var res = null; var res = null;
try { try {
+4
View File
@@ -99,6 +99,10 @@ class BindSignalProvider implements IBindingSignalProvider {
return macro bindx.SignalTools.bindAll($expr, $listener, $v{force}); return macro bindx.SignalTools.bindAll($expr, $listener, $v{force});
} }
public function getBindAllWithOriginExpr(expr:ExprOf<IBindable>, type:Type, listener:Expr, force:Bool = true):Expr {
return macro bindx.SignalTools.bindAllWithOrigin($expr, $listener, $v{force});
}
function generateSignal(field:Field, type:ComplexType, builder:Expr, res:Array<Field>):Void { function generateSignal(field:Field, type:ComplexType, builder:Expr, res:Array<Field>):Void {
var fieldName = field.name; var fieldName = field.name;
var signalName = signalName(fieldName); var signalName = signalName(fieldName);
@@ -14,4 +14,5 @@ interface IBindingSignalProvider {
function getClassFieldChangedExpr(expr:Expr, field:ClassField, oldValue:Expr, newValue:Expr):Expr; function getClassFieldChangedExpr(expr:Expr, field:ClassField, oldValue:Expr, newValue:Expr):Expr;
function getUnbindAllExpr(expr:ExprOf<IBindable>, type:Type):Expr; function getUnbindAllExpr(expr:ExprOf<IBindable>, type:Type):Expr;
function getBindAllExpr(expr:ExprOf<IBindable>, type:Type, listener:Expr, force:Bool = true):Expr; function getBindAllExpr(expr:ExprOf<IBindable>, type:Type, listener:Expr, force:Bool = true):Expr;
function getBindAllWithOriginExpr(expr:ExprOf<IBindable>, type:Type, listener:Expr, force:Bool = true):Expr;
} }