BaseComponents.hx 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029
  1. package h2d.domkit;
  2. import domkit.Property;
  3. import domkit.CssValue;
  4. typedef FlowBg = { tile : #if macro Bool #else h2d.Tile #end, borderL : Int, borderT : Int, borderR : Int, borderB : Int, ?color : Int }
  5. class CustomParser extends domkit.CssValue.ValueParser {
  6. public function new() {
  7. super();
  8. defaultColor = -1;
  9. }
  10. function parseScale( value ) {
  11. switch( value ) {
  12. case VGroup([x,y]):
  13. return { x : parseFloatPercent(x), y : parseFloatPercent(y) };
  14. default:
  15. var s = parseFloatPercent(value);
  16. return { x : s, y : s };
  17. }
  18. }
  19. function parseDimension( value ) {
  20. switch( value ) {
  21. case VGroup([x,y]):
  22. return { x : parseFloat(x), y : parseFloat(y) };
  23. case VIdent("none"):
  24. return null;
  25. default:
  26. var s = parseFloat(value);
  27. return { x : s, y : s };
  28. }
  29. }
  30. function parsePosition( value ) {
  31. switch( value ) {
  32. case VIdent("auto"):
  33. return false;
  34. case VIdent("absolute"):
  35. return true;
  36. default:
  37. return invalidProp();
  38. }
  39. }
  40. function transitionColorF( v1 : h3d.Vector, v2 : h3d.Vector, t : Float ) : h3d.Vector {
  41. var v = new h3d.Vector();
  42. v.lerp(v1,v2,t);
  43. return v;
  44. }
  45. function parseColorF( v : CssValue ) : h3d.Vector {
  46. var f = new h3d.Vector();
  47. switch( v ) {
  48. case VInt(i):
  49. f.r = f.g = f.b = i;
  50. case VFloat(k):
  51. f.r = f.g = f.b = k;
  52. default:
  53. f.setColor(parseColor(v));
  54. }
  55. return f;
  56. }
  57. function loadResource( path : String ) {
  58. #if macro
  59. // TODO : compile-time path check?
  60. return true;
  61. #else
  62. return try hxd.res.Loader.currentInstance.load(path) catch( e : hxd.res.NotFound ) invalidProp("Resource not found "+path);
  63. #end
  64. }
  65. public function parseResource( v : CssValue) {
  66. var path = parsePath(v);
  67. return loadResource(path);
  68. }
  69. public function parseTile( v : CssValue) {
  70. try {
  71. switch( v ) {
  72. case VIdent("none"):
  73. return null;
  74. case VGroup([color,w,h]):
  75. var c = parseColor(color);
  76. var w = parseInt(w);
  77. var h = parseInt(h);
  78. return #if macro true #else h2d.Tile.fromColor(c,w,h,(c>>>24)/255) #end;
  79. case VCall("tile",[VString(url),VInt(size)]):
  80. var p = loadResource(url);
  81. return #if macro p #else { var t = p.toTile(); t.sub(0,0,size,size); } #end;
  82. case VCall("tile",[VString(url),VInt(sizex),VInt(sizey)]):
  83. var p = loadResource(url);
  84. return #if macro p #else { var t = p.toTile(); t.sub(0,0,sizex,sizey); } #end;
  85. case VCall("grid",[VString(url),VInt(hsplit),VInt(vsplit)]):
  86. var p = loadResource(url);
  87. return #if macro p #else { var t = p.toTile(); t.sub(0,0,Std.int(t.iwidth/hsplit),Std.int(t.iheight/vsplit)); } #end;
  88. case VCall("hgrid",[VString(url),VInt(hsplit)]):
  89. var p = loadResource(url);
  90. return #if macro p #else { var t = p.toTile(); t.sub(0,0,Std.int(t.iwidth/hsplit),t.iheight); } #end;
  91. case VCall("vgrid",[VString(url),VInt(vsplit)]):
  92. var p = loadResource(url);
  93. return #if macro p #else { var t = p.toTile(); t.sub(0,0,t.iwidth,Std.int(t.iheight/vsplit)); } #end;
  94. default:
  95. var c = parseColor(v);
  96. return #if macro true #else h2d.Tile.fromColor(c,1,1,(c>>>24)/255) #end;
  97. }
  98. } catch( e : InvalidProperty ) {
  99. var path = parsePath(v);
  100. var p = loadResource(path);
  101. return #if macro p #else p.toTile() #end;
  102. }
  103. }
  104. public function parseTilePos( value ) : { p:Int, ?y:Int } {
  105. return switch( value ) {
  106. case VIdent("default"): { p : 0 };
  107. case VInt(p): { p : p };
  108. case VGroup([VInt(x),VInt(y)]): { p : x, y : y };
  109. default: invalidProp();
  110. }
  111. }
  112. public function parseHAlign( value ) : #if macro Bool #else h2d.Flow.FlowAlign #end {
  113. switch( parseIdent(value) ) {
  114. case "auto":
  115. return null;
  116. case "middle":
  117. return #if macro true #else Middle #end;
  118. case "left":
  119. return #if macro true #else Left #end;
  120. case "right":
  121. return #if macro true #else Right #end;
  122. case x:
  123. return invalidProp(x+" should be auto|left|middle|right");
  124. }
  125. }
  126. public function parseVAlign( value ) : #if macro Bool #else h2d.Flow.FlowAlign #end {
  127. switch( parseIdent(value) ) {
  128. case "auto":
  129. return null;
  130. case "middle":
  131. return #if macro true #else Middle #end;
  132. case "top":
  133. return #if macro true #else Top #end;
  134. case "bottom":
  135. return #if macro true #else Bottom #end;
  136. case x:
  137. return invalidProp(x+" should be auto|top|middle|bottom");
  138. }
  139. }
  140. public function parseAlign( value : CssValue ) {
  141. switch( value ) {
  142. case VIdent("auto"):
  143. return { h : null, v : null };
  144. case VIdent(_):
  145. try {
  146. return { h : parseHAlign(value), v : null };
  147. } catch( e : InvalidProperty ) {
  148. return { h : null, v : parseVAlign(value) };
  149. }
  150. case VGroup([h,v]):
  151. try {
  152. return { h : parseHAlign(h), v : parseVAlign(v) };
  153. } catch( e : InvalidProperty ) {
  154. return { h : parseHAlign(v), v : parseVAlign(h) };
  155. }
  156. default:
  157. return invalidProp();
  158. }
  159. }
  160. public function parseFont( value : CssValue ) {
  161. var path = null;
  162. var sdf = null;
  163. var offset = 0;
  164. switch(value) {
  165. case VGroup(args):
  166. var args = args.copy();
  167. path = parsePath(args[0]);
  168. switch( args[1] ) {
  169. case VCall("offset", [v]):
  170. offset = parseInt(v);
  171. args.splice(1,1);
  172. default:
  173. }
  174. if( args[1] != null ) {
  175. sdf = {
  176. size: parseInt(args[1]),
  177. channel: args.length >= 3 ? switch(args[2]) {
  178. case VIdent("red"): h2d.Font.SDFChannel.Red;
  179. case VIdent("green"): h2d.Font.SDFChannel.Green;
  180. case VIdent("blue"): h2d.Font.SDFChannel.Blue;
  181. case VIdent("multi"): h2d.Font.SDFChannel.MultiChannel;
  182. default: h2d.Font.SDFChannel.Alpha;
  183. } : h2d.Font.SDFChannel.Alpha,
  184. cutoff: args.length >= 4 ? parseFloat(args[3]) : 0.5,
  185. smooth: args.length >= 5 ? parseFloat(args[4]) : 1.0/32.0
  186. };
  187. adjustSdfParams(sdf);
  188. }
  189. default:
  190. path = parsePath(value);
  191. }
  192. var res = loadResource(path);
  193. #if macro
  194. return res;
  195. #else
  196. var fnt;
  197. if(sdf != null)
  198. fnt = res.to(hxd.res.BitmapFont).toSdfFont(sdf.size, sdf.channel, sdf.cutoff, sdf.smooth);
  199. else
  200. fnt = res.to(hxd.res.BitmapFont).toFont();
  201. if( offset != 0 )
  202. @:privateAccess fnt.baseLine = fnt.calcBaseLine() - offset;
  203. return fnt;
  204. #end
  205. }
  206. public static dynamic function adjustSdfParams( sdf : { size : Int, channel : h2d.Font.SDFChannel, cutoff : Float, smooth : Float }) {
  207. }
  208. public function parseTextShadow( value : CssValue ) {
  209. return switch( value ) {
  210. case VIdent("none"):
  211. return null;
  212. case VGroup(vl):
  213. return { dx : parseFloat(vl[0]), dy : parseFloat(vl[1]), color : vl.length >= 3 ? parseColor(vl[2]) : 0, alpha : vl.length >= 4 ? parseFloatPercent(vl[3]) : 1 };
  214. default:
  215. return { dx : 1, dy : 1, color : parseColor(value), alpha : 1 };
  216. }
  217. }
  218. function transitionFlowBackground( bg1 : FlowBg, bg2 : FlowBg, v : Float ) : FlowBg {
  219. var color = transitionColor(bg1.color, bg2.color, v);
  220. return {
  221. tile : #if macro true #else h2d.Tile.fromColor(color&0xFFFFFF,(color>>>24)/255) #end,
  222. borderL : Std.int(hxd.Math.lerp(bg1.borderL, bg2.borderL, v)),
  223. borderR : Std.int(hxd.Math.lerp(bg1.borderR, bg2.borderR, v)),
  224. borderT : Std.int(hxd.Math.lerp(bg1.borderT, bg2.borderT, v)),
  225. borderB : Std.int(hxd.Math.lerp(bg1.borderB, bg2.borderB, v)),
  226. color : color,
  227. };
  228. }
  229. public function parseFlowBackground(value) : FlowBg {
  230. return switch( value ) {
  231. case VIdent("transparent"): null;
  232. case VGroup([tile,VInt(w),VInt(h)]):
  233. { tile : parseTile(tile), borderL : w, borderT : h, borderR : w, borderB : h };
  234. case VGroup([tile,VInt(l),VInt(t),VInt(r),VInt(b)]):
  235. { tile : parseTile(tile), borderL : l, borderT : t, borderR : r, borderB : b };
  236. case VGroup([color,alpha]):
  237. var c = parseColor(color);
  238. var a = parseFloat(alpha);
  239. return { tile : #if macro true #else h2d.Tile.fromColor(c,a) #end, borderL : 0, borderT : 0, borderR : 0, borderB : 0, color : c | (Std.int(hxd.Math.clamp(a)*255)<<24) };
  240. case VCall("disc",args) if( args.length == 1 || args.length == 2 ):
  241. var c = parseColor(args[0]);
  242. var a = args[1] == null ? 1. : parseFloat(args[1]);
  243. return { tile : #if macro true #else h2d.Tile.fromTexture(h3d.mat.Texture.genDisc(256,c,a)) #end, borderL : 0, borderT : 0, borderR : 0, borderB : 0 };
  244. default:
  245. { tile : parseTile(value), borderL : 0, borderT : 0, borderR : 0, borderB : 0, color : try parseColor(value) catch( e : Dynamic ) null };
  246. }
  247. }
  248. public function parseCursor(value) : hxd.Cursor {
  249. return switch( value ) {
  250. case VIdent("default"): Default;
  251. case VIdent("button"): Button;
  252. case VIdent("move"): Move;
  253. case VIdent("textinput") | VIdent("input"): TextInput;
  254. case VIdent("hide"): Hide;
  255. default: invalidProp();
  256. }
  257. }
  258. public function parseFilter(value) : #if macro Bool #else h2d.filter.Filter #end {
  259. return switch( value ) {
  260. case VIdent("none"): #if macro true #else null #end;
  261. case VIdent("nothing"): #if macro true #else new h2d.filter.Nothing() #end;
  262. case VIdent("grayscale"), VCall("grayscale",[]): #if macro true #else h2d.filter.ColorMatrix.grayed() #end;
  263. case VCall("grayscale",[v]):
  264. var v = parseFloatPercent(v);
  265. #if macro
  266. true;
  267. #else
  268. var f = new h2d.filter.ColorMatrix();
  269. f.matrix.colorSaturate(-v);
  270. f;
  271. #end
  272. case VCall("saturate",[v]):
  273. var v = parseFloatPercent(v);
  274. #if macro
  275. true;
  276. #else
  277. var f = new h2d.filter.ColorMatrix();
  278. f.matrix.colorSaturate(v);
  279. f;
  280. #end
  281. case VCall("outline",[s, c]):
  282. var s = parseFloat(s);
  283. var c = parseColor(c);
  284. #if macro
  285. true;
  286. #else
  287. var f = new h2d.filter.Outline(s, c);
  288. f.alpha = (c >>> 24) / 255;
  289. f;
  290. #end
  291. case VCall("brightness",[v]):
  292. var v = parseFloatPercent(v);
  293. #if macro
  294. true;
  295. #else
  296. var f = new h2d.filter.ColorMatrix();
  297. f.matrix.colorLightness(v);
  298. f;
  299. #end
  300. case VCall("glow",[c, a, r, g, q, b]):
  301. var c = parseColor(c);
  302. var a = parseFloat(a);
  303. var r = parseFloat(r);
  304. var g = parseFloat(g);
  305. var q = parseFloat(q);
  306. var b = parseBool(b);
  307. #if macro
  308. true;
  309. #else
  310. new h2d.filter.Glow(c, a, r, g, q, b);
  311. #end
  312. case VCall("blur",[r]):
  313. var r = parseFloat(r);
  314. #if macro
  315. true;
  316. #else
  317. new h2d.filter.Blur(r);
  318. #end
  319. case VGroup(vl):
  320. var fl = [for( v in vl ) parseFilter(v)];
  321. #if macro
  322. true;
  323. #else
  324. new h2d.filter.Group(fl);
  325. #end
  326. default: invalidProp();
  327. }
  328. }
  329. public function parseColorAdjust(value:CssValue) : h3d.Matrix.ColorAdjust {
  330. if( value.match(VIdent("none")) )
  331. return null;
  332. var adj : h3d.Matrix.ColorAdjust = {};
  333. inline function parseVal(vcall: CssValue) {
  334. switch(vcall) {
  335. case VCall("hue-rotate", [v]):
  336. adj.hue = parseFloat(v) * Math.PI / 180;
  337. case VCall("contrast", [v]):
  338. adj.contrast = parseFloat(v);
  339. case VCall("gain", [c, a]):
  340. adj.gain = { color : parseColor(c), alpha : parseFloat(a) };
  341. case VCall("brightness",[v]):
  342. adj.lightness = parseFloat(v);
  343. case VCall("saturate",[v]):
  344. adj.saturation = parseFloat(v);
  345. default:
  346. invalidProp();
  347. }
  348. }
  349. switch( value ) {
  350. case VGroup(vcalls):
  351. for(vcall in vcalls)
  352. parseVal(vcall);
  353. case VCall(_):
  354. parseVal(value);
  355. default:
  356. invalidProp();
  357. }
  358. return adj;
  359. }
  360. }
  361. #if !macro
  362. @:uiComp("object") @:domkitDecl
  363. class ObjectComp implements h2d.domkit.Object implements domkit.Component.ComponentDecl<h2d.Object> {
  364. @:p var x : Float;
  365. @:p var y : Float;
  366. @:p var alpha : Float = 1;
  367. @:p var rotation : Float;
  368. @:p var visible : Bool = true;
  369. @:p(scale) var scale : { x : Float, y : Float };
  370. @:p var scaleX : Float;
  371. @:p var scaleY : Float;
  372. @:p var blend : h2d.BlendMode = Alpha;
  373. @:p(filter) var filter : h2d.filter.Filter;
  374. // flow properties
  375. @:p(box) var margin : { left : Int, top : Int, right : Int, bottom : Int };
  376. @:p var marginLeft = 0;
  377. @:p var marginRight = 0;
  378. @:p var marginTop = 0;
  379. @:p var marginBottom = 0;
  380. @:p(align) var align : { v : h2d.Flow.FlowAlign, h : h2d.Flow.FlowAlign };
  381. @:p(hAlign) var halign : h2d.Flow.FlowAlign;
  382. @:p(vAlign) var valign : h2d.Flow.FlowAlign;
  383. @:p(position) var position : Bool;
  384. @:p(XY) var offset : { x : Float, y : Float };
  385. @:p var offsetX : Int;
  386. @:p var offsetY : Int;
  387. @:p(none) var minWidth : Null<Int>;
  388. @:p(none) var minHeight : Null<Int>;
  389. @:p var forceLineBreak : Bool;
  390. @:p(none) var autoSize : Null<Float>;
  391. @:p(none) var autoSizeWidth : Null<Float>;
  392. @:p(none) var autoSizeHeight : Null<Float>;
  393. static function set_rotation(o:h2d.Object, v:Float) {
  394. o.rotation = v * Math.PI / 180;
  395. }
  396. static function set_visible(o:h2d.Object, v:Bool) {
  397. o.visible = v;
  398. }
  399. static function set_scale(o:h2d.Object,v) {
  400. if(v != null) {
  401. o.scaleX = v.x;
  402. o.scaleY = v.y;
  403. }
  404. else {
  405. o.setScale(1);
  406. }
  407. }
  408. static function set_filter(o:h2d.Object, f:h2d.filter.Filter) {
  409. o.filter = f;
  410. }
  411. static function set_blend(o:h2d.Object, b:h2d.BlendMode) {
  412. o.blendMode = b;
  413. }
  414. static function getFlowProps( o : h2d.Object ) {
  415. var p = hxd.impl.Api.downcast(o.parent, h2d.Flow);
  416. return p == null ? null : p.getProperties(o);
  417. }
  418. static function set_margin(o:h2d.Object,v) {
  419. var p = getFlowProps(o);
  420. if( p != null ) {
  421. if( v == null )
  422. p.paddingLeft = p.paddingRight = p.paddingTop = p.paddingBottom = 0;
  423. else {
  424. p.paddingLeft = v.left;
  425. p.paddingRight = v.right;
  426. p.paddingTop = v.top;
  427. p.paddingBottom = v.bottom;
  428. }
  429. }
  430. }
  431. static function set_marginLeft(o:h2d.Object,v) {
  432. var p = getFlowProps(o);
  433. if( p != null ) p.paddingLeft = v;
  434. }
  435. static function set_marginRight(o:h2d.Object,v) {
  436. var p = getFlowProps(o);
  437. if( p != null ) p.paddingRight = v;
  438. }
  439. static function set_marginTop(o:h2d.Object,v) {
  440. var p = getFlowProps(o);
  441. if( p != null ) p.paddingTop = v;
  442. }
  443. static function set_marginBottom(o:h2d.Object,v) {
  444. var p = getFlowProps(o);
  445. if( p != null ) p.paddingBottom = v;
  446. }
  447. static function set_align(o:h2d.Object,v) {
  448. var p = getFlowProps(o);
  449. if( p != null ) {
  450. p.horizontalAlign = v == null ? null : v.h;
  451. p.verticalAlign = v == null ? null : v.v;
  452. }
  453. }
  454. static function set_halign(o:h2d.Object,v) {
  455. var p = getFlowProps(o);
  456. if( p != null ) p.horizontalAlign = v;
  457. }
  458. static function set_valign(o:h2d.Object,v) {
  459. var p = getFlowProps(o);
  460. if( p != null ) p.verticalAlign = v;
  461. }
  462. static function set_position(o:h2d.Object,v) {
  463. var p = getFlowProps(o);
  464. if( p != null ) p.isAbsolute = v;
  465. }
  466. static function set_offset(o:h2d.Object,v) {
  467. var p = getFlowProps(o);
  468. if( p != null ) {
  469. p.offsetX = v == null ? 0 : Std.int(v.x);
  470. p.offsetY = v == null ? 0 : Std.int(v.y);
  471. }
  472. }
  473. static function set_offsetX(o:h2d.Object,v) {
  474. var p = getFlowProps(o);
  475. if( p != null ) p.offsetX = v;
  476. }
  477. static function set_offsetY(o:h2d.Object,v) {
  478. var p = getFlowProps(o);
  479. if( p != null ) p.offsetY = v;
  480. }
  481. static function set_minWidth(o:h2d.Object,v) {
  482. var p = getFlowProps(o);
  483. if( p != null ) p.minWidth = v;
  484. }
  485. static function set_minHeight(o:h2d.Object,v) {
  486. var p = getFlowProps(o);
  487. if( p != null ) p.minHeight = v;
  488. }
  489. static function set_autoSize(o:h2d.Object,v) {
  490. var p = getFlowProps(o);
  491. if( p != null ) {
  492. p.autoSizeWidth = v;
  493. p.autoSizeHeight = v;
  494. }
  495. }
  496. static function set_autoSizeWidth(o:h2d.Object,v) {
  497. var p = getFlowProps(o);
  498. if( p != null ) p.autoSizeWidth = v;
  499. }
  500. static function set_autoSizeHeight(o:h2d.Object,v) {
  501. var p = getFlowProps(o);
  502. if( p != null ) p.autoSizeHeight = v;
  503. }
  504. static function set_forceLineBreak(o:h2d.Object,v) {
  505. var p = getFlowProps(o);
  506. if( p != null ) p.lineBreak = v;
  507. }
  508. static function updateComponentId(p:domkit.Properties<Dynamic>) {
  509. cast(p.obj,h2d.Object).name = p.id.toString();
  510. }
  511. @:keep static var _ = { @:privateAccess domkit.Properties.updateComponentId = updateComponentId; true; }
  512. }
  513. @:uiComp("drawable") @:domkitDecl
  514. class DrawableComp extends ObjectComp implements domkit.Component.ComponentDecl<h2d.Drawable> {
  515. @:p(colorF) @:t(colorF) #if domkit_drawable_color var color #else var tint #end : h3d.Vector;
  516. @:p(auto) var smooth : Null<Bool>;
  517. @:p(colorAdjust) var colorAdjust : Null<h3d.Matrix.ColorAdjust>;
  518. @:p var tileWrap : Bool;
  519. static function #if domkit_drawable_color set_color #else set_tint #end( o : h2d.Drawable, v ) {
  520. if(v != null)
  521. o.color.load(v);
  522. else
  523. o.color.set(1,1,1);
  524. }
  525. static function set_colorAdjust( o : h2d.Drawable, v ) {
  526. o.adjustColor(v);
  527. }
  528. }
  529. @:uiComp("mask") @:domkitDecl
  530. class MaskComp extends ObjectComp implements domkit.Component.ComponentDecl<h2d.Mask> {
  531. @:p var width : Int;
  532. @:p var height : Int;
  533. static function create( parent : h2d.Object ) {
  534. return new h2d.Mask(0,0,parent);
  535. }
  536. }
  537. @:uiComp("video") @:domkitDecl
  538. class VideoComp extends DrawableComp implements domkit.Component.ComponentDecl<h2d.Video> {
  539. @:p(resource) var src : hxd.res.Any;
  540. @:p var loop : Bool;
  541. static function create( parent : h2d.Object ) {
  542. return new h2d.Video(parent);
  543. }
  544. static function set_src( o : h2d.Video, v ) {
  545. o.loadResource(v);
  546. }
  547. static function set_loop( o : h2d.Video, v ) {
  548. o.loop = v;
  549. }
  550. }
  551. @:uiComp("bitmap") @:domkitDecl
  552. class BitmapComp extends DrawableComp implements domkit.Component.ComponentDecl<h2d.Bitmap> {
  553. @:p(tile) var src : h2d.Tile;
  554. @:p(tilePos) var srcPos : { p : Int, ?y : Int };
  555. @:p var srcPosX : Null<Int>;
  556. @:p var srcPosY : Null<Int>;
  557. @:p(auto) var width : Null<Float>;
  558. @:p(auto) var height : Null<Float>;
  559. static function create( parent : h2d.Object ) {
  560. return new h2d.Bitmap(h2d.Tile.fromColor(0xFF00FF,32,32,0.9),parent);
  561. }
  562. static function set_src( o : h2d.Bitmap, t ) {
  563. o.tile = t == null ? h2d.Tile.fromColor(0xFF00FF,32,32,0.9) : t;
  564. }
  565. static function set_srcPos( o : h2d.Bitmap, pos ) {
  566. o.tile = setTilePos(o.tile, pos);
  567. }
  568. static function set_srcPosX( o : h2d.Bitmap, x : Int ) {
  569. o.tile = setTilePosX(o.tile, x);
  570. }
  571. static function set_srcPosY( o : h2d.Bitmap, y: Int ) {
  572. o.tile = setTilePosY(o.tile, y);
  573. }
  574. static function setTilePos( t : h2d.Tile, pos : Null<{ p : Int, ?y : Int }> ) {
  575. if( t == null ) return null;
  576. if( pos == null ) pos = {p:0};
  577. var tex = t.getTexture();
  578. t = t.clone();
  579. if( pos.y == null && t.iwidth == tex.width )
  580. t.setPosition(0, pos.p * t.iheight);
  581. else
  582. t.setPosition(pos.p * t.iwidth, pos.y * t.iheight);
  583. return t;
  584. }
  585. static function setTilePosX( t : h2d.Tile, x : Int ) {
  586. if( t == null ) return null;
  587. t = t.clone();
  588. t.setPosition(x * t.iwidth, t.iy);
  589. return t;
  590. }
  591. static function setTilePosY( t : h2d.Tile, y : Int ) {
  592. if( t == null ) return null;
  593. t = t.clone();
  594. t.setPosition(t.ix, y * t.iheight);
  595. return t;
  596. }
  597. static function set_width( o : h2d.Bitmap, v : Null<Float> ) {
  598. o.width = v;
  599. }
  600. static function set_height( o : h2d.Bitmap, v : Null<Float> ) {
  601. o.height = v;
  602. }
  603. }
  604. @:uiComp("text") @:domkitDecl
  605. class TextComp extends DrawableComp implements domkit.Component.ComponentDecl<h2d.Text> {
  606. @:p var text : String = "";
  607. @:p(font) var font : h2d.Font;
  608. @:p var letterSpacing = 0;
  609. @:p var lineSpacing = 0;
  610. @:p var lineBreak : Bool;
  611. @:p(none) var maxWidth : Null<Int>;
  612. @:p var textAlign : h2d.Text.Align = Left;
  613. @:p(textShadow) var textShadow : { dx : Float, dy : Float, color : Int, alpha : Float };
  614. @:p(color) @:t(color) var #if domkit_drawable_color textColor #else color #end : Null<Int>;
  615. static function create( parent : h2d.Object ) {
  616. return new h2d.Text(hxd.res.DefaultFont.get(),parent);
  617. }
  618. static function set_font( t : h2d.Text, v ) {
  619. t.font = v == null ? hxd.res.DefaultFont.get() : v;
  620. }
  621. static function set_textShadow( t : h2d.Text, v ) {
  622. t.dropShadow = v;
  623. }
  624. static function set_lineBreak( t : h2d.Text, v ) {
  625. t.lineBreak = v;
  626. }
  627. #if !domkit_drawable_color
  628. static function set_color( t : h2d.Text, v : Null<Int> ) {
  629. t.textColor = v == null ? -1 : v;
  630. }
  631. #end
  632. }
  633. @:uiComp("html-text") @:domkitDecl
  634. class HtmlTextComp extends TextComp implements domkit.Component.ComponentDecl<h2d.HtmlText> {
  635. @:p var condenseWhite : Bool;
  636. @:p var propagateInteractiveNode: Bool;
  637. static function create( parent : h2d.Object ) {
  638. return new h2d.HtmlText(hxd.res.DefaultFont.get(),parent);
  639. }
  640. static function set_condenseWhite(o : h2d.HtmlText, v) {
  641. o.condenseWhite = v;
  642. }
  643. static function set_propagateInteractiveNode(o : h2d.HtmlText, v) {
  644. o.propagateInteractiveNode = v;
  645. }
  646. }
  647. @:uiComp("scale-grid") @:domkitDecl
  648. class ScaleGridComp extends DrawableComp implements domkit.Component.ComponentDecl<h2d.ScaleGrid> {
  649. @:p var ignoreScale : Bool;
  650. @:p var borderScale : Float;
  651. @:p var tileBorders : Bool;
  652. @:p var width : Float;
  653. @:p var height : Float;
  654. static function create( parent : h2d.Object ) {
  655. return new h2d.ScaleGrid(h2d.Tile.fromColor(0xFF00FF,32,32,0.9), 0, 0,parent);
  656. }
  657. static function set_ignoreScale(o : h2d.ScaleGrid, v) {
  658. o.ignoreScale = v;
  659. }
  660. static function set_borderScale(o : h2d.ScaleGrid, v) {
  661. o.borderScale = v;
  662. }
  663. static function set_tileBorders(o : h2d.ScaleGrid, v) {
  664. o.tileBorders = v;
  665. }
  666. static function set_width( o : h2d.ScaleGrid, v : Float ) {
  667. o.width = v;
  668. }
  669. static function set_height( o : h2d.ScaleGrid, v : Float ) {
  670. o.height = v;
  671. }
  672. }
  673. @:uiComp("flow") @:domkitDecl
  674. class FlowComp extends ObjectComp implements domkit.Component.ComponentDecl<h2d.Flow> {
  675. @:p(auto) var width : Null<Int>;
  676. @:p(auto) var height : Null<Int>;
  677. @:p var maxWidth : Null<Int>;
  678. @:p var maxHeight : Null<Int>;
  679. @:p var backgroundId : Bool;
  680. @:p(flowBackground) @:t(flowBackground) var background : FlowBg;
  681. @:p(tile) var backgroundTile : h2d.Tile;
  682. @:p(tilePos) var backgroundTilePos : { p : Int, y : Int };
  683. @:p var backgroundTilePosX : Null<Int>;
  684. @:p var backgroundTilePosY : Null<Int>;
  685. @:p var backgroundAlpha : Float = 1;
  686. @:p(auto) var backgroundSmooth : Null<Bool>;
  687. @:p var debug : Bool;
  688. @:p var layout : h2d.Flow.FlowLayout;
  689. @:p var vertical : Bool;
  690. @:p var horizontal : Bool;
  691. @:p var stack : Bool;
  692. @:p var multiline : Bool;
  693. @:p(box) var padding : { left : Int, right : Int, top : Int, bottom : Int };
  694. @:p var paddingLeft : Int;
  695. @:p var paddingRight : Int;
  696. @:p var paddingTop : Int;
  697. @:p var paddingBottom : Int;
  698. @:p var hspacing : Int;
  699. @:p var vspacing : Int;
  700. @:p(dimension) var spacing : { x: Float, y: Float };
  701. @:p var fillWidth: Bool;
  702. @:p var fillHeight: Bool;
  703. @:p var overflow: h2d.Flow.FlowOverflow;
  704. @:p var scrollWheelSpeed: Float;
  705. @:p var reverse : Bool;
  706. @:p(align) var contentAlign : { h : h2d.Flow.FlowAlign, v : h2d.Flow.FlowAlign };
  707. @:p(vAlign) var contentValign : h2d.Flow.FlowAlign;
  708. @:p(hAlign) var contentHalign : h2d.Flow.FlowAlign;
  709. @:p(cursor) var cursor : hxd.Cursor;
  710. @:p var propagate : Bool;
  711. @:p var inlineBlock : Bool;
  712. static function set_minWidth( o : h2d.Flow, v ) {
  713. o.minWidth = v;
  714. }
  715. static function set_minHeight( o : h2d.Flow, v ) {
  716. o.minHeight = v;
  717. }
  718. static function set_width( o : h2d.Flow, v ) {
  719. o.minWidth = o.maxWidth = v;
  720. }
  721. static function set_height( o : h2d.Flow, v ) {
  722. o.minHeight = o.maxHeight = v;
  723. }
  724. static function set_contentValign( o : h2d.Flow, a ) {
  725. o.verticalAlign = a;
  726. }
  727. static function set_contentHalign( o : h2d.Flow, a ) {
  728. o.horizontalAlign = a;
  729. }
  730. static function set_contentAlign( o : h2d.Flow, v ) {
  731. if( v == null ) {
  732. o.horizontalAlign = o.verticalAlign = null;
  733. } else {
  734. o.horizontalAlign = v.h;
  735. o.verticalAlign = v.v;
  736. }
  737. }
  738. static function set_background( o : h2d.Flow, v ) {
  739. if( v == null ) {
  740. o.backgroundTile = null;
  741. o.borderWidth = o.borderHeight = 0;
  742. } else {
  743. o.backgroundTile = v.tile;
  744. o.borderLeft = v.borderL;
  745. o.borderTop = v.borderT;
  746. o.borderRight = v.borderR;
  747. o.borderBottom = v.borderB;
  748. }
  749. }
  750. static function set_backgroundTile( o : h2d.Flow, t ) {
  751. o.backgroundTile = t;
  752. }
  753. static function set_backgroundTilePos( o : h2d.Flow, pos ) {
  754. o.backgroundTile = @:privateAccess BitmapComp.setTilePos(o.backgroundTile, pos);
  755. }
  756. static function set_backgroundTilePosX( o : h2d.Flow, x ) {
  757. o.backgroundTile = @:privateAccess BitmapComp.setTilePosX(o.backgroundTile, x);
  758. }
  759. static function set_backgroundTilePosY( o : h2d.Flow, y ) {
  760. o.backgroundTile = @:privateAccess BitmapComp.setTilePosY(o.backgroundTile, y);
  761. }
  762. static function set_backgroundId( o : h2d.Flow, id : Bool ) {
  763. if( o.backgroundTile == null ) {
  764. if( !id ) return;
  765. o.backgroundTile = h2d.Tile.fromColor(0xFFFFFF,1,1,0);
  766. }
  767. var bg = @:privateAccess o.background;
  768. if( (bg.dom != null) != id )
  769. bg.dom = id ? domkit.Properties.create("scale-grid",bg,{ id : "background" }) : null;
  770. }
  771. static function set_backgroundAlpha( o : h2d.Flow, v ) {
  772. var bg = @:privateAccess o.background;
  773. if(bg == null)
  774. return;
  775. bg.alpha = v;
  776. }
  777. static function set_backgroundSmooth( o : h2d.Flow, v : Null<Bool> ) {
  778. var bg = @:privateAccess o.background;
  779. if(bg == null)
  780. return;
  781. bg.smooth = v;
  782. }
  783. static function set_cursor( o : h2d.Flow, c ) {
  784. if( o.interactive == null ) o.enableInteractive = true;
  785. o.interactive.cursor = c;
  786. }
  787. static function set_propagate( o : h2d.Flow, b : Bool ) {
  788. if( o.interactive == null ) o.enableInteractive = true;
  789. o.interactive.propagateEvents = b;
  790. if( b ) o.interactive.cursor = null else if( o.interactive.cursor == null ) o.interactive.cursor = Default;
  791. }
  792. static function set_padding( o : h2d.Flow, v ) {
  793. if( v == null ) {
  794. o.padding = 0;
  795. } else {
  796. o.paddingLeft = v.left;
  797. o.paddingRight = v.right;
  798. o.paddingTop = v.top;
  799. o.paddingBottom = v.bottom;
  800. }
  801. }
  802. static function set_layout( o : h2d.Flow, v ) {
  803. o.layout = v;
  804. }
  805. static function set_inlineBlock( o : h2d.Flow, v ) {
  806. o.isInline = !v;
  807. }
  808. static function set_vertical( o : h2d.Flow, v ) {
  809. o.layout = v ? Vertical : Horizontal;
  810. }
  811. static function set_horizontal( o : h2d.Flow, v ) {
  812. o.layout = Horizontal; // setting false resets to default
  813. }
  814. static function set_stack( o : h2d.Flow, v ) {
  815. o.layout = v ? Stack : Horizontal;
  816. }
  817. static function set_hspacing( o : h2d.Flow, v ) {
  818. o.horizontalSpacing = v;
  819. }
  820. static function set_vspacing( o : h2d.Flow, v) {
  821. o.verticalSpacing = v;
  822. }
  823. static function set_spacing( o : h2d.Flow, v ) {
  824. if(v == null) {
  825. o.horizontalSpacing = o.verticalSpacing = 0;
  826. }
  827. else {
  828. o.horizontalSpacing = Std.int(v.x);
  829. o.verticalSpacing = Std.int(v.y);
  830. }
  831. }
  832. static function set_fillWidth( o : h2d.Flow, v ) {
  833. o.fillWidth = v;
  834. }
  835. static function set_fillHeight( o : h2d.Flow, v ) {
  836. o.fillHeight = v;
  837. }
  838. static function set_overflow( o : h2d.Flow, v ) {
  839. o.overflow = v;
  840. if( v == Scroll ) @:privateAccess {
  841. if( o.scrollBar.dom == null ) {
  842. o.scrollBar.dom = domkit.Properties.create("flow", o.scrollBar);
  843. o.scrollBar.dom.addClass("scrollbar");
  844. }
  845. if( o.scrollBarCursor.dom == null ) {
  846. o.scrollBarCursor.dom = domkit.Properties.create("flow", o.scrollBarCursor);
  847. o.scrollBarCursor.dom.addClass("cursor");
  848. }
  849. }
  850. }
  851. static function set_scrollWheelSpeed( o : h2d.Flow, v ) {
  852. o.scrollWheelSpeed = v;
  853. }
  854. static function set_reverse( o : h2d.Flow, v ) {
  855. o.reverse = v;
  856. }
  857. }
  858. @:uiComp("input") @:domkitDecl
  859. class InputComp extends TextComp implements domkit.Component.ComponentDecl<h2d.TextInput> {
  860. @:p(auto) var width : Null<Int>;
  861. @:p(tile) var cursor : h2d.Tile;
  862. @:p(tile) var selection : h2d.Tile;
  863. @:p var edit : Bool;
  864. @:p(color) @:t(color) var backgroundColor : Null<Int>;
  865. static function create( parent : h2d.Object ) {
  866. return new h2d.TextInput(hxd.res.DefaultFont.get(),parent);
  867. }
  868. static function set_width( o : h2d.TextInput, v ) {
  869. o.inputWidth = v;
  870. }
  871. static function set_cursor( o : h2d.TextInput, t ) {
  872. o.cursorTile = t;
  873. }
  874. static function set_selection( o : h2d.TextInput, t ) {
  875. o.selectionTile = t;
  876. }
  877. static function set_edit( o : h2d.TextInput, b ) {
  878. o.canEdit = b;
  879. }
  880. static function set_backgroundColor( o : h2d.TextInput, col ) {
  881. o.backgroundColor = col;
  882. }
  883. }
  884. #end