Advertisement
Guest User

Untitled

a guest
Apr 12th, 2019
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Haxe 4.31 KB | None | 0 0
  1.     public static function buildBehaviours():Array<Field> {
  2.         var builder = new ClassBuilder(haxe.macro.Context.getBuildFields(), Context.getLocalType(), Context.currentPos());
  3.         var registerBehavioursFn = builder.findFunction("registerBehaviours");
  4.         if (registerBehavioursFn == null) {
  5.             registerBehavioursFn = builder.addFunction("registerBehaviours", macro {
  6.                 super.registerBehaviours();
  7.             }, [APrivate, AOverride]);
  8.         }
  9.        
  10.         var valueField = builder.getFieldMetaValue("value");
  11.         for (f in builder.getFieldsWithMeta("behaviour")) {
  12.             f.remove();
  13.             if (builder.hasField(f.name, true) == false) { // check to see if it already exists, possibly in a super class
  14.                 var newField:FieldBuilder = null;
  15.                 if (f.isDynamic == true) { // add a getter that can return dynamic
  16.                     newField = builder.addGetter(f.name, f.type, macro {
  17.                         return behaviours.getDynamic($v{f.name});
  18.                     }, f.access);
  19.                 } else { // add a normal (Variant) getter
  20.                     newField = builder.addGetter(f.name, f.type, macro {
  21.                         return behaviours.get($v{f.name});
  22.                     }, f.access);
  23.                 }
  24.                
  25.                 if (f.name == valueField) {
  26.                     newField = builder.addSetter(f.name, f.type, macro { // add a normal (Variant) setter but let the binding manager know that the value has changed
  27.                         behaviours.set($v{f.name}, value);
  28.                         haxe.ui.binding.BindingManager.instance.componentPropChanged(this, "value");
  29.                         return value;
  30.                     }, f.access);
  31.                 } else {
  32.                     newField = builder.addSetter(f.name, f.type, macro { // add a normal (Variant) setter
  33.                         behaviours.set($v{f.name}, value);
  34.                         return value;
  35.                     }, f.access);
  36.                 }
  37.                
  38.                 newField.doc = f.doc;
  39.                 newField.addMeta(":behaviour");
  40.                 newField.addMeta(":bindable");
  41.                 newField.mergeMeta(f.meta, ["behaviour"]);
  42.             }
  43.            
  44.             if (f.getMetaValueExpr("behaviour", 1) == null) {
  45.                 registerBehavioursFn.add(macro
  46.                     behaviours.register($v{f.name}, $p{f.getMetaValueString("behaviour", 0).split(".")})
  47.                 );
  48.             } else {
  49.                 registerBehavioursFn.add(macro
  50.                     behaviours.register($v{f.name}, $p{f.getMetaValueString("behaviour", 0).split(".")}, $e{f.getMetaValueExpr("behaviour", 1)})
  51.                 );
  52.             }
  53.         }
  54.        
  55.         for (f in builder.findFunctionsWithMeta("call")) {
  56.             var arg0 = '${f.getArgName(0)}';
  57.             if (f.isVoid == true) {
  58.                 f.set(macro {
  59.                     behaviours.call($v{f.name}, $i{arg0});
  60.                 });
  61.             } else {
  62.                 f.set(macro {
  63.                     return behaviours.call($v{f.name}, $i{arg0});
  64.                 });
  65.             }
  66.            
  67.             if (f.getMetaValueExpr("call", 1) == null) {
  68.                 registerBehavioursFn.add(macro
  69.                     behaviours.register($v{f.name}, $p{f.getMetaValueString("call", 0).split(".")})
  70.                 );
  71.             } else {
  72.                 registerBehavioursFn.add(macro
  73.                     behaviours.register($v{f.name}, $p{f.getMetaValueString("call", 0).split(".")}, $e{f.getMetaValueExpr("call", 1)})
  74.                 );
  75.             }
  76.         }
  77.        
  78.         for (f in builder.getFieldsWithMeta("value")) {
  79.             f.remove();
  80.            
  81.             var propName = f.getMetaValueString("value");
  82.             builder.addGetter(f.name, macro: Dynamic, macro {
  83.                 return $i{propName};
  84.             }, false, true);
  85.            
  86.             builder.addSetter(f.name, macro: Dynamic, macro {
  87.                 super.set_value(value);
  88.                 $i{propName} = value;
  89.                 haxe.ui.binding.BindingManager.instance.componentPropChanged(this, $v{propName});
  90.                 return value;
  91.             }, false, true);
  92.         }
  93.        
  94.         return builder.fields;
  95.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement