Ver código fonte

more work on hide domkit (defaultArgs + cdb support)

Nicolas Cannasse 1 ano atrás
pai
commit
d0c36f6fdc
3 arquivos alterados com 91 adições e 12 exclusões
  1. 8 0
      hide/comp/DomkitEditor.hx
  2. 4 1
      hide/view/Domkit.hx
  3. 79 11
      hrt/impl/DomkitViewer.hx

+ 8 - 0
hide/comp/DomkitEditor.hx

@@ -577,6 +577,14 @@ class DomkitEditor extends CodeEditor {
 		}
 	}
 
+	public function getComponent() {
+		var compReg = ~/<([A-Za-z0-9_]+)/;
+		if( !compReg.match(code) )
+			return null;
+		var name = compReg.matched(1);
+		return checker.components.get(name);
+	}
+
 	override function getCompletion( position : Int ) {
 		var code = code;
 		var results = super.getCompletion(position);

+ 4 - 1
hide/view/Domkit.hx

@@ -61,7 +61,7 @@ class Domkit extends FileView {
 
 		var content = sys.io.File.getContent(getPath());
 		var cssText = "";
-		var paramsText = "typedef Params = {}";
+		var paramsText = DEFAULT_PARAMS;
 
 		content = StringTools.trim(content);
 
@@ -96,6 +96,9 @@ class Domkit extends FileView {
 
 	function check() {
 		modified = prevSave.css != cssEditor.code || prevSave.dml != dmlEditor.code || prevSave.params != paramsEditor.code;
+		var comp = dmlEditor.getComponent();
+		if( comp != null && comp.arguments.length > 0 )
+			@:privateAccess paramsEditor.checker.checker.setGlobal("defaultArgs", TAnon(comp.arguments.copy()));
 		paramsEditor.doCheckScript();
 		var params = @:privateAccess paramsEditor.checker.checker.locals.get("params");
 		if( params == null ) params = TAnon([]);

+ 79 - 11
hrt/impl/DomkitViewer.hx

@@ -66,7 +66,9 @@ class DomkitViewer extends h2d.Object {
 	var style : h2d.domkit.Style;
 	var baseVariables : Map<String,domkit.CssValue>;
 	var contexts : Array<Dynamic> = [];
+	var variables : Map<String,Dynamic> = [];
 	var rebuilding = false;
+	var compArgs : Map<String,Dynamic>;
 
 	public function new( style : h2d.domkit.Style, res : hxd.res.Resource, ?parent ) {
 		super(parent);
@@ -94,6 +96,28 @@ class DomkitViewer extends h2d.Object {
 		rebuildDelay();
 	}
 
+	#if castle
+	public function addCDB( cdb : cdb.Types.IndexId<Dynamic,Dynamic> ) {
+		var obj = {};
+		var idName = null;
+		for( c in @:privateAccess cdb.sheet.columns ) {
+			switch( c.type ) {
+			case TId: idName = c.name; break;
+			default:
+			}
+		}
+		for( o in cdb.all ) {
+			var id = Reflect.field(o, idName);
+			if( id == null || id == "" ) continue;
+			Reflect.setField(obj, id, id);
+		}
+		var name = @:privateAccess cdb.name;
+		name = name.charAt(0).toUpperCase() + name.substr(1);
+		variables.set(name, obj);
+		rebuildDelay();
+	}
+	#end
+
 	function reloadVariables() {
 		var vars = baseVariables.copy();
 		for( r in variablesFiles ) {
@@ -133,21 +157,29 @@ class DomkitViewer extends h2d.Object {
 		var interp = new DomkitInterp();
 		for( c in contexts )
 			interp.setContext(c);
+		for( name => value in variables )
+			interp.variables.set(name, value);
 		return interp;
 	}
 
 	function rebuild() {
 		var fullText = resource.entry.getText();
-		var text = fullText;
-		var startPos = 0;
-		var cssStart = 0;
+		var content = StringTools.trim(fullText);
 		var cssText = "";
-		if( StringTools.startsWith(text,"<css>") ) {
-			var pos = text.indexOf("</css>");
-			cssStart = 5;
-			cssText = text.substr(cssStart, pos - cssStart);
-			startPos = pos + 6;
-			text = text.substr(startPos);
+		var paramsText = "";
+
+		if( StringTools.startsWith(content,"<css>") ) {
+			var pos = content.indexOf("</css>");
+			cssText = StringTools.trim(content.substr(5, pos - 6));
+			content = content.substr(pos + 6);
+			content = StringTools.trim(content);
+		}
+
+		if( StringTools.startsWith(content,"<params>") ) {
+			var pos = content.indexOf("</params>");
+			paramsText = StringTools.trim(content.substr(8, pos - 9));
+			content = content.substr(pos + 9);
+			content = StringTools.trim(content);
 		}
 
 		@:privateAccess {
@@ -161,15 +193,38 @@ class DomkitViewer extends h2d.Object {
 		try {
 			var parser = new domkit.MarkupParser();
 			parser.allowRawText = true;
-			var expr = parser.parse(text,resource.entry.path, startPos);
+			var eparams = parseCode(paramsText, fullText.indexOf(paramsText));
+			var expr = parser.parse(content,resource.entry.path, fullText.indexOf(content));
 			root = domkit.Component.build(<flow class="debugRoot" layout="stack" content-align="middle middle" fill-width="true" fill-height="true"/>);
-
 			interp = makeInterp();
+			switch( eparams.e ) {
+			case EBlock(el): // prevent local to be removed
+				for( e in el ) evalCode(e);
+			default:
+				evalCode(eparams);
+			}
+			var vparams : Dynamic = @:privateAccess interp.locals.get("params")?.r;
+			if( vparams != null ) {
+				@:privateAccess interp.locals.remove("params");
+				for( f in Reflect.fields(vparams) )
+					interp.variables.set(f, Reflect.field(vparams,f));
+			}
+			compArgs = null;
+			var vargs : Dynamic = interp.variables.get("defaultArgs");
+			if( vargs != null ) {
+				interp.variables.remove("defaultArgs");
+				compArgs = new Map();
+				for( f in Reflect.fields(vargs) )
+					compArgs.set(f, Reflect.field(vargs,f));
+			}
 			addRec(expr, root);
 			interp = null;
 		} catch( e : domkit.Error ) {
 			onError(e);
 			return;
+		} catch( e : hscript.Expr.Error ) {
+			onError(new domkit.Error(e.toString(), e.pmin, e.pmax));
+			return;
 		}
 
 		if( current != null ) {
@@ -222,6 +277,11 @@ class DomkitViewer extends h2d.Object {
 			for( c in e.children )
 				addRec(c, parent);
 		case Node(name):
+			if( e.condition != null ) {
+				var expr = parseCode(e.condition.cond, e.condition.pmin);
+				if( !evalCode(expr) )
+					return;
+			}
 			var c = domkit.Component.get(name, true);
 			// if we are top component, resolve our parent component
 			if( parent.parent == null ) {
@@ -254,12 +314,20 @@ class DomkitViewer extends h2d.Object {
 				// TODO : typecheck argument
 				v;
 			}];
+			if( compArgs != null ) {
+				if( e.arguments.length == 0 ) {
+					for( a in c.argsNames )
+						args.push(compArgs.get(a));
+				}
+				compArgs = null;
+			}
 			var attributes = {};
 			for( a in e.attributes ) {
 				switch( a.value ) {
 				case RawValue(v):
 					Reflect.setField(attributes,a.name,v);
 				case Code(_):
+					throw "TODO";
 				}
 			}
 			var p = @:privateAccess domkit.Properties.createNew(c.name, parent.dom, args, attributes);