Properties.hx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package hxd.impl;
  2. class Properties {
  3. public function getField(obj : Dynamic, f : String) : Dynamic {
  4. return Reflect.field(obj, f);
  5. }
  6. public function setField(obj : Dynamic, f : String, value : Dynamic) {
  7. Reflect.setField(obj, f, value);
  8. }
  9. function valueStr( v : Dynamic ) {
  10. var c = Type.getClass(v);
  11. return c == null ? Std.string(v) : Type.getClassName(c);
  12. }
  13. function typeStr(t:Type.ValueType) {
  14. return switch(t) { case TClass(c): Type.getClassName(c); default: t.getName(); };
  15. }
  16. public function apply( props : Dynamic, obj : Dynamic ) {
  17. for( f in Reflect.fields(props) ) {
  18. var v : Dynamic = getField(props, f);
  19. var vprev : Dynamic = getField(obj, f);
  20. var t = Type.typeof(v);
  21. switch(t) {
  22. case TObject:
  23. if( vprev == null || !Reflect.isObject(vprev) )
  24. throw valueStr(obj) + " is missing object field " + f;
  25. apply(v, vprev);
  26. continue;
  27. case TInt, TFloat:
  28. setField(obj, f, v);
  29. continue;
  30. case TClass(Array):
  31. switch( Type.typeof(vprev) ) {
  32. case TClass(h3d.Vector.VectorImpl):
  33. var v : Array<Float> = v;
  34. var vprev : h3d.Vector = vprev;
  35. vprev.set();
  36. if( v.length >= 1 ) vprev.x = v[0];
  37. if( v.length >= 2 ) vprev.y = v[1];
  38. if( v.length >= 3 ) vprev.z = v[2];
  39. if( v.length >= 4 ) vprev.w = v[3];
  40. continue;
  41. default:
  42. }
  43. case TClass(String):
  44. switch( Type.typeof(vprev) ) {
  45. case TClass(h3d.Vector.VectorImpl):
  46. var v : String = v;
  47. var vprev : h3d.Vector = vprev;
  48. if( v.charCodeAt(0) == '#'.code ) {
  49. var color = Std.parseInt("0x" + v.substr(1));
  50. vprev.set(
  51. ((color >> 16) & 0xFF) / 255,
  52. ((color >> 8) & 0xFF) / 255,
  53. (color & 0xFF) / 255,
  54. (color >>> 24) / 255
  55. );
  56. continue;
  57. }
  58. default:
  59. }
  60. default:
  61. }
  62. throw "Don't know how to set " + valueStr(obj) + "." + f + " with " + typeStr(t)+" (was "+typeStr(Type.typeof(vprev))+")";
  63. }
  64. }
  65. }