ncannasse 7 年之前
父节点
当前提交
d4d6d6d30c
共有 1 个文件被更改,包括 72 次插入0 次删除
  1. 72 0
      hxd/impl/Properties.hx

+ 72 - 0
hxd/impl/Properties.hx

@@ -0,0 +1,72 @@
+package hxd.impl;
+
+class Properties {
+
+	function getField(obj : Dynamic, f : String) : Dynamic {
+		return Reflect.field(obj, f);
+	}
+
+	function setField(obj : Dynamic, f : String, value : Dynamic) {
+		Reflect.setField(obj, f, value);
+	}
+
+	function valueStr( v : Dynamic ) {
+		var c = Type.getClass(v);
+		return c == null ? Std.string(v) : Type.getClassName(c);
+	}
+
+	function typeStr(t:Type.ValueType) {
+		return switch(t) { case TClass(c): Type.getClassName(c); default: t.getName(); };
+	}
+
+	public function apply( props : Dynamic, obj : Dynamic ) {
+		for( f in Reflect.fields(props) ) {
+			var v : Dynamic = getField(props, f);
+			var vprev : Dynamic = getField(obj, f);
+			var t = Type.typeof(v);
+			switch(t) {
+			case TObject:
+				if( vprev == null || !Reflect.isObject(vprev) )
+					throw valueStr(obj) + " is missing object field " + f;
+				apply(v, vprev);
+				continue;
+			case TInt, TFloat:
+				setField(obj, f, v);
+				continue;
+			case TClass(Array):
+				switch( Type.typeof(vprev) ) {
+				case TClass(h3d.Vector):
+					var v : Array<Float> = v;
+					var vprev : h3d.Vector = vprev;
+					vprev.set();
+					if( v.length >= 1 ) vprev.x = v[0];
+					if( v.length >= 2 ) vprev.y = v[1];
+					if( v.length >= 3 ) vprev.z = v[2];
+					if( v.length >= 4 ) vprev.w = v[3];
+					continue;
+				default:
+				}
+			case TClass(String):
+				switch( Type.typeof(vprev) ) {
+				case TClass(h3d.Vector):
+					var v : String = v;
+					var vprev : h3d.Vector = vprev;
+					if( v.charCodeAt(0) == '#'.code )  {
+						var color = Std.parseInt("0x" + v.substr(1));
+						vprev.set(
+							((color >> 16) & 0xFF) / 255,
+							((color >> 8) & 0xFF) / 255,
+							(color & 0xFF) / 255,
+							(color >>> 24) / 255
+						);
+						continue;
+					}
+				default:
+				}
+			default:
+			}
+			throw "Don't know how to set " + valueStr(obj) + "." + f + " with " + typeStr(t)+" (was "+typeStr(Type.typeof(vprev))+")";
+		}
+	}
+
+}