BaseComponents.hx 34 KB

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