BaseComponents.hx 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072
  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.Vector4, v2 : h3d.Vector4, t : Float ) : h3d.Vector4 {
  41. var v = new h3d.Vector4();
  42. v.lerp(v1,v2,t);
  43. return v;
  44. }
  45. function parseColorF( v : CssValue ) : h3d.Vector4 {
  46. var f = new h3d.Vector4();
  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 transitionColorAdjust(col1: h3d.Matrix.ColorAdjust, col2: h3d.Matrix.ColorAdjust, t: Float) {
  330. inline function defaultValues(col: h3d.Matrix.ColorAdjust) {
  331. var c : h3d.Matrix.ColorAdjust = { saturation: 0, lightness: 0, hue: 0, contrast: 0, gain: { color: 0, alpha: 0 } };
  332. if (col != null) {
  333. if (col.saturation != null) c.saturation = col.saturation;
  334. if (col.lightness != null) c.lightness = col.lightness;
  335. if (col.hue != null) c.hue = col.hue;
  336. if (col.contrast != null) c.contrast = col.contrast;
  337. if (col.gain != null) c.gain = col.gain;
  338. }
  339. return c;
  340. }
  341. var col1 = defaultValues(col1);
  342. var col2 = defaultValues(col2);
  343. return {
  344. saturation: hxd.Math.lerp(col1.saturation, col2.saturation, t),
  345. lightness: hxd.Math.lerp(col1.lightness, col2.lightness, t),
  346. hue: hxd.Math.lerp(col1.hue, col2.hue, t),
  347. contrast: hxd.Math.lerp(col1.contrast, col2.contrast, t),
  348. gain: {
  349. color: transitionColor(col1.gain.color, col2.gain.color, t),
  350. alpha: hxd.Math.lerp(col1.gain.alpha, col2.gain.alpha, t)
  351. }
  352. };
  353. }
  354. public function parseColorAdjust(value:CssValue) : h3d.Matrix.ColorAdjust {
  355. if( value.match(VIdent("none")) )
  356. return null;
  357. var adj : h3d.Matrix.ColorAdjust = {};
  358. inline function parseVal(vcall: CssValue) {
  359. switch(vcall) {
  360. case VCall("hue-rotate", [v]):
  361. adj.hue = parseFloat(v) * Math.PI / 180;
  362. case VCall("contrast", [v]):
  363. adj.contrast = parseFloat(v);
  364. case VCall("gain", [c, a]):
  365. adj.gain = { color : parseColor(c), alpha : parseFloat(a) };
  366. case VCall("brightness",[v]):
  367. adj.lightness = parseFloat(v);
  368. case VCall("saturate",[v]):
  369. adj.saturation = parseFloat(v);
  370. default:
  371. invalidProp();
  372. }
  373. }
  374. switch( value ) {
  375. case VGroup(vcalls):
  376. for(vcall in vcalls)
  377. parseVal(vcall);
  378. case VCall(_):
  379. parseVal(value);
  380. default:
  381. invalidProp();
  382. }
  383. return adj;
  384. }
  385. }
  386. #if !macro
  387. @:uiComp("object") @:domkitDecl
  388. class ObjectComp implements h2d.domkit.Object implements domkit.Component.ComponentDecl<h2d.Object> {
  389. @:p var x : Float;
  390. @:p var y : Float;
  391. @:p var alpha : Float = 1;
  392. @:p var rotation : Float;
  393. @:p var visible : Bool = true;
  394. @:p(scale) var scale : { x : Float, y : Float };
  395. @:p var scaleX : Float;
  396. @:p var scaleY : Float;
  397. @:p var blend : h2d.BlendMode = Alpha;
  398. @:p(filter) var filter : h2d.filter.Filter;
  399. @:p var filterSmooth : Bool;
  400. // flow properties
  401. @:p(box) var margin : { left : Int, top : Int, right : Int, bottom : Int };
  402. @:p var marginLeft = 0;
  403. @:p var marginRight = 0;
  404. @:p var marginTop = 0;
  405. @:p var marginBottom = 0;
  406. @:p(align) var align : { v : h2d.Flow.FlowAlign, h : h2d.Flow.FlowAlign };
  407. @:p(hAlign) var halign : h2d.Flow.FlowAlign;
  408. @:p(vAlign) var valign : h2d.Flow.FlowAlign;
  409. @:p(position) var position : Bool;
  410. @:p(XY) var offset : { x : Float, y : Float };
  411. @:p var offsetX : Int;
  412. @:p var offsetY : Int;
  413. @:p(none) var minWidth : Null<Int>;
  414. @:p(none) var minHeight : Null<Int>;
  415. @:p var forceLineBreak : Bool;
  416. @:p(none) var autoSize : Null<Float>;
  417. @:p(none) var autoSizeWidth : Null<Float>;
  418. @:p(none) var autoSizeHeight : Null<Float>;
  419. static function set_rotation(o:h2d.Object, v:Float) {
  420. o.rotation = v * Math.PI / 180;
  421. }
  422. static function set_visible(o:h2d.Object, v:Bool) {
  423. o.visible = v;
  424. }
  425. static function set_scale(o:h2d.Object,v) {
  426. if(v != null) {
  427. o.scaleX = v.x;
  428. o.scaleY = v.y;
  429. }
  430. else {
  431. o.setScale(1);
  432. }
  433. }
  434. static function set_filter(o:h2d.Object, f:h2d.filter.Filter) {
  435. o.filter = f;
  436. }
  437. static function set_filterSmooth(o:h2d.Object, b:Bool) {
  438. if( o.filter != null ) o.filter.smooth = b;
  439. }
  440. static function set_blend(o:h2d.Object, b:h2d.BlendMode) {
  441. o.blendMode = b;
  442. }
  443. static function getFlowProps( o : h2d.Object ) {
  444. var p = Std.downcast(o.parent, h2d.Flow);
  445. return p == null ? null : p.getProperties(o);
  446. }
  447. static function set_margin(o:h2d.Object,v) {
  448. var p = getFlowProps(o);
  449. if( p != null ) {
  450. if( v == null )
  451. p.paddingLeft = p.paddingRight = p.paddingTop = p.paddingBottom = 0;
  452. else {
  453. p.paddingLeft = v.left;
  454. p.paddingRight = v.right;
  455. p.paddingTop = v.top;
  456. p.paddingBottom = v.bottom;
  457. }
  458. }
  459. }
  460. static function set_marginLeft(o:h2d.Object,v) {
  461. var p = getFlowProps(o);
  462. if( p != null ) p.paddingLeft = v;
  463. }
  464. static function set_marginRight(o:h2d.Object,v) {
  465. var p = getFlowProps(o);
  466. if( p != null ) p.paddingRight = v;
  467. }
  468. static function set_marginTop(o:h2d.Object,v) {
  469. var p = getFlowProps(o);
  470. if( p != null ) p.paddingTop = v;
  471. }
  472. static function set_marginBottom(o:h2d.Object,v) {
  473. var p = getFlowProps(o);
  474. if( p != null ) p.paddingBottom = v;
  475. }
  476. static function set_align(o:h2d.Object,v) {
  477. var p = getFlowProps(o);
  478. if( p != null ) {
  479. p.horizontalAlign = v == null ? null : v.h;
  480. p.verticalAlign = v == null ? null : v.v;
  481. }
  482. }
  483. static function set_halign(o:h2d.Object,v) {
  484. var p = getFlowProps(o);
  485. if( p != null ) p.horizontalAlign = v;
  486. }
  487. static function set_valign(o:h2d.Object,v) {
  488. var p = getFlowProps(o);
  489. if( p != null ) p.verticalAlign = v;
  490. }
  491. static function set_position(o:h2d.Object,v) {
  492. var p = getFlowProps(o);
  493. if( p != null ) p.isAbsolute = v;
  494. }
  495. static function set_offset(o:h2d.Object,v) {
  496. var p = getFlowProps(o);
  497. if( p != null ) {
  498. p.offsetX = v == null ? 0 : Std.int(v.x);
  499. p.offsetY = v == null ? 0 : Std.int(v.y);
  500. }
  501. }
  502. static function set_offsetX(o:h2d.Object,v) {
  503. var p = getFlowProps(o);
  504. if( p != null ) p.offsetX = v;
  505. }
  506. static function set_offsetY(o:h2d.Object,v) {
  507. var p = getFlowProps(o);
  508. if( p != null ) p.offsetY = v;
  509. }
  510. static function set_minWidth(o:h2d.Object,v) {
  511. var p = getFlowProps(o);
  512. if( p != null ) p.minWidth = v;
  513. }
  514. static function set_minHeight(o:h2d.Object,v) {
  515. var p = getFlowProps(o);
  516. if( p != null ) p.minHeight = v;
  517. }
  518. static function set_autoSize(o:h2d.Object,v) {
  519. var p = getFlowProps(o);
  520. if( p != null ) {
  521. p.autoSizeWidth = v;
  522. p.autoSizeHeight = v;
  523. }
  524. }
  525. static function set_autoSizeWidth(o:h2d.Object,v) {
  526. var p = getFlowProps(o);
  527. if( p != null ) p.autoSizeWidth = v;
  528. }
  529. static function set_autoSizeHeight(o:h2d.Object,v) {
  530. var p = getFlowProps(o);
  531. if( p != null ) p.autoSizeHeight = v;
  532. }
  533. static function set_forceLineBreak(o:h2d.Object,v) {
  534. var p = getFlowProps(o);
  535. if( p != null ) p.lineBreak = v;
  536. }
  537. static function updateComponentId(p:domkit.Properties<Dynamic>) {
  538. cast(p.obj,h2d.Object).name = p.id.toString();
  539. }
  540. @:keep static var _ = { @:privateAccess domkit.Properties.updateComponentId = updateComponentId; true; }
  541. }
  542. @:uiComp("drawable") @:domkitDecl
  543. class DrawableComp extends ObjectComp implements domkit.Component.ComponentDecl<h2d.Drawable> {
  544. @:p(colorF) @:t(colorF) #if domkit_drawable_color var color #else var tint #end : h3d.Vector4;
  545. @:p(auto) var smooth : Null<Bool>;
  546. @:p(colorAdjust) @:t(colorAdjust) var colorAdjust : Null<h3d.Matrix.ColorAdjust>;
  547. @:p var tileWrap : Bool;
  548. static function #if domkit_drawable_color set_color #else set_tint #end( o : h2d.Drawable, v ) {
  549. if(v != null)
  550. o.color.load(v);
  551. else
  552. o.color.set(1,1,1);
  553. }
  554. static function set_colorAdjust( o : h2d.Drawable, v ) {
  555. o.adjustColor(v);
  556. }
  557. }
  558. @:uiComp("mask") @:domkitDecl
  559. class MaskComp extends ObjectComp implements domkit.Component.ComponentDecl<h2d.Mask> {
  560. @:p var width : Int;
  561. @:p var height : Int;
  562. static function create( parent : h2d.Object ) {
  563. return new h2d.Mask(0,0,parent);
  564. }
  565. }
  566. @:uiComp("video") @:domkitDecl
  567. class VideoComp extends DrawableComp implements domkit.Component.ComponentDecl<h2d.Video> {
  568. @:p(resource) var src : hxd.res.Any;
  569. @:p var loop : Bool;
  570. static function create( parent : h2d.Object ) {
  571. return new h2d.Video(parent);
  572. }
  573. static function set_src( o : h2d.Video, v ) {
  574. o.loadResource(v);
  575. }
  576. static function set_loop( o : h2d.Video, v ) {
  577. o.loop = v;
  578. }
  579. }
  580. @:uiComp("bitmap") @:domkitDecl
  581. class BitmapComp extends DrawableComp implements domkit.Component.ComponentDecl<h2d.Bitmap> {
  582. @:p(tile) var src : h2d.Tile;
  583. @:p(tilePos) var srcPos : { p : Int, ?y : Int };
  584. @:p var srcPosX : Null<Int>;
  585. @:p var srcPosY : Null<Int>;
  586. @:p(auto) var width : Null<Float>;
  587. @:p(auto) var height : Null<Float>;
  588. static function create( parent : h2d.Object ) {
  589. return new h2d.Bitmap(h2d.Tile.fromColor(0xFF00FF,32,32,0.9),parent);
  590. }
  591. static function set_src( o : h2d.Bitmap, t ) {
  592. o.tile = t == null ? h2d.Tile.fromColor(0xFF00FF,32,32,0.9) : t;
  593. }
  594. static function set_srcPos( o : h2d.Bitmap, pos ) {
  595. o.tile = setTilePos(o.tile, pos);
  596. }
  597. static function set_srcPosX( o : h2d.Bitmap, x : Int ) {
  598. o.tile = setTilePosX(o.tile, x);
  599. }
  600. static function set_srcPosY( o : h2d.Bitmap, y: Int ) {
  601. o.tile = setTilePosY(o.tile, y);
  602. }
  603. static function setTilePos( t : h2d.Tile, pos : Null<{ p : Int, ?y : Int }> ) {
  604. if( t == null ) return null;
  605. if( pos == null ) pos = {p:0};
  606. var tex = t.getTexture();
  607. t = t.clone();
  608. if( pos.y == null && t.iwidth == tex.width )
  609. t.setPosition(0, pos.p * t.iheight);
  610. else
  611. t.setPosition(pos.p * t.iwidth, pos.y * t.iheight);
  612. return t;
  613. }
  614. static function setTilePosX( t : h2d.Tile, x : Int ) {
  615. if( t == null ) return null;
  616. t = t.clone();
  617. t.setPosition(x * t.iwidth, t.iy);
  618. return t;
  619. }
  620. static function setTilePosY( t : h2d.Tile, y : Int ) {
  621. if( t == null ) return null;
  622. t = t.clone();
  623. t.setPosition(t.ix, y * t.iheight);
  624. return t;
  625. }
  626. static function set_width( o : h2d.Bitmap, v : Null<Float> ) {
  627. o.width = v;
  628. }
  629. static function set_height( o : h2d.Bitmap, v : Null<Float> ) {
  630. o.height = v;
  631. }
  632. }
  633. @:uiComp("text") @:domkitDecl
  634. class TextComp extends DrawableComp implements domkit.Component.ComponentDecl<h2d.Text> {
  635. @:p var text : String = "";
  636. @:p(font) var font : h2d.Font;
  637. @:p var letterSpacing = 0;
  638. @:p var lineSpacing = 0;
  639. @:p var lineBreak : Bool;
  640. @:p(none) var maxWidth : Null<Int>;
  641. @:p var textAlign : h2d.Text.Align = Left;
  642. @:p(textShadow) var textShadow : { dx : Float, dy : Float, color : Int, alpha : Float };
  643. @:p(color) @:t(color) var #if domkit_drawable_color textColor #else color #end : Null<Int>;
  644. static function create( parent : h2d.Object ) {
  645. return new h2d.Text(hxd.res.DefaultFont.get(),parent);
  646. }
  647. static function set_font( t : h2d.Text, v ) {
  648. t.font = v == null ? hxd.res.DefaultFont.get() : v;
  649. }
  650. static function set_textShadow( t : h2d.Text, v ) {
  651. t.dropShadow = v;
  652. }
  653. static function set_lineBreak( t : h2d.Text, v ) {
  654. t.lineBreak = v;
  655. }
  656. #if !domkit_drawable_color
  657. static function set_color( t : h2d.Text, v : Null<Int> ) {
  658. t.textColor = v == null ? -1 : v;
  659. }
  660. #end
  661. }
  662. @:uiComp("html-text") @:domkitDecl
  663. class HtmlTextComp extends TextComp implements domkit.Component.ComponentDecl<h2d.HtmlText> {
  664. @:p var condenseWhite : Bool;
  665. @:p var propagateInteractiveNode: Bool;
  666. static function create( parent : h2d.Object ) {
  667. return new h2d.HtmlText(hxd.res.DefaultFont.get(),parent);
  668. }
  669. static function set_condenseWhite(o : h2d.HtmlText, v) {
  670. o.condenseWhite = v;
  671. }
  672. static function set_propagateInteractiveNode(o : h2d.HtmlText, v) {
  673. o.propagateInteractiveNode = v;
  674. }
  675. }
  676. @:uiComp("scale-grid") @:domkitDecl
  677. class ScaleGridComp extends DrawableComp implements domkit.Component.ComponentDecl<h2d.ScaleGrid> {
  678. @:p var ignoreScale : Bool;
  679. @:p var borderScale : Float;
  680. @:p var tileBorders : Bool;
  681. @:p var tileCenter : Bool;
  682. @:p var width : Float;
  683. @:p var height : Float;
  684. static function create( parent : h2d.Object ) {
  685. return new h2d.ScaleGrid(h2d.Tile.fromColor(0xFF00FF,32,32,0.9), 0, 0,parent);
  686. }
  687. static function set_ignoreScale(o : h2d.ScaleGrid, v) {
  688. o.ignoreScale = v;
  689. }
  690. static function set_borderScale(o : h2d.ScaleGrid, v) {
  691. o.borderScale = v;
  692. }
  693. static function set_tileBorders(o : h2d.ScaleGrid, v) {
  694. o.tileBorders = v;
  695. }
  696. static function set_tileCenter(o : h2d.ScaleGrid, v) {
  697. o.tileCenter = v;
  698. }
  699. static function set_width( o : h2d.ScaleGrid, v : Float ) {
  700. o.width = v;
  701. }
  702. static function set_height( o : h2d.ScaleGrid, v : Float ) {
  703. o.height = v;
  704. }
  705. }
  706. @:uiComp("flow") @:domkitDecl
  707. class FlowComp extends ObjectComp implements domkit.Component.ComponentDecl<h2d.Flow> {
  708. @:p(auto) var width : Null<Int>;
  709. @:p(auto) var height : Null<Int>;
  710. @:p var maxWidth : Null<Int>;
  711. @:p var maxHeight : Null<Int>;
  712. @:p var backgroundId : Bool;
  713. @:p(flowBackground) @:t(flowBackground) var background : FlowBg;
  714. @:p(tile) var backgroundTile : h2d.Tile;
  715. @:p(tilePos) var backgroundTilePos : { p : Int, y : Int };
  716. @:p var backgroundTilePosX : Null<Int>;
  717. @:p var backgroundTilePosY : Null<Int>;
  718. @:p var backgroundAlpha : Float = 1;
  719. @:p(auto) var backgroundSmooth : Null<Bool>;
  720. @:p var backgroundRepeat : Bool;
  721. @:p var debug : Bool;
  722. @:p var layout : h2d.Flow.FlowLayout;
  723. @:p var vertical : Bool;
  724. @:p var horizontal : Bool;
  725. @:p var stack : Bool;
  726. @:p var multiline : Bool;
  727. @:p(box) var padding : { left : Int, right : Int, top : Int, bottom : Int };
  728. @:p var paddingLeft : Int;
  729. @:p var paddingRight : Int;
  730. @:p var paddingTop : Int;
  731. @:p var paddingBottom : Int;
  732. @:p var hspacing : Int;
  733. @:p var vspacing : Int;
  734. @:p(dimension) var spacing : { x: Float, y: Float };
  735. @:p var fillWidth: Bool;
  736. @:p var fillHeight: Bool;
  737. @:p var overflow: h2d.Flow.FlowOverflow;
  738. @:p var scrollWheelSpeed: Float;
  739. @:p var reverse : Bool;
  740. @:p(align) var contentAlign : { h : h2d.Flow.FlowAlign, v : h2d.Flow.FlowAlign };
  741. @:p(vAlign) var contentValign : h2d.Flow.FlowAlign;
  742. @:p(hAlign) var contentHalign : h2d.Flow.FlowAlign;
  743. @:p(cursor) var cursor : hxd.Cursor;
  744. @:p var propagate : Bool;
  745. @:p var inlineBlock : Bool;
  746. static function set_minWidth( o : h2d.Flow, v ) {
  747. o.minWidth = v;
  748. }
  749. static function set_minHeight( o : h2d.Flow, v ) {
  750. o.minHeight = v;
  751. }
  752. static function set_width( o : h2d.Flow, v ) {
  753. o.minWidth = o.maxWidth = v;
  754. }
  755. static function set_height( o : h2d.Flow, v ) {
  756. o.minHeight = o.maxHeight = v;
  757. }
  758. static function set_contentValign( o : h2d.Flow, a ) {
  759. o.verticalAlign = a;
  760. }
  761. static function set_contentHalign( o : h2d.Flow, a ) {
  762. o.horizontalAlign = a;
  763. }
  764. static function set_contentAlign( o : h2d.Flow, v ) {
  765. if( v == null ) {
  766. o.horizontalAlign = o.verticalAlign = null;
  767. } else {
  768. o.horizontalAlign = v.h;
  769. o.verticalAlign = v.v;
  770. }
  771. }
  772. static function set_background( o : h2d.Flow, v ) {
  773. if( v == null ) {
  774. o.backgroundTile = null;
  775. o.borderWidth = o.borderHeight = 0;
  776. } else {
  777. o.backgroundTile = v.tile;
  778. o.borderLeft = v.borderL;
  779. o.borderTop = v.borderT;
  780. o.borderRight = v.borderR;
  781. o.borderBottom = v.borderB;
  782. }
  783. }
  784. static function set_backgroundTile( o : h2d.Flow, t ) {
  785. o.backgroundTile = t;
  786. }
  787. static function set_backgroundRepeat( o : h2d.Flow, v ) {
  788. @:privateAccess if( o.background != null )
  789. o.background.tileBorders = o.background.tileCenter = v;
  790. }
  791. static function set_backgroundTilePos( o : h2d.Flow, pos ) {
  792. o.backgroundTile = @:privateAccess BitmapComp.setTilePos(o.backgroundTile, pos);
  793. }
  794. static function set_backgroundTilePosX( o : h2d.Flow, x ) {
  795. o.backgroundTile = @:privateAccess BitmapComp.setTilePosX(o.backgroundTile, x);
  796. }
  797. static function set_backgroundTilePosY( o : h2d.Flow, y ) {
  798. o.backgroundTile = @:privateAccess BitmapComp.setTilePosY(o.backgroundTile, y);
  799. }
  800. static function set_backgroundId( o : h2d.Flow, id : Bool ) {
  801. if( o.backgroundTile == null ) {
  802. if( !id ) return;
  803. o.backgroundTile = h2d.Tile.fromColor(0xFFFFFF,1,1,0);
  804. }
  805. var bg = @:privateAccess o.background;
  806. if( (bg.dom != null) != id )
  807. bg.dom = id ? domkit.Properties.create("scale-grid",bg,{ id : "background" }) : null;
  808. }
  809. static function set_backgroundAlpha( o : h2d.Flow, v ) {
  810. var bg = @:privateAccess o.background;
  811. if(bg == null)
  812. return;
  813. bg.alpha = v;
  814. }
  815. static function set_backgroundSmooth( o : h2d.Flow, v : Null<Bool> ) {
  816. var bg = @:privateAccess o.background;
  817. if(bg == null)
  818. return;
  819. bg.smooth = v;
  820. }
  821. static function set_cursor( o : h2d.Flow, c ) {
  822. if( o.interactive == null ) o.enableInteractive = true;
  823. o.interactive.cursor = c;
  824. }
  825. static function set_propagate( o : h2d.Flow, b : Bool ) {
  826. if( o.interactive == null ) o.enableInteractive = true;
  827. o.interactive.propagateEvents = b;
  828. if( b ) o.interactive.cursor = null else if( o.interactive.cursor == null ) o.interactive.cursor = Default;
  829. }
  830. static function set_padding( o : h2d.Flow, v ) {
  831. if( v == null ) {
  832. o.padding = 0;
  833. } else {
  834. o.paddingLeft = v.left;
  835. o.paddingRight = v.right;
  836. o.paddingTop = v.top;
  837. o.paddingBottom = v.bottom;
  838. }
  839. }
  840. static function set_layout( o : h2d.Flow, v ) {
  841. o.layout = v;
  842. }
  843. static function set_inlineBlock( o : h2d.Flow, v ) {
  844. o.isInline = !v;
  845. }
  846. static function set_vertical( o : h2d.Flow, v ) {
  847. o.layout = v ? Vertical : Horizontal;
  848. }
  849. static function set_horizontal( o : h2d.Flow, v ) {
  850. o.layout = Horizontal; // setting false resets to default
  851. }
  852. static function set_stack( o : h2d.Flow, v ) {
  853. o.layout = v ? Stack : Horizontal;
  854. }
  855. static function set_hspacing( o : h2d.Flow, v ) {
  856. o.horizontalSpacing = v;
  857. }
  858. static function set_vspacing( o : h2d.Flow, v) {
  859. o.verticalSpacing = v;
  860. }
  861. static function set_spacing( o : h2d.Flow, v ) {
  862. if(v == null) {
  863. o.horizontalSpacing = o.verticalSpacing = 0;
  864. }
  865. else {
  866. o.horizontalSpacing = Std.int(v.x);
  867. o.verticalSpacing = Std.int(v.y);
  868. }
  869. }
  870. static function set_fillWidth( o : h2d.Flow, v ) {
  871. o.fillWidth = v;
  872. }
  873. static function set_fillHeight( o : h2d.Flow, v ) {
  874. o.fillHeight = v;
  875. }
  876. static function set_overflow( o : h2d.Flow, v ) {
  877. o.overflow = v;
  878. if( v == Scroll ) @:privateAccess {
  879. if( o.scrollBar.dom == null ) {
  880. o.scrollBar.dom = domkit.Properties.create("flow", o.scrollBar);
  881. o.scrollBar.dom.addClass("scrollbar");
  882. }
  883. if( o.scrollBarCursor.dom == null ) {
  884. o.scrollBarCursor.dom = domkit.Properties.create("flow", o.scrollBarCursor);
  885. o.scrollBarCursor.dom.addClass("cursor");
  886. }
  887. }
  888. }
  889. static function set_scrollWheelSpeed( o : h2d.Flow, v ) {
  890. o.scrollWheelSpeed = v;
  891. }
  892. static function set_reverse( o : h2d.Flow, v ) {
  893. o.reverse = v;
  894. }
  895. }
  896. @:uiComp("input") @:domkitDecl
  897. class InputComp extends TextComp implements domkit.Component.ComponentDecl<h2d.TextInput> {
  898. @:p(auto) var width : Null<Int>;
  899. @:p(tile) var cursor : h2d.Tile;
  900. @:p(tile) var selection : h2d.Tile;
  901. @:p var edit : Bool;
  902. @:p(color) @:t(color) var backgroundColor : Null<Int>;
  903. static function create( parent : h2d.Object ) {
  904. return new h2d.TextInput(hxd.res.DefaultFont.get(),parent);
  905. }
  906. static function set_width( o : h2d.TextInput, v ) {
  907. o.inputWidth = v;
  908. }
  909. static function set_cursor( o : h2d.TextInput, t ) {
  910. o.cursorTile = t;
  911. }
  912. static function set_selection( o : h2d.TextInput, t ) {
  913. o.selectionTile = t;
  914. }
  915. static function set_edit( o : h2d.TextInput, b ) {
  916. o.canEdit = b;
  917. }
  918. static function set_backgroundColor( o : h2d.TextInput, col ) {
  919. o.backgroundColor = col;
  920. }
  921. }
  922. #end