Domkit.hx 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. package hide.view;
  2. class Domkit extends FileView {
  3. var cssEditor : hide.comp.DomkitEditor;
  4. var dmlEditor : hide.comp.DomkitEditor;
  5. var paramsEditor : hide.comp.ScriptEditor;
  6. var prevSave : { css : String, dml : String, params : String };
  7. var checker : hide.comp.DomkitEditor.DomkitChecker;
  8. override function onDisplay() {
  9. element.html('
  10. <div class="domkitEditor">
  11. <div class="editors">
  12. <div class="left panel">
  13. <div class="editor dmlEditor top">
  14. <span>
  15. DML
  16. <input id="format" type="button" value="Format"/>
  17. </span>
  18. </div>
  19. <div class="editor paramsEditor bot">
  20. <span>Parameters</span>
  21. </div>
  22. </div>
  23. <div class="right panel">
  24. <div class="editor cssEditor top">
  25. <span>CSS</span>
  26. </div>
  27. </div>
  28. </div>
  29. <div class="scene"></div>
  30. </div>');
  31. var content = sys.io.File.getContent(getPath());
  32. var data = hrt.impl.DomkitViewer.DomkitFile.parse(content);
  33. prevSave = data;
  34. dmlEditor = new hide.comp.DomkitEditor(config, DML, data.dml, element.find(".dmlEditor"));
  35. cssEditor = new hide.comp.DomkitEditor(config, Less, data.css, dmlEditor.checker, element.find(".cssEditor"));
  36. checker = new hide.comp.DomkitEditor.DomkitChecker(config);
  37. dmlEditor.checker.checker.onTopDownEnum = checker.checker.onTopDownEnum;
  38. paramsEditor = new hide.comp.ScriptEditor(data.params, checker, element.find(".paramsEditor"));
  39. paramsEditor.saveOnBlur = false;
  40. cssEditor.onChanged = dmlEditor.onChanged = paramsEditor.onChanged = check;
  41. cssEditor.onSave = dmlEditor.onSave = paramsEditor.onSave = save;
  42. var editors = element.find('.editors');
  43. var panelRight = element.find('.right');
  44. var panelLeft = new hide.comp.ResizablePanel(hide.comp.ResizablePanel.LayoutDirection.Horizontal, element.find('.left'), After);
  45. panelLeft.onBeforeResize = () -> {
  46. panelRight.width(0);
  47. };
  48. panelLeft.onResize = () -> {
  49. panelRight.width(editors.width() - panelLeft.element.width());
  50. };
  51. var panelTopLeft = new hide.comp.ResizablePanel(hide.comp.ResizablePanel.LayoutDirection.Vertical, panelLeft.element.find('.top'), After);
  52. var panelBotLeft = element.find('.bot');
  53. panelTopLeft.onBeforeResize = () -> {
  54. panelBotLeft.height(0);
  55. };
  56. panelTopLeft.onResize = () -> {
  57. panelBotLeft.height(editors.height() - panelTopLeft.element.height());
  58. };
  59. element.find("#format").click(function(_) {
  60. var dml = dmlEditor.checker.formatDML(dmlEditor.code);
  61. dmlEditor.setCode(dml, true);
  62. });
  63. // add a scene so the CssParser can resolve Tiles
  64. var scene = element.find(".scene");
  65. new hide.comp.Scene(config, scene, scene).onReady = function() check();
  66. }
  67. override function onResize() {
  68. var editors = element.find('.editors');
  69. element.find(".bot").height(editors.height() - element.find(".top").height());
  70. }
  71. function defineGlobals() {
  72. // define DomkitBaseContext functions
  73. @:privateAccess paramsEditor.checker.init();
  74. function defineGlobal(name,args:Array<{name:String,t:String,?opt:Bool}>,ret) {
  75. var cur = checker.checker.getGlobals().get(name);
  76. if( cur != null ) return;
  77. var error = false;
  78. function resolve(t:String) {
  79. var t = checker.checker.types.resolve(t);
  80. if( t == null ) error = true;
  81. return t;
  82. }
  83. var types = [for( a in args ) resolve(a.t)];
  84. var ret = resolve(ret);
  85. if( error )
  86. return;
  87. checker.checker.setGlobal(name,TFun([for( i => a in args ) { name : a.name, t : types[i], opt : a.opt }],ret));
  88. }
  89. defineGlobal("loadTile",[{ name : "path", t : "String" }],"h2d.Tile");
  90. }
  91. function check() {
  92. checker.usedEnums = [];
  93. modified = prevSave.css != cssEditor.code || prevSave.dml != dmlEditor.code || prevSave.params != paramsEditor.code;
  94. defineGlobals(); // redefine if types have been reloaded
  95. var allParams = new Map();
  96. dmlEditor.checker.params = allParams;
  97. var comp = dmlEditor.getComponent();
  98. if( comp != null && comp.classDef != null )
  99. paramsEditor.checker.checker.setGlobals(comp.classDef, true);
  100. paramsEditor.doCheckScript();
  101. var checker = cast(paramsEditor.checker,hide.comp.DomkitEditor.DomkitChecker);
  102. var tparams = try @:privateAccess checker.typeCode(paramsEditor.code,0) catch( e : hscript.Expr.Error ) null;
  103. if( tparams == null ) tparams = TAnon([]);
  104. switch( tparams ) {
  105. case TAnon(fields):
  106. var any : hscript.Checker.TType = TUnresolved("???");
  107. for( f in fields ) {
  108. var t = f.t;
  109. function setRec(t:hscript.Checker.TType) {
  110. switch( t ) {
  111. case TMono(r) if( r.r == null ): r.r = any;
  112. default:
  113. }
  114. switch( t ) {
  115. case TMono(r) if( r.r != null ): setRec(r.r);
  116. case TNull(t): setRec(t);
  117. case TInst(_,tl), TAbstract(_,tl), TEnum(_,tl), TType(_,tl):
  118. for( t in tl ) setRec(t);
  119. case TFun(args,ret):
  120. for( t in args ) setRec(t.t);
  121. setRec(ret);
  122. case TAnon(fl):
  123. for( f in fl )
  124. setRec(f.t);
  125. case TLazy(f):
  126. setRec(f());
  127. default:
  128. }
  129. }
  130. setRec(t);
  131. allParams.set(f.name, t);
  132. }
  133. case null, _:
  134. paramsEditor.setError("Params definition is missing", 0, 0, 0);
  135. }
  136. dmlEditor.check();
  137. cssEditor.check();
  138. var usedCDB = [];
  139. for( c in checker.cdbEnums )
  140. if( dmlEditor.code.indexOf(c+".") >= 0 )
  141. usedCDB.push(c);
  142. if( usedCDB.length > 0 )
  143. checker.usedEnums.push({path:"$cdb",constrs:usedCDB});
  144. }
  145. function trimSpaces( code : String ) {
  146. code = StringTools.trim(code);
  147. code = [for( l in code.split("\n") ) StringTools.rtrim(l)].join("\n");
  148. return code;
  149. }
  150. override function save() {
  151. super.save();
  152. var data = {
  153. css : trimSpaces(cssEditor.code),
  154. dml : trimSpaces(dmlEditor.code),
  155. params : trimSpaces(paramsEditor.code),
  156. enums : checker.usedEnums.length == 0 ? null : haxe.Json.stringify(checker.usedEnums),
  157. };
  158. var str = hrt.impl.DomkitViewer.toStr(data);
  159. prevSave = data;
  160. if( data.css != cssEditor.code ) cssEditor.setCode(data.css, true);
  161. if( data.dml != dmlEditor.code ) dmlEditor.setCode(data.dml, true);
  162. if( data.params != paramsEditor.code ) paramsEditor.setCode(data.params, true);
  163. sys.io.File.saveContent(getPath(),str);
  164. modified = false;
  165. }
  166. override function getDefaultContent() {
  167. var tag = getPath().split("/").pop().split(".").shift().split("_").join("-");
  168. return haxe.io.Bytes.ofString('<css>\n$tag {\n}\n</css>\n<$tag>\n</$tag>');
  169. }
  170. static var _ = Extension.registerExtension(Domkit,["domkit"],{ icon : "id-card-o", createNew : "Domkit Component" , name: "Domkit"});
  171. }
  172. class DomkitLess extends FileView {
  173. var editor : hide.comp.DomkitEditor;
  174. override function onDisplay() {
  175. super.onDisplay();
  176. var content = sys.io.File.getContent(getPath());
  177. element.html('<div class="lesseditor">
  178. <div class="scene"></div>
  179. </div>');
  180. editor = new hide.comp.DomkitEditor(config, Less, content, element.find(".lesseditor"));
  181. editor.onSave = function() {
  182. content = editor.code;
  183. save();
  184. };
  185. editor.onChanged = function() {
  186. modified = content != editor.code;
  187. editor.check();
  188. };
  189. // add a scene so the CssParser can resolve Tiles
  190. var scene = element.find(".scene");
  191. new hide.comp.Scene(config, scene, scene).onReady = function() editor.check();
  192. }
  193. override function save() {
  194. super.save();
  195. sys.io.File.saveContent(getPath(), editor.code);
  196. // TODO : execute lessc
  197. }
  198. static var _ = Extension.registerExtension(DomkitLess,["less"],{ icon : "object-group", name: "Less" });
  199. }