- haxe 3.4.x changes
- Reflect.compareMethods for all platforms
This commit is contained in:
@@ -110,5 +110,4 @@ Log level | Description
|
|||||||
|
|
||||||
## Additional
|
## Additional
|
||||||
|
|
||||||
- `-D bindx_compareMethods` enables methods comparing with `Reflect.compareMethods` (enabled for Neko by default)
|
|
||||||
- BindExt and `this`. Use `this.bindableA.bindableB` to listen changes of `bindableA`, not only `bindableB`
|
- BindExt and `this`. Use `this.bindableA.bindableB` to listen changes of `bindableA`, not only `bindableB`
|
||||||
|
|||||||
@@ -110,5 +110,4 @@ Log level | Description
|
|||||||
|
|
||||||
## Дополнительно
|
## Дополнительно
|
||||||
|
|
||||||
- `-D bindx_compareMethods` включает сравнение методов с помощью `Reflect.compareMethods` (включено для neko по умолчанию)
|
|
||||||
- BindExt и `this`. Используйте `this.bindableA.bindableB` если необходимо слушать изменения `bindableA`, а не только `bindableB`
|
- BindExt и `this`. Используйте `this.bindableA.bindableB` если необходимо слушать изменения `bindableA`, а не только `bindableB`
|
||||||
|
|||||||
+10
-83
@@ -1,5 +1,7 @@
|
|||||||
package bindx;
|
package bindx;
|
||||||
|
|
||||||
|
import haxe.Constraints.Function;
|
||||||
|
|
||||||
class MethodSignal extends Signal<Void -> Void> {
|
class MethodSignal extends Signal<Void -> Void> {
|
||||||
|
|
||||||
public function dispatch():Void {
|
public function dispatch():Void {
|
||||||
@@ -19,7 +21,7 @@ class FieldSignal<T> extends Signal<T -> T -> Void> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Signal<T> {
|
class Signal<T:Function> {
|
||||||
|
|
||||||
var listeners:Array<T>;
|
var listeners:Array<T>;
|
||||||
|
|
||||||
@@ -35,20 +37,14 @@ class Signal<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline function indexOf(listener:T):Int {
|
inline function indexOf(listener:T):Int {
|
||||||
#if (neko || bindx_compareMethods)
|
var res = -1;
|
||||||
var res = -1;
|
for (i in 0...listeners.length) {
|
||||||
var i = 0;
|
if (Reflect.compareMethods(listeners[i], listener)) {
|
||||||
for (l in listeners) {
|
res = i;
|
||||||
if (Reflect.compareMethods(listener, l)) {
|
break;
|
||||||
res = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
return res;
|
}
|
||||||
#else
|
return res;
|
||||||
return listeners.indexOf(listener);
|
|
||||||
#end
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function add(listener:T):Void {
|
public function add(listener:T):Void {
|
||||||
@@ -73,72 +69,3 @@ class Signal<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class SignalTools {
|
|
||||||
static public inline var BIND_SIGNAL_META = "BindSignal";
|
|
||||||
|
|
||||||
static public inline var SIGNAL_POSTFIX = "Changed";
|
|
||||||
|
|
||||||
static public function unbindAll(bindable:bindx.IBindable):Void {
|
|
||||||
var meta = haxe.rtti.Meta.getFields(std.Type.getClass(bindable));
|
|
||||||
if (meta != null) for (m in std.Reflect.fields(meta)) {
|
|
||||||
var data = std.Reflect.field(meta, m);
|
|
||||||
if (std.Reflect.hasField(data, BIND_SIGNAL_META)) {
|
|
||||||
var signal:bindx.BindSignal.Signal<Dynamic> = cast std.Reflect.field(bindable, m);
|
|
||||||
if (signal != null) {
|
|
||||||
signal.removeAll();
|
|
||||||
var args:Array<Dynamic> = std.Reflect.field(data, BIND_SIGNAL_META);
|
|
||||||
var lazy:Bool = args[1];
|
|
||||||
if (lazy) std.Reflect.setField(bindable, m, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static public function bindAll(bindable:bindx.IBindable, callback:String -> Dynamic -> Dynamic -> Void, force = true):Void -> Void {
|
|
||||||
var listeners = new Map<bindx.BindSignal.Signal<Dynamic>, Dynamic>();
|
|
||||||
|
|
||||||
var signals = getSignals(bindable, force);
|
|
||||||
for (name in signals.keys()) {
|
|
||||||
var signal = signals.get(name);
|
|
||||||
if (std.Std.is(signal, 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);
|
|
||||||
if (Std.is(signal, FieldSignal)) signal.remove(listener);
|
|
||||||
else signal.remove(listener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static function getSignals(bindable:bindx.IBindable, force = true):Map<String, bindx.BindSignal.Signal<Dynamic>> {
|
|
||||||
var signals = new Map<String, bindx.BindSignal.Signal<Dynamic>>();
|
|
||||||
var meta = haxe.rtti.Meta.getFields(std.Type.getClass(bindable));
|
|
||||||
if (meta != null) for (m in std.Reflect.fields(meta)) {
|
|
||||||
var data = std.Reflect.field(meta, m);
|
|
||||||
if (std.Reflect.hasField(data, BIND_SIGNAL_META)) {
|
|
||||||
var args:Array<Dynamic> = std.Reflect.field(data, BIND_SIGNAL_META);
|
|
||||||
var signal:bindx.BindSignal.Signal<Dynamic> = cast std.Reflect.field(bindable, m);
|
|
||||||
if (signal == null && force) {
|
|
||||||
var lazy:Bool = args[1];
|
|
||||||
if (lazy) signal = cast std.Reflect.getProperty(bindable, m.substr(1));
|
|
||||||
}
|
|
||||||
if (signal != null) {
|
|
||||||
var name = args[0];
|
|
||||||
signals.set(name, signal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return signals;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
package bindx;
|
||||||
|
|
||||||
|
class SignalTools {
|
||||||
|
static public inline var BIND_SIGNAL_META = "BindSignal";
|
||||||
|
|
||||||
|
static public inline var SIGNAL_POSTFIX = "Changed";
|
||||||
|
|
||||||
|
static public function unbindAll(bindable:bindx.IBindable):Void {
|
||||||
|
var meta = haxe.rtti.Meta.getFields(std.Type.getClass(bindable));
|
||||||
|
if (meta != null) for (m in std.Reflect.fields(meta)) {
|
||||||
|
var data = std.Reflect.field(meta, m);
|
||||||
|
if (std.Reflect.hasField(data, BIND_SIGNAL_META)) {
|
||||||
|
var signal:bindx.BindSignal.Signal<Dynamic> = cast std.Reflect.field(bindable, m);
|
||||||
|
if (signal != null) {
|
||||||
|
signal.removeAll();
|
||||||
|
var args:Array<Dynamic> = std.Reflect.field(data, BIND_SIGNAL_META);
|
||||||
|
var lazy:Bool = args[1];
|
||||||
|
if (lazy) std.Reflect.setField(bindable, m, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static public function bindAll(bindable:bindx.IBindable, callback:String -> Dynamic -> Dynamic -> Void, force = true):Void -> Void {
|
||||||
|
var listeners = new Map<bindx.BindSignal.Signal<Dynamic>, Dynamic>();
|
||||||
|
|
||||||
|
var signals = getSignals(bindable, force);
|
||||||
|
for (name in signals.keys()) {
|
||||||
|
var signal = signals.get(name);
|
||||||
|
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);
|
||||||
|
if (Std.is(signal, bindx.BindSignal.FieldSignal)) signal.remove(listener);
|
||||||
|
else signal.remove(listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static function getSignals(bindable:bindx.IBindable, force = true):Map<String, bindx.BindSignal.Signal<Dynamic>> {
|
||||||
|
var signals = new Map<String, bindx.BindSignal.Signal<Dynamic>>();
|
||||||
|
var meta = haxe.rtti.Meta.getFields(std.Type.getClass(bindable));
|
||||||
|
if (meta != null) for (m in std.Reflect.fields(meta)) {
|
||||||
|
var data = std.Reflect.field(meta, m);
|
||||||
|
if (std.Reflect.hasField(data, BIND_SIGNAL_META)) {
|
||||||
|
var args:Array<Dynamic> = std.Reflect.field(data, BIND_SIGNAL_META);
|
||||||
|
var signal:bindx.BindSignal.Signal<Dynamic> = cast std.Reflect.field(bindable, m);
|
||||||
|
if (signal == null && force) {
|
||||||
|
var lazy:Bool = args[1];
|
||||||
|
if (lazy) signal = cast std.Reflect.getProperty(bindable, m.substr(1));
|
||||||
|
}
|
||||||
|
if (signal != null) {
|
||||||
|
var name = args[0];
|
||||||
|
signals.set(name, signal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return signals;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -90,11 +90,11 @@ class BindSignalProvider implements IBindingSignalProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function getUnbindAllExpr(expr:ExprOf<IBindable>, type:Type):Expr {
|
public function getUnbindAllExpr(expr:ExprOf<IBindable>, type:Type):Expr {
|
||||||
return macro bindx.BindSignal.SignalTools.unbindAll($expr);
|
return macro bindx.SignalTools.unbindAll($expr);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getBindAllExpr(expr:ExprOf<IBindable>, type:Type, listener:Expr, force:Bool = true):Expr {
|
public function getBindAllExpr(expr:ExprOf<IBindable>, type:Type, listener:Expr, force:Bool = true):Expr {
|
||||||
return macro bindx.BindSignal.SignalTools.bindAll($expr, $listener, $v{force});
|
return macro bindx.SignalTools.bindAll($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 {
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ class BindableMacros {
|
|||||||
/**
|
/**
|
||||||
* default value: false
|
* default value: false
|
||||||
*/
|
*/
|
||||||
static public inline var FORCE = "force";/**
|
static public inline var FORCE = "force";
|
||||||
/**
|
/**
|
||||||
* meta store bindable fields (interfaces only)
|
* meta store bindable fields (interfaces only)
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user