Text.hx 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. package hrt.prefab.l2d;
  2. class Text extends Object2D {
  3. // parameters
  4. @:s var color : Int = 0xFFFFFF;
  5. @:s var size : Int = 12;
  6. @:s var cutoff : Float = 0.5;
  7. @:s var smoothing : Float = 1 / 32;
  8. @:s var align : Int = 0;
  9. @:s var pathFont : String;
  10. // TextShadow
  11. @:s var enableTextShadow : Bool = false;
  12. @:s var tsDx: Float = 0;
  13. @:s var tsDy: Float = 0;
  14. @:s var tsColor: Int;
  15. @:s var tsAlpha: Float = 1;
  16. // DropShadow
  17. @:s var enableDropShadow : Bool = false;
  18. @:s var dsDistance: Float = 0;
  19. @:s var dsAngle: Float = 0;
  20. @:s var dsColor: Int;
  21. @:s var dsAlpha: Float = 1;
  22. @:s var dsRadius: Float = 0;
  23. @:s var dsGain: Float = 1;
  24. @:s var dsQuality: Float = 1;
  25. @:s var dsSmoothColor: Bool = true;
  26. #if editor
  27. @:s var text : String = "";
  28. #end
  29. override public function load(v:Dynamic) {
  30. super.load(v);
  31. if( v.blendMode == null )
  32. blendMode = Alpha;
  33. }
  34. override function updateInstance( ctx: Context, ?propName : String ) {
  35. super.updateInstance(ctx, propName);
  36. var h2dText = (cast ctx.local2d : h2d.HtmlText);
  37. h2dText.visible = visible;
  38. h2dText.color = h3d.Vector.fromColor(color);
  39. h2dText.color.w = 1;
  40. if (enableTextShadow) {
  41. h2dText.dropShadow = {
  42. dx: tsDx,
  43. dy: tsDy,
  44. color: tsColor,
  45. alpha: tsAlpha
  46. };
  47. } else {
  48. h2dText.dropShadow = null;
  49. }
  50. if (enableDropShadow) {
  51. h2dText.filter = new h2d.filter.DropShadow(
  52. dsDistance,
  53. dsAngle,
  54. dsColor,
  55. dsAlpha,
  56. dsRadius,
  57. dsGain,
  58. dsQuality,
  59. dsSmoothColor
  60. );
  61. } else
  62. h2dText.filter = null;
  63. h2dText.textAlign = switch (align) {
  64. case 1:
  65. Center;
  66. case 2:
  67. Right;
  68. default:
  69. Left;
  70. }
  71. var font = loadFont();
  72. if (font != null)
  73. h2dText.font = font;
  74. #if editor
  75. if (propName == null || propName == "text") {
  76. h2dText.text = text;
  77. }
  78. var int = Std.downcast(h2dText.getChildAt(0),h2d.Interactive);
  79. if( int != null ) {
  80. @:privateAccess {
  81. h2dText.rebuild();
  82. int.width = h2dText.calcWidth;
  83. int.height = h2dText.calcHeight;
  84. switch (h2dText.textAlign) {
  85. case Center:
  86. int.x = -int.width/2;
  87. case Right:
  88. int.x = -int.width;
  89. default:
  90. int.x = 0;
  91. }
  92. }
  93. }
  94. #end
  95. }
  96. override function makeInstance(ctx:Context):Context {
  97. ctx = ctx.clone(this);
  98. var h2dText = new h2d.HtmlText(hxd.res.DefaultFont.get(), ctx.local2d);
  99. h2dText.text = "";
  100. h2dText.smooth = true;
  101. ctx.local2d = h2dText;
  102. ctx.local2d.name = name;
  103. updateInstance(ctx);
  104. return ctx;
  105. }
  106. public dynamic function loadFont() : h2d.Font {
  107. var f = defaultLoadFont(pathFont, size, cutoff, smoothing);
  108. if (f == null) {
  109. if (pathFont != null && pathFont.length > 0) {
  110. var font = hxd.res.Loader.currentInstance.load(pathFont).to(hxd.res.BitmapFont);
  111. return font.toSdfFont(size, MultiChannel, cutoff, smoothing);
  112. } else {
  113. return null;
  114. }
  115. }
  116. else return f;
  117. }
  118. public static dynamic function defaultLoadFont( pathFont : String, size : Int, cutoff : Float, smoothing : Float ) : h2d.Font {
  119. return null;
  120. }
  121. #if editor
  122. override function makeInteractive(ctx:Context):h2d.Interactive {
  123. var local2d = ctx.local2d;
  124. if(local2d == null)
  125. return null;
  126. var text = cast(local2d, h2d.Text);
  127. @:privateAccess { text.rebuild(); text.updateSize(); }
  128. @:privateAccess var int = new h2d.Interactive(text.calcWidth, text.calcHeight);
  129. text.addChildAt(int, 0);
  130. int.propagateEvents = true;
  131. return int;
  132. }
  133. override function edit( ctx : EditContext ) {
  134. super.edit(ctx);
  135. var parameters = new hide.Element('<div class="group" name="Parameters"></div>');
  136. var gr = new hide.Element('<dl></dl>').appendTo(parameters);
  137. new hide.Element('<dt>Align</dt>').appendTo(gr);
  138. var element = new hide.Element('<dd></dd>').appendTo(gr);
  139. var leftAlign = new hide.Element('<input type="button" style="width: 50px" value="Left" /> ').appendTo(element);
  140. var middleAlign = new hide.Element('<input type="button" style="width: 50px" value="Center" /> ').appendTo(element);
  141. var rightAlign = new hide.Element('<input type="button" style="width: 50px" value="Right" /> ').appendTo(element);
  142. inline function updateDisabled() {
  143. leftAlign.removeAttr("disabled");
  144. middleAlign.removeAttr("disabled");
  145. rightAlign.removeAttr("disabled");
  146. switch (align) {
  147. case 1:
  148. middleAlign.attr("disabled", "true");
  149. case 2:
  150. rightAlign.attr("disabled", "true");
  151. default:
  152. leftAlign.attr("disabled", "true");
  153. }
  154. }
  155. leftAlign.on("click", function(e) {
  156. align = 0;
  157. updateDisabled();
  158. updateInstance(ctx.getContext(this), "align");
  159. });
  160. middleAlign.on("click", function(e) {
  161. align = 1;
  162. updateDisabled();
  163. updateInstance(ctx.getContext(this), "align");
  164. });
  165. rightAlign.on("click", function(e) {
  166. align = 2;
  167. updateDisabled();
  168. updateInstance(ctx.getContext(this), "align");
  169. });
  170. updateDisabled();
  171. new hide.Element('<dt>Font</dt>').appendTo(gr);
  172. var element = new hide.Element('<dd></dd>').appendTo(gr);
  173. var fileInput = new hide.Element('<input type="text" field="pathFont" style="width:165px" />').appendTo(element);
  174. var tfile = new hide.comp.FileSelect(["fnt"], null, fileInput);
  175. if (this.pathFont != null && this.pathFont.length > 0) tfile.path = this.pathFont;
  176. tfile.onChange = function() {
  177. this.pathFont = tfile.path;
  178. updateInstance(ctx.getContext(this), "src");
  179. }
  180. new hide.Element('<dt>Color</dt><dd><input type="color" field="color" /></dd>').appendTo(gr);
  181. new hide.Element('<dt>Size</dt><dd><input type="range" min="1" max="50" step="1" field="size" /></dd>').appendTo(gr);
  182. new hide.Element('<dt>Cutoff</dt><dd><input type="range" min="0" max="1" field="cutoff" /></dd>').appendTo(gr);
  183. new hide.Element('<dt>Smoothing</dt><dd><input type="range" min="0" max="1" field="smoothing" /></dd>').appendTo(gr);
  184. ctx.properties.add(parameters, this, function(pname) {
  185. ctx.onChange(this, pname);
  186. });
  187. ctx.properties.add(new hide.Element('<div class="group" name="Text Shadow (double render)">
  188. <dl>
  189. <dt>Enable</dt><dd><input type="checkbox" field="enableTextShadow" /></dd><br />
  190. <dt>DX</dt><dd><input type="range" min="-50" max="50" step="1" field="tsDx" /></dd>
  191. <dt>DY</dt><dd><input type="range" min="-50" max="50" step="1" field="tsDy" /></dd>
  192. <dt>Color</dt><dd><input type="color" field="tsColor" /></dd>
  193. <dt>Alpha</dt><dd><input type="range" min="0" max="1" step="0.01" field="tsAlpha" /></dd>
  194. </dl></div>'), this, function(pname) {
  195. ctx.onChange(this, pname);
  196. });
  197. ctx.properties.add(new hide.Element('<div class="group" name="Drop Shadow">
  198. <dl>
  199. <dt>Enable</dt><dd><input type="checkbox" field="enableDropShadow" /></dd><br />
  200. <dt>Distance</dt><dd><input type="range" min="-50" max="50" step="1" field="dsDistance" /></dd>
  201. <dt>Angle</dt><dd><input type="range" min="-1.571" max="1.571" step="0.0524" field="dsAngle" /></dd>
  202. <dt>Color</dt><dd><input type="color" field="dsColor" /></dd>
  203. <dt>Alpha</dt><dd><input type="range" min="0" max="1" step="0.01" field="dsAlpha" /></dd>
  204. <dt>Radius</dt><dd><input type="range" min="0" max="50" step="1" field="dsRadius" /></dd>
  205. <dt>Gain</dt><dd><input type="range" min="0.1" max="50" step="0.1" field="dsGain" /></dd>
  206. <dt>Quality</dt><dd><input type="range" min="0" max="1" step="0.01" field="dsQuality" /></dd>
  207. <dt>Smooth Color</dt><dd><input type="checkbox" field="dsSmoothColor" /></dd>
  208. </dl></div>'), this, function(pname) {
  209. ctx.onChange(this, pname);
  210. });
  211. ctx.properties.add(new hide.Element('<div class="group" name="Responsive">
  212. <dl>
  213. <dt>Text</dt><dd><input type="text" field="text" /></dd>
  214. </dl></div>'), this, function(pname) {
  215. ctx.onChange(this, pname);
  216. });
  217. }
  218. override function getHideProps() : HideProps {
  219. return { icon : "square", name : "Text" };
  220. }
  221. #end
  222. static var _ = Library.register("text", Text);
  223. }