From f3f87179a61ab7027c537ebbc9914aed489fd1e5 Mon Sep 17 00:00:00 2001 From: aartzrc <36048486+aartzrc@users.noreply.github.com> Date: Fri, 13 Apr 2018 17:38:27 -0700 Subject: [PATCH 1/2] Added origin IBindable object to callback Using bindAll frequently, it became difficult to handle binding many objects to a single callback. Having the origin object pass through makes things easier. --- src/bindx/SignalTools.hx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bindx/SignalTools.hx b/src/bindx/SignalTools.hx index 91447d6..60794b2 100644 --- a/src/bindx/SignalTools.hx +++ b/src/bindx/SignalTools.hx @@ -38,7 +38,7 @@ class SignalTools { * @param force = true - force instantiate all lazy signals * @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: bindx.IBindable -> String -> Dynamic -> Dynamic -> Void, force = true):Void -> Void { var listeners = new Map, Function>(); var signals = getSignals(bindable, force); @@ -46,11 +46,11 @@ class SignalTools { 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(name, from, to); + var listener = function (from:Dynamic, to:Dynamic) callback(bindable, name, from, to); listeners.set(signal, listener); signal.add(listener); } else { - var listener = function () callback(name, null, null); + var listener = function () callback(bindable, name, null, null); listeners.set(signal, listener); signal.add(listener); } @@ -92,4 +92,4 @@ class SignalTools { } return signals; } -} \ No newline at end of file +} From 65124993f7d62ceedb84aab7041d4b34cfaf6452 Mon Sep 17 00:00:00 2001 From: aartzrc Date: Thu, 10 May 2018 08:40:50 -0700 Subject: [PATCH 2/2] revert bindAll and create bindAllWithOrigin --- src/bindx/Bind.hx | 4 +++ src/bindx/SignalTools.hx | 35 ++++++++++++++++++++++- src/bindx/macro/BindMacros.hx | 8 ++++++ src/bindx/macro/BindSignalProvider.hx | 4 +++ src/bindx/macro/IBindingSignalProvider.hx | 1 + 5 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/bindx/Bind.hx b/src/bindx/Bind.hx index 2a6972f..e83085d 100644 --- a/src/bindx/Bind.hx +++ b/src/bindx/Bind.hx @@ -29,4 +29,8 @@ class Bind { @:noUsing macro static public function bindAll(object:ExprOf, listener:Expr, force:Bool = true):Expr { return BindMacros.bindAll(object, listener, force); } + + @:noUsing macro static public function bindAllWithOrigin(object:ExprOf, listener:Expr, force:Bool = true):Expr { + return BindMacros.bindAllWithOrigin(object, listener, force); + } } \ No newline at end of file diff --git a/src/bindx/SignalTools.hx b/src/bindx/SignalTools.hx index 60794b2..4955240 100644 --- a/src/bindx/SignalTools.hx +++ b/src/bindx/SignalTools.hx @@ -38,7 +38,40 @@ class SignalTools { * @param force = true - force instantiate all lazy signals * @return Void -> Void */ - static public function bindAll(bindable:bindx.IBindable, callback: bindx.IBindable -> 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, 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(name, from, to); + listeners.set(signal, listener); + signal.add(listener); + } else { + var listener = function () callback(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); + } + } + } + + /** + * 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, Function>(); var signals = getSignals(bindable, force); diff --git a/src/bindx/macro/BindMacros.hx b/src/bindx/macro/BindMacros.hx index 86309b5..33651ab 100644 --- a/src/bindx/macro/BindMacros.hx +++ b/src/bindx/macro/BindMacros.hx @@ -46,6 +46,14 @@ class BindMacros { return BindableMacros.bindingSignalProvider.getBindAllExpr(object, type, listener, force); } + static inline function bindAllWithOrigin(object:ExprOf, 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} { var res = null; try { diff --git a/src/bindx/macro/BindSignalProvider.hx b/src/bindx/macro/BindSignalProvider.hx index 4fcae7d..1ba9065 100644 --- a/src/bindx/macro/BindSignalProvider.hx +++ b/src/bindx/macro/BindSignalProvider.hx @@ -99,6 +99,10 @@ class BindSignalProvider implements IBindingSignalProvider { return macro bindx.SignalTools.bindAll($expr, $listener, $v{force}); } + public function getBindAllWithOriginExpr(expr:ExprOf, 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):Void { var fieldName = field.name; var signalName = signalName(fieldName); diff --git a/src/bindx/macro/IBindingSignalProvider.hx b/src/bindx/macro/IBindingSignalProvider.hx index 1c4d5d7..f675052 100644 --- a/src/bindx/macro/IBindingSignalProvider.hx +++ b/src/bindx/macro/IBindingSignalProvider.hx @@ -14,4 +14,5 @@ interface IBindingSignalProvider { function getClassFieldChangedExpr(expr:Expr, field:ClassField, oldValue:Expr, newValue:Expr):Expr; function getUnbindAllExpr(expr:ExprOf, type:Type):Expr; function getBindAllExpr(expr:ExprOf, type:Type, listener:Expr, force:Bool = true):Expr; + function getBindAllWithOriginExpr(expr:ExprOf, type:Type, listener:Expr, force:Bool = true):Expr; } \ No newline at end of file