@babylonjs/gui 5.0.0-rc.5 → 5.0.0-rc.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/2D/adtInstrumentation.d.ts +52 -52
  2. package/2D/adtInstrumentation.js +126 -126
  3. package/2D/advancedDynamicTexture.d.ts +448 -448
  4. package/2D/advancedDynamicTexture.js +1318 -1318
  5. package/2D/controls/button.d.ts +135 -135
  6. package/2D/controls/button.js +276 -276
  7. package/2D/controls/checkbox.d.ts +59 -59
  8. package/2D/controls/checkbox.js +188 -188
  9. package/2D/controls/colorpicker.d.ts +103 -103
  10. package/2D/controls/colorpicker.js +1417 -1417
  11. package/2D/controls/container.d.ts +175 -175
  12. package/2D/controls/container.js +570 -570
  13. package/2D/controls/control.d.ts +866 -866
  14. package/2D/controls/control.js +2433 -2433
  15. package/2D/controls/displayGrid.d.ts +53 -53
  16. package/2D/controls/displayGrid.js +245 -245
  17. package/2D/controls/ellipse.d.ts +21 -21
  18. package/2D/controls/ellipse.js +85 -85
  19. package/2D/controls/focusableButton.d.ts +59 -59
  20. package/2D/controls/focusableButton.js +99 -99
  21. package/2D/controls/focusableControl.d.ts +34 -34
  22. package/2D/controls/focusableControl.js +1 -1
  23. package/2D/controls/grid.d.ts +139 -139
  24. package/2D/controls/grid.js +529 -529
  25. package/2D/controls/image.d.ts +204 -204
  26. package/2D/controls/image.js +887 -887
  27. package/2D/controls/index.d.ts +29 -29
  28. package/2D/controls/index.js +29 -29
  29. package/2D/controls/inputPassword.d.ts +8 -8
  30. package/2D/controls/inputPassword.js +25 -25
  31. package/2D/controls/inputText.d.ts +201 -201
  32. package/2D/controls/inputText.js +1119 -1119
  33. package/2D/controls/line.d.ts +66 -66
  34. package/2D/controls/line.js +271 -271
  35. package/2D/controls/multiLine.d.ts +75 -75
  36. package/2D/controls/multiLine.js +262 -262
  37. package/2D/controls/radioButton.d.ts +49 -49
  38. package/2D/controls/radioButton.js +205 -205
  39. package/2D/controls/rectangle.d.ts +29 -29
  40. package/2D/controls/rectangle.js +150 -150
  41. package/2D/controls/scrollViewers/scrollViewer.d.ts +182 -182
  42. package/2D/controls/scrollViewers/scrollViewer.js +677 -677
  43. package/2D/controls/scrollViewers/scrollViewerWindow.d.ts +57 -57
  44. package/2D/controls/scrollViewers/scrollViewerWindow.js +278 -278
  45. package/2D/controls/selector.d.ts +263 -263
  46. package/2D/controls/selector.js +692 -692
  47. package/2D/controls/sliders/baseSlider.d.ts +82 -82
  48. package/2D/controls/sliders/baseSlider.js +347 -347
  49. package/2D/controls/sliders/imageBasedSlider.d.ts +49 -49
  50. package/2D/controls/sliders/imageBasedSlider.js +192 -192
  51. package/2D/controls/sliders/imageScrollBar.d.ts +65 -65
  52. package/2D/controls/sliders/imageScrollBar.js +263 -263
  53. package/2D/controls/sliders/scrollBar.d.ts +38 -38
  54. package/2D/controls/sliders/scrollBar.js +143 -143
  55. package/2D/controls/sliders/slider.d.ts +35 -35
  56. package/2D/controls/sliders/slider.js +271 -271
  57. package/2D/controls/stackPanel.d.ts +64 -64
  58. package/2D/controls/stackPanel.js +246 -246
  59. package/2D/controls/statics.d.ts +6 -6
  60. package/2D/controls/statics.js +49 -49
  61. package/2D/controls/textBlock.d.ts +175 -175
  62. package/2D/controls/textBlock.js +603 -603
  63. package/2D/controls/textWrapper.d.ts +13 -13
  64. package/2D/controls/textWrapper.js +101 -101
  65. package/2D/controls/toggleButton.d.ts +117 -117
  66. package/2D/controls/toggleButton.js +268 -268
  67. package/2D/controls/virtualKeyboard.d.ts +96 -96
  68. package/2D/controls/virtualKeyboard.js +256 -256
  69. package/2D/index.d.ts +9 -9
  70. package/2D/index.js +9 -9
  71. package/2D/math2D.d.ts +117 -117
  72. package/2D/math2D.js +221 -221
  73. package/2D/measure.d.ts +77 -77
  74. package/2D/measure.js +139 -139
  75. package/2D/multiLinePoint.d.ts +47 -47
  76. package/2D/multiLinePoint.js +127 -127
  77. package/2D/style.d.ts +46 -46
  78. package/2D/style.js +97 -97
  79. package/2D/valueAndUnit.d.ts +89 -89
  80. package/2D/valueAndUnit.js +226 -226
  81. package/2D/xmlLoader.d.ts +60 -60
  82. package/2D/xmlLoader.js +348 -348
  83. package/3D/behaviors/defaultBehavior.d.ts +73 -73
  84. package/3D/behaviors/defaultBehavior.js +121 -121
  85. package/3D/controls/abstractButton3D.d.ts +15 -15
  86. package/3D/controls/abstractButton3D.js +25 -25
  87. package/3D/controls/button3D.d.ts +30 -30
  88. package/3D/controls/button3D.js +93 -93
  89. package/3D/controls/container3D.d.ts +72 -72
  90. package/3D/controls/container3D.js +139 -139
  91. package/3D/controls/contentDisplay3D.d.ts +30 -30
  92. package/3D/controls/contentDisplay3D.js +79 -79
  93. package/3D/controls/control3D.d.ts +201 -201
  94. package/3D/controls/control3D.js +445 -445
  95. package/3D/controls/cylinderPanel.d.ts +17 -17
  96. package/3D/controls/cylinderPanel.js +66 -66
  97. package/3D/controls/handMenu.d.ts +28 -28
  98. package/3D/controls/handMenu.js +47 -47
  99. package/3D/controls/holographicBackplate.d.ts +49 -49
  100. package/3D/controls/holographicBackplate.js +120 -120
  101. package/3D/controls/holographicButton.d.ts +84 -84
  102. package/3D/controls/holographicButton.js +339 -339
  103. package/3D/controls/holographicSlate.d.ts +131 -131
  104. package/3D/controls/holographicSlate.js +431 -431
  105. package/3D/controls/index.d.ts +21 -21
  106. package/3D/controls/index.js +21 -21
  107. package/3D/controls/meshButton3D.d.ts +21 -21
  108. package/3D/controls/meshButton3D.js +62 -62
  109. package/3D/controls/nearMenu.d.ts +44 -44
  110. package/3D/controls/nearMenu.js +114 -114
  111. package/3D/controls/planePanel.d.ts +9 -9
  112. package/3D/controls/planePanel.js +36 -36
  113. package/3D/controls/scatterPanel.d.ts +18 -18
  114. package/3D/controls/scatterPanel.js +108 -108
  115. package/3D/controls/slider3D.d.ts +81 -81
  116. package/3D/controls/slider3D.js +268 -268
  117. package/3D/controls/spherePanel.d.ts +17 -17
  118. package/3D/controls/spherePanel.js +67 -67
  119. package/3D/controls/stackPanel3D.d.ts +22 -22
  120. package/3D/controls/stackPanel3D.js +107 -107
  121. package/3D/controls/touchButton3D.d.ts +80 -80
  122. package/3D/controls/touchButton3D.js +233 -233
  123. package/3D/controls/touchHolographicButton.d.ts +110 -110
  124. package/3D/controls/touchHolographicButton.js +445 -445
  125. package/3D/controls/touchHolographicMenu.d.ts +61 -61
  126. package/3D/controls/touchHolographicMenu.js +149 -149
  127. package/3D/controls/touchMeshButton3D.d.ts +21 -21
  128. package/3D/controls/touchMeshButton3D.js +62 -62
  129. package/3D/controls/volumeBasedPanel.d.ts +53 -53
  130. package/3D/controls/volumeBasedPanel.js +174 -174
  131. package/3D/gizmos/gizmoHandle.d.ts +108 -108
  132. package/3D/gizmos/gizmoHandle.js +209 -209
  133. package/3D/gizmos/index.d.ts +2 -2
  134. package/3D/gizmos/index.js +2 -2
  135. package/3D/gizmos/slateGizmo.d.ts +57 -57
  136. package/3D/gizmos/slateGizmo.js +369 -369
  137. package/3D/gui3DManager.d.ts +94 -94
  138. package/3D/gui3DManager.js +257 -257
  139. package/3D/index.d.ts +5 -5
  140. package/3D/index.js +5 -5
  141. package/3D/materials/fluent/fluentMaterial.d.ts +90 -90
  142. package/3D/materials/fluent/fluentMaterial.js +292 -292
  143. package/3D/materials/fluent/index.d.ts +1 -1
  144. package/3D/materials/fluent/index.js +1 -1
  145. package/3D/materials/fluent/shaders/fluent.fragment.d.ts +5 -5
  146. package/3D/materials/fluent/shaders/fluent.fragment.js +8 -8
  147. package/3D/materials/fluent/shaders/fluent.vertex.d.ts +5 -5
  148. package/3D/materials/fluent/shaders/fluent.vertex.js +8 -8
  149. package/3D/materials/fluentBackplate/fluentBackplateMaterial.d.ts +154 -154
  150. package/3D/materials/fluentBackplate/fluentBackplateMaterial.js +469 -469
  151. package/3D/materials/fluentBackplate/index.d.ts +1 -1
  152. package/3D/materials/fluentBackplate/index.js +1 -1
  153. package/3D/materials/fluentBackplate/shaders/fluentBackplate.fragment.d.ts +5 -5
  154. package/3D/materials/fluentBackplate/shaders/fluentBackplate.fragment.js +8 -8
  155. package/3D/materials/fluentBackplate/shaders/fluentBackplate.vertex.d.ts +5 -5
  156. package/3D/materials/fluentBackplate/shaders/fluentBackplate.vertex.js +8 -8
  157. package/3D/materials/fluentButton/fluentButtonMaterial.d.ts +189 -189
  158. package/3D/materials/fluentButton/fluentButtonMaterial.js +539 -539
  159. package/3D/materials/fluentButton/index.d.ts +1 -1
  160. package/3D/materials/fluentButton/index.js +1 -1
  161. package/3D/materials/fluentButton/shaders/fluentButton.fragment.d.ts +5 -5
  162. package/3D/materials/fluentButton/shaders/fluentButton.fragment.js +8 -8
  163. package/3D/materials/fluentButton/shaders/fluentButton.vertex.d.ts +5 -5
  164. package/3D/materials/fluentButton/shaders/fluentButton.vertex.js +8 -8
  165. package/3D/materials/fluentMaterial.d.ts +4 -4
  166. package/3D/materials/fluentMaterial.js +4 -4
  167. package/3D/materials/handle/handleMaterial.d.ts +68 -68
  168. package/3D/materials/handle/handleMaterial.js +126 -126
  169. package/3D/materials/handle/index.d.ts +1 -1
  170. package/3D/materials/handle/index.js +1 -1
  171. package/3D/materials/handle/shaders/handle.fragment.d.ts +5 -5
  172. package/3D/materials/handle/shaders/handle.fragment.js +8 -8
  173. package/3D/materials/handle/shaders/handle.vertex.d.ts +5 -5
  174. package/3D/materials/handle/shaders/handle.vertex.js +8 -8
  175. package/3D/materials/index.d.ts +5 -5
  176. package/3D/materials/index.js +5 -5
  177. package/3D/materials/mrdl/index.d.ts +3 -3
  178. package/3D/materials/mrdl/index.js +3 -3
  179. package/3D/materials/mrdl/mrdlBackplateMaterial.d.ts +147 -147
  180. package/3D/materials/mrdl/mrdlBackplateMaterial.js +436 -436
  181. package/3D/materials/mrdl/mrdlSliderBarMaterial.d.ts +333 -333
  182. package/3D/materials/mrdl/mrdlSliderBarMaterial.js +851 -851
  183. package/3D/materials/mrdl/mrdlSliderThumbMaterial.d.ts +333 -333
  184. package/3D/materials/mrdl/mrdlSliderThumbMaterial.js +851 -851
  185. package/3D/materials/mrdl/shaders/mrdlBackplate.fragment.d.ts +5 -5
  186. package/3D/materials/mrdl/shaders/mrdlBackplate.fragment.js +8 -8
  187. package/3D/materials/mrdl/shaders/mrdlBackplate.vertex.d.ts +5 -5
  188. package/3D/materials/mrdl/shaders/mrdlBackplate.vertex.js +8 -8
  189. package/3D/materials/mrdl/shaders/mrdlSliderBar.fragment.d.ts +5 -5
  190. package/3D/materials/mrdl/shaders/mrdlSliderBar.fragment.js +8 -8
  191. package/3D/materials/mrdl/shaders/mrdlSliderBar.vertex.d.ts +5 -5
  192. package/3D/materials/mrdl/shaders/mrdlSliderBar.vertex.js +8 -8
  193. package/3D/materials/mrdl/shaders/mrdlSliderThumb.fragment.d.ts +5 -5
  194. package/3D/materials/mrdl/shaders/mrdlSliderThumb.fragment.js +8 -8
  195. package/3D/materials/mrdl/shaders/mrdlSliderThumb.vertex.d.ts +5 -5
  196. package/3D/materials/mrdl/shaders/mrdlSliderThumb.vertex.js +8 -8
  197. package/3D/vector3WithInfo.d.ts +16 -16
  198. package/3D/vector3WithInfo.js +23 -23
  199. package/index.d.ts +2 -2
  200. package/index.js +2 -2
  201. package/legacy/legacy.d.ts +1 -1
  202. package/legacy/legacy.js +13 -13
  203. package/package.json +2 -2
@@ -1,604 +1,604 @@
1
- import { __decorate, __extends } from "tslib";
2
- import { Observable } from "@babylonjs/core/Misc/observable.js";
3
- import { ValueAndUnit } from "../valueAndUnit.js";
4
- import { Control } from "./control.js";
5
- import { RegisterClass } from "@babylonjs/core/Misc/typeStore.js";
6
- import { serialize } from "@babylonjs/core/Misc/decorators.js";
7
- import { EngineStore } from "@babylonjs/core/Engines/engineStore.js";
8
- /**
9
- * Enum that determines the text-wrapping mode to use.
10
- */
11
- export var TextWrapping;
12
- (function (TextWrapping) {
13
- /**
14
- * Clip the text when it's larger than Control.width; this is the default mode.
15
- */
16
- TextWrapping[TextWrapping["Clip"] = 0] = "Clip";
17
- /**
18
- * Wrap the text word-wise, i.e. try to add line-breaks at word boundary to fit within Control.width.
19
- */
20
- TextWrapping[TextWrapping["WordWrap"] = 1] = "WordWrap";
21
- /**
22
- * Ellipsize the text, i.e. shrink with trailing … when text is larger than Control.width.
23
- */
24
- TextWrapping[TextWrapping["Ellipsis"] = 2] = "Ellipsis";
25
- /**
26
- * Wrap the text word-wise and clip the text when the text's height is larger than the Control.height, and shrink the last line with trailing … .
27
- */
28
- TextWrapping[TextWrapping["WordWrapEllipsis"] = 3] = "WordWrapEllipsis";
29
- })(TextWrapping || (TextWrapping = {}));
30
- /**
31
- * Class used to create text block control
32
- */
33
- var TextBlock = /** @class */ (function (_super) {
34
- __extends(TextBlock, _super);
35
- /**
36
- * Creates a new TextBlock object
37
- * @param name defines the name of the control
38
- * @param text defines the text to display (empty string by default)
39
- */
40
- function TextBlock(
41
- /**
42
- * Defines the name of the control
43
- */
44
- name, text) {
45
- if (text === void 0) { text = ""; }
46
- var _this = _super.call(this, name) || this;
47
- _this.name = name;
48
- _this._text = "";
49
- _this._textWrapping = TextWrapping.Clip;
50
- _this._textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;
51
- _this._textVerticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;
52
- _this._resizeToFit = false;
53
- _this._lineSpacing = new ValueAndUnit(0);
54
- _this._outlineWidth = 0;
55
- _this._outlineColor = "white";
56
- _this._underline = false;
57
- _this._lineThrough = false;
58
- /**
59
- * An event triggered after the text is changed
60
- */
61
- _this.onTextChangedObservable = new Observable();
62
- /**
63
- * An event triggered after the text was broken up into lines
64
- */
65
- _this.onLinesReadyObservable = new Observable();
66
- _this.text = text;
67
- return _this;
68
- }
69
- Object.defineProperty(TextBlock.prototype, "lines", {
70
- /**
71
- * Return the line list (you may need to use the onLinesReadyObservable to make sure the list is ready)
72
- */
73
- get: function () {
74
- return this._lines;
75
- },
76
- enumerable: false,
77
- configurable: true
78
- });
79
- Object.defineProperty(TextBlock.prototype, "resizeToFit", {
80
- /**
81
- * Gets or sets an boolean indicating that the TextBlock will be resized to fit container
82
- */
83
- get: function () {
84
- return this._resizeToFit;
85
- },
86
- /**
87
- * Gets or sets an boolean indicating that the TextBlock will be resized to fit container
88
- */
89
- set: function (value) {
90
- if (this._resizeToFit === value) {
91
- return;
92
- }
93
- this._resizeToFit = value;
94
- if (this._resizeToFit) {
95
- this._width.ignoreAdaptiveScaling = true;
96
- this._height.ignoreAdaptiveScaling = true;
97
- }
98
- this._markAsDirty();
99
- },
100
- enumerable: false,
101
- configurable: true
102
- });
103
- Object.defineProperty(TextBlock.prototype, "textWrapping", {
104
- /**
105
- * Gets or sets a boolean indicating if text must be wrapped
106
- */
107
- get: function () {
108
- return this._textWrapping;
109
- },
110
- /**
111
- * Gets or sets a boolean indicating if text must be wrapped
112
- */
113
- set: function (value) {
114
- if (this._textWrapping === value) {
115
- return;
116
- }
117
- this._textWrapping = +value;
118
- this._markAsDirty();
119
- },
120
- enumerable: false,
121
- configurable: true
122
- });
123
- Object.defineProperty(TextBlock.prototype, "text", {
124
- /**
125
- * Gets or sets text to display
126
- */
127
- get: function () {
128
- return this._text;
129
- },
130
- /**
131
- * Gets or sets text to display
132
- */
133
- set: function (value) {
134
- if (this._text === value) {
135
- return;
136
- }
137
- this._text = value + ""; // Making sure it is a text
138
- this._markAsDirty();
139
- this.onTextChangedObservable.notifyObservers(this);
140
- },
141
- enumerable: false,
142
- configurable: true
143
- });
144
- Object.defineProperty(TextBlock.prototype, "textHorizontalAlignment", {
145
- /**
146
- * Gets or sets text horizontal alignment (BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_CENTER by default)
147
- */
148
- get: function () {
149
- return this._textHorizontalAlignment;
150
- },
151
- /**
152
- * Gets or sets text horizontal alignment (BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_CENTER by default)
153
- */
154
- set: function (value) {
155
- if (this._textHorizontalAlignment === value) {
156
- return;
157
- }
158
- this._textHorizontalAlignment = value;
159
- this._markAsDirty();
160
- },
161
- enumerable: false,
162
- configurable: true
163
- });
164
- Object.defineProperty(TextBlock.prototype, "textVerticalAlignment", {
165
- /**
166
- * Gets or sets text vertical alignment (BABYLON.GUI.Control.VERTICAL_ALIGNMENT_CENTER by default)
167
- */
168
- get: function () {
169
- return this._textVerticalAlignment;
170
- },
171
- /**
172
- * Gets or sets text vertical alignment (BABYLON.GUI.Control.VERTICAL_ALIGNMENT_CENTER by default)
173
- */
174
- set: function (value) {
175
- if (this._textVerticalAlignment === value) {
176
- return;
177
- }
178
- this._textVerticalAlignment = value;
179
- this._markAsDirty();
180
- },
181
- enumerable: false,
182
- configurable: true
183
- });
184
- Object.defineProperty(TextBlock.prototype, "lineSpacing", {
185
- /**
186
- * Gets or sets line spacing value
187
- */
188
- get: function () {
189
- return this._lineSpacing.toString(this._host);
190
- },
191
- /**
192
- * Gets or sets line spacing value
193
- */
194
- set: function (value) {
195
- if (this._lineSpacing.fromString(value)) {
196
- this._markAsDirty();
197
- }
198
- },
199
- enumerable: false,
200
- configurable: true
201
- });
202
- Object.defineProperty(TextBlock.prototype, "outlineWidth", {
203
- /**
204
- * Gets or sets outlineWidth of the text to display
205
- */
206
- get: function () {
207
- return this._outlineWidth;
208
- },
209
- /**
210
- * Gets or sets outlineWidth of the text to display
211
- */
212
- set: function (value) {
213
- if (this._outlineWidth === value) {
214
- return;
215
- }
216
- this._outlineWidth = value;
217
- this._markAsDirty();
218
- },
219
- enumerable: false,
220
- configurable: true
221
- });
222
- Object.defineProperty(TextBlock.prototype, "underline", {
223
- /**
224
- * Gets or sets a boolean indicating that text must have underline
225
- */
226
- get: function () {
227
- return this._underline;
228
- },
229
- /**
230
- * Gets or sets a boolean indicating that text must have underline
231
- */
232
- set: function (value) {
233
- if (this._underline === value) {
234
- return;
235
- }
236
- this._underline = value;
237
- this._markAsDirty();
238
- },
239
- enumerable: false,
240
- configurable: true
241
- });
242
- Object.defineProperty(TextBlock.prototype, "lineThrough", {
243
- /**
244
- * Gets or sets an boolean indicating that text must be crossed out
245
- */
246
- get: function () {
247
- return this._lineThrough;
248
- },
249
- /**
250
- * Gets or sets an boolean indicating that text must be crossed out
251
- */
252
- set: function (value) {
253
- if (this._lineThrough === value) {
254
- return;
255
- }
256
- this._lineThrough = value;
257
- this._markAsDirty();
258
- },
259
- enumerable: false,
260
- configurable: true
261
- });
262
- Object.defineProperty(TextBlock.prototype, "outlineColor", {
263
- /**
264
- * Gets or sets outlineColor of the text to display
265
- */
266
- get: function () {
267
- return this._outlineColor;
268
- },
269
- /**
270
- * Gets or sets outlineColor of the text to display
271
- */
272
- set: function (value) {
273
- if (this._outlineColor === value) {
274
- return;
275
- }
276
- this._outlineColor = value;
277
- this._markAsDirty();
278
- },
279
- enumerable: false,
280
- configurable: true
281
- });
282
- TextBlock.prototype._getTypeName = function () {
283
- return "TextBlock";
284
- };
285
- TextBlock.prototype._processMeasures = function (parentMeasure, context) {
286
- if (!this._fontOffset || this.isDirty) {
287
- this._fontOffset = Control._GetFontOffset(context.font);
288
- }
289
- _super.prototype._processMeasures.call(this, parentMeasure, context);
290
- // Prepare lines
291
- this._lines = this._breakLines(this._currentMeasure.width, this._currentMeasure.height, context);
292
- this.onLinesReadyObservable.notifyObservers(this);
293
- var maxLineWidth = 0;
294
- for (var i = 0; i < this._lines.length; i++) {
295
- var line = this._lines[i];
296
- if (line.width > maxLineWidth) {
297
- maxLineWidth = line.width;
298
- }
299
- }
300
- if (this._resizeToFit) {
301
- if (this._textWrapping === TextWrapping.Clip) {
302
- var newWidth = (this._paddingLeftInPixels + this._paddingRightInPixels + maxLineWidth) | 0;
303
- if (newWidth !== this._width.internalValue) {
304
- this._width.updateInPlace(newWidth, ValueAndUnit.UNITMODE_PIXEL);
305
- this._rebuildLayout = true;
306
- }
307
- }
308
- var newHeight = (this._paddingTopInPixels + this._paddingBottomInPixels + this._fontOffset.height * this._lines.length) | 0;
309
- if (this._lines.length > 0 && this._lineSpacing.internalValue !== 0) {
310
- var lineSpacing = 0;
311
- if (this._lineSpacing.isPixel) {
312
- lineSpacing = this._lineSpacing.getValue(this._host);
313
- }
314
- else {
315
- lineSpacing = this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);
316
- }
317
- newHeight += (this._lines.length - 1) * lineSpacing;
318
- }
319
- if (newHeight !== this._height.internalValue) {
320
- this._height.updateInPlace(newHeight, ValueAndUnit.UNITMODE_PIXEL);
321
- this._rebuildLayout = true;
322
- }
323
- }
324
- };
325
- TextBlock.prototype._drawText = function (text, textWidth, y, context) {
326
- var width = this._currentMeasure.width;
327
- var x = 0;
328
- switch (this._textHorizontalAlignment) {
329
- case Control.HORIZONTAL_ALIGNMENT_LEFT:
330
- x = 0;
331
- break;
332
- case Control.HORIZONTAL_ALIGNMENT_RIGHT:
333
- x = width - textWidth;
334
- break;
335
- case Control.HORIZONTAL_ALIGNMENT_CENTER:
336
- x = (width - textWidth) / 2;
337
- break;
338
- }
339
- if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {
340
- context.shadowColor = this.shadowColor;
341
- context.shadowBlur = this.shadowBlur;
342
- context.shadowOffsetX = this.shadowOffsetX;
343
- context.shadowOffsetY = this.shadowOffsetY;
344
- }
345
- if (this.outlineWidth) {
346
- context.strokeText(text, this._currentMeasure.left + x, y);
347
- }
348
- context.fillText(text, this._currentMeasure.left + x, y);
349
- if (this._underline) {
350
- context.beginPath();
351
- context.lineWidth = Math.round(this.fontSizeInPixels * 0.05);
352
- context.moveTo(this._currentMeasure.left + x, y + 3);
353
- context.lineTo(this._currentMeasure.left + x + textWidth, y + 3);
354
- context.stroke();
355
- context.closePath();
356
- }
357
- if (this._lineThrough) {
358
- context.beginPath();
359
- context.lineWidth = Math.round(this.fontSizeInPixels * 0.05);
360
- context.moveTo(this._currentMeasure.left + x, y - this.fontSizeInPixels / 3);
361
- context.lineTo(this._currentMeasure.left + x + textWidth, y - this.fontSizeInPixels / 3);
362
- context.stroke();
363
- context.closePath();
364
- }
365
- };
366
- /**
367
- * @param context
368
- * @hidden
369
- */
370
- TextBlock.prototype._draw = function (context) {
371
- context.save();
372
- this._applyStates(context);
373
- // Render lines
374
- this._renderLines(context);
375
- context.restore();
376
- };
377
- TextBlock.prototype._applyStates = function (context) {
378
- _super.prototype._applyStates.call(this, context);
379
- if (this.outlineWidth) {
380
- context.lineWidth = this.outlineWidth;
381
- context.strokeStyle = this.outlineColor;
382
- context.lineJoin = "miter";
383
- context.miterLimit = 2;
384
- }
385
- };
386
- TextBlock.prototype._breakLines = function (refWidth, refHeight, context) {
387
- var lines = [];
388
- var _lines = this.text.split("\n");
389
- if (this._textWrapping === TextWrapping.Ellipsis) {
390
- for (var _i = 0, _lines_1 = _lines; _i < _lines_1.length; _i++) {
391
- var _line = _lines_1[_i];
392
- lines.push(this._parseLineEllipsis(_line, refWidth, context));
393
- }
394
- }
395
- else if (this._textWrapping === TextWrapping.WordWrap) {
396
- for (var _a = 0, _lines_2 = _lines; _a < _lines_2.length; _a++) {
397
- var _line = _lines_2[_a];
398
- lines.push.apply(lines, this._parseLineWordWrap(_line, refWidth, context));
399
- }
400
- }
401
- else if (this._textWrapping === TextWrapping.WordWrapEllipsis) {
402
- for (var _b = 0, _lines_3 = _lines; _b < _lines_3.length; _b++) {
403
- var _line = _lines_3[_b];
404
- lines.push.apply(lines, this._parseLineWordWrapEllipsis(_line, refWidth, refHeight, context));
405
- }
406
- }
407
- else {
408
- for (var _c = 0, _lines_4 = _lines; _c < _lines_4.length; _c++) {
409
- var _line = _lines_4[_c];
410
- lines.push(this._parseLine(_line, context));
411
- }
412
- }
413
- return lines;
414
- };
415
- TextBlock.prototype._parseLine = function (line, context) {
416
- if (line === void 0) { line = ""; }
417
- var textMetrics = context.measureText(line);
418
- var lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);
419
- return { text: line, width: lineWidth };
420
- };
421
- //Calculate how many characters approximately we need to remove
422
- TextBlock.prototype._getCharsToRemove = function (lineWidth, width, lineLength) {
423
- var diff = lineWidth > width ? lineWidth - width : 0;
424
- // This isn't exact unless the font is monospaced
425
- var charWidth = lineWidth / lineLength;
426
- var removeChars = Math.max(Math.floor(diff / charWidth), 1);
427
- return removeChars;
428
- };
429
- TextBlock.prototype._parseLineEllipsis = function (line, width, context) {
430
- if (line === void 0) { line = ""; }
431
- var textMetrics = context.measureText(line);
432
- var lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);
433
- var removeChars = this._getCharsToRemove(lineWidth, width, line.length);
434
- // unicode support. split('') does not work with unicode!
435
- // make sure Array.from is available
436
- var characters = Array.from && Array.from(line);
437
- if (!characters) {
438
- // no array.from, use the old method
439
- while (line.length > 2 && lineWidth > width) {
440
- line = line.slice(0, -removeChars);
441
- textMetrics = context.measureText(line + "…");
442
- lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);
443
- removeChars = this._getCharsToRemove(lineWidth, width, line.length);
444
- }
445
- // Add on the end
446
- line += "…";
447
- }
448
- else {
449
- while (characters.length && lineWidth > width) {
450
- characters.splice(characters.length - removeChars, removeChars);
451
- line = "".concat(characters.join(""), "\u2026");
452
- textMetrics = context.measureText(line);
453
- lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);
454
- removeChars = this._getCharsToRemove(lineWidth, width, line.length);
455
- }
456
- }
457
- return { text: line, width: lineWidth };
458
- };
459
- TextBlock.prototype._parseLineWordWrap = function (line, width, context) {
460
- if (line === void 0) { line = ""; }
461
- var lines = [];
462
- var words = this.wordSplittingFunction ? this.wordSplittingFunction(line) : line.split(" ");
463
- var textMetrics = context.measureText(line);
464
- var lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);
465
- for (var n = 0; n < words.length; n++) {
466
- var testLine = n > 0 ? line + " " + words[n] : words[0];
467
- var metrics = context.measureText(testLine);
468
- var testWidth = Math.abs(metrics.actualBoundingBoxLeft) + Math.abs(metrics.actualBoundingBoxRight);
469
- if (testWidth > width && n > 0) {
470
- lines.push({ text: line, width: lineWidth });
471
- line = words[n];
472
- textMetrics = context.measureText(line);
473
- lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);
474
- }
475
- else {
476
- lineWidth = testWidth;
477
- line = testLine;
478
- }
479
- }
480
- lines.push({ text: line, width: lineWidth });
481
- return lines;
482
- };
483
- TextBlock.prototype._parseLineWordWrapEllipsis = function (line, width, height, context) {
484
- if (line === void 0) { line = ""; }
485
- var lines = this._parseLineWordWrap(line, width, context);
486
- for (var n = 1; n <= lines.length; n++) {
487
- var currentHeight = this._computeHeightForLinesOf(n);
488
- if (currentHeight > height && n > 1) {
489
- var lastLine = lines[n - 2];
490
- var currentLine = lines[n - 1];
491
- lines[n - 2] = this._parseLineEllipsis("".concat(lastLine.text + currentLine.text), width, context);
492
- var linesToRemove = lines.length - n + 1;
493
- for (var i = 0; i < linesToRemove; i++) {
494
- lines.pop();
495
- }
496
- return lines;
497
- }
498
- }
499
- return lines;
500
- };
501
- TextBlock.prototype._renderLines = function (context) {
502
- var height = this._currentMeasure.height;
503
- var rootY = 0;
504
- switch (this._textVerticalAlignment) {
505
- case Control.VERTICAL_ALIGNMENT_TOP:
506
- rootY = this._fontOffset.ascent;
507
- break;
508
- case Control.VERTICAL_ALIGNMENT_BOTTOM:
509
- rootY = height - this._fontOffset.height * (this._lines.length - 1) - this._fontOffset.descent;
510
- break;
511
- case Control.VERTICAL_ALIGNMENT_CENTER:
512
- rootY = this._fontOffset.ascent + (height - this._fontOffset.height * this._lines.length) / 2;
513
- break;
514
- }
515
- rootY += this._currentMeasure.top;
516
- for (var i = 0; i < this._lines.length; i++) {
517
- var line = this._lines[i];
518
- if (i !== 0 && this._lineSpacing.internalValue !== 0) {
519
- if (this._lineSpacing.isPixel) {
520
- rootY += this._lineSpacing.getValue(this._host);
521
- }
522
- else {
523
- rootY = rootY + this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);
524
- }
525
- }
526
- this._drawText(line.text, line.width, rootY, context);
527
- rootY += this._fontOffset.height;
528
- }
529
- };
530
- TextBlock.prototype._computeHeightForLinesOf = function (lineCount) {
531
- var newHeight = this._paddingTopInPixels + this._paddingBottomInPixels + this._fontOffset.height * lineCount;
532
- if (lineCount > 0 && this._lineSpacing.internalValue !== 0) {
533
- var lineSpacing = 0;
534
- if (this._lineSpacing.isPixel) {
535
- lineSpacing = this._lineSpacing.getValue(this._host);
536
- }
537
- else {
538
- lineSpacing = this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);
539
- }
540
- newHeight += (lineCount - 1) * lineSpacing;
541
- }
542
- return newHeight;
543
- };
544
- /**
545
- * Given a width constraint applied on the text block, find the expected height
546
- * @returns expected height
547
- */
548
- TextBlock.prototype.computeExpectedHeight = function () {
549
- var _a;
550
- if (this.text && this.widthInPixels) {
551
- // Should abstract platform instead of using LastCreatedEngine
552
- var context_1 = (_a = EngineStore.LastCreatedEngine) === null || _a === void 0 ? void 0 : _a.createCanvas(0, 0).getContext("2d");
553
- if (context_1) {
554
- this._applyStates(context_1);
555
- if (!this._fontOffset) {
556
- this._fontOffset = Control._GetFontOffset(context_1.font);
557
- }
558
- var lines = this._lines
559
- ? this._lines
560
- : this._breakLines(this.widthInPixels - this._paddingLeftInPixels - this._paddingRightInPixels, this.heightInPixels - this._paddingTopInPixels - this._paddingBottomInPixels, context_1);
561
- return this._computeHeightForLinesOf(lines.length);
562
- }
563
- }
564
- return 0;
565
- };
566
- TextBlock.prototype.dispose = function () {
567
- _super.prototype.dispose.call(this);
568
- this.onTextChangedObservable.clear();
569
- };
570
- __decorate([
571
- serialize()
572
- ], TextBlock.prototype, "resizeToFit", null);
573
- __decorate([
574
- serialize()
575
- ], TextBlock.prototype, "textWrapping", null);
576
- __decorate([
577
- serialize()
578
- ], TextBlock.prototype, "text", null);
579
- __decorate([
580
- serialize()
581
- ], TextBlock.prototype, "textHorizontalAlignment", null);
582
- __decorate([
583
- serialize()
584
- ], TextBlock.prototype, "textVerticalAlignment", null);
585
- __decorate([
586
- serialize()
587
- ], TextBlock.prototype, "lineSpacing", null);
588
- __decorate([
589
- serialize()
590
- ], TextBlock.prototype, "outlineWidth", null);
591
- __decorate([
592
- serialize()
593
- ], TextBlock.prototype, "underline", null);
594
- __decorate([
595
- serialize()
596
- ], TextBlock.prototype, "lineThrough", null);
597
- __decorate([
598
- serialize()
599
- ], TextBlock.prototype, "outlineColor", null);
600
- return TextBlock;
601
- }(Control));
602
- export { TextBlock };
603
- RegisterClass("BABYLON.GUI.TextBlock", TextBlock);
1
+ import { __decorate, __extends } from "tslib";
2
+ import { Observable } from "@babylonjs/core/Misc/observable.js";
3
+ import { ValueAndUnit } from "../valueAndUnit";
4
+ import { Control } from "./control";
5
+ import { RegisterClass } from "@babylonjs/core/Misc/typeStore.js";
6
+ import { serialize } from "@babylonjs/core/Misc/decorators.js";
7
+ import { EngineStore } from "@babylonjs/core/Engines/engineStore.js";
8
+ /**
9
+ * Enum that determines the text-wrapping mode to use.
10
+ */
11
+ export var TextWrapping;
12
+ (function (TextWrapping) {
13
+ /**
14
+ * Clip the text when it's larger than Control.width; this is the default mode.
15
+ */
16
+ TextWrapping[TextWrapping["Clip"] = 0] = "Clip";
17
+ /**
18
+ * Wrap the text word-wise, i.e. try to add line-breaks at word boundary to fit within Control.width.
19
+ */
20
+ TextWrapping[TextWrapping["WordWrap"] = 1] = "WordWrap";
21
+ /**
22
+ * Ellipsize the text, i.e. shrink with trailing … when text is larger than Control.width.
23
+ */
24
+ TextWrapping[TextWrapping["Ellipsis"] = 2] = "Ellipsis";
25
+ /**
26
+ * Wrap the text word-wise and clip the text when the text's height is larger than the Control.height, and shrink the last line with trailing … .
27
+ */
28
+ TextWrapping[TextWrapping["WordWrapEllipsis"] = 3] = "WordWrapEllipsis";
29
+ })(TextWrapping || (TextWrapping = {}));
30
+ /**
31
+ * Class used to create text block control
32
+ */
33
+ var TextBlock = /** @class */ (function (_super) {
34
+ __extends(TextBlock, _super);
35
+ /**
36
+ * Creates a new TextBlock object
37
+ * @param name defines the name of the control
38
+ * @param text defines the text to display (empty string by default)
39
+ */
40
+ function TextBlock(
41
+ /**
42
+ * Defines the name of the control
43
+ */
44
+ name, text) {
45
+ if (text === void 0) { text = ""; }
46
+ var _this = _super.call(this, name) || this;
47
+ _this.name = name;
48
+ _this._text = "";
49
+ _this._textWrapping = TextWrapping.Clip;
50
+ _this._textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;
51
+ _this._textVerticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;
52
+ _this._resizeToFit = false;
53
+ _this._lineSpacing = new ValueAndUnit(0);
54
+ _this._outlineWidth = 0;
55
+ _this._outlineColor = "white";
56
+ _this._underline = false;
57
+ _this._lineThrough = false;
58
+ /**
59
+ * An event triggered after the text is changed
60
+ */
61
+ _this.onTextChangedObservable = new Observable();
62
+ /**
63
+ * An event triggered after the text was broken up into lines
64
+ */
65
+ _this.onLinesReadyObservable = new Observable();
66
+ _this.text = text;
67
+ return _this;
68
+ }
69
+ Object.defineProperty(TextBlock.prototype, "lines", {
70
+ /**
71
+ * Return the line list (you may need to use the onLinesReadyObservable to make sure the list is ready)
72
+ */
73
+ get: function () {
74
+ return this._lines;
75
+ },
76
+ enumerable: false,
77
+ configurable: true
78
+ });
79
+ Object.defineProperty(TextBlock.prototype, "resizeToFit", {
80
+ /**
81
+ * Gets or sets an boolean indicating that the TextBlock will be resized to fit container
82
+ */
83
+ get: function () {
84
+ return this._resizeToFit;
85
+ },
86
+ /**
87
+ * Gets or sets an boolean indicating that the TextBlock will be resized to fit container
88
+ */
89
+ set: function (value) {
90
+ if (this._resizeToFit === value) {
91
+ return;
92
+ }
93
+ this._resizeToFit = value;
94
+ if (this._resizeToFit) {
95
+ this._width.ignoreAdaptiveScaling = true;
96
+ this._height.ignoreAdaptiveScaling = true;
97
+ }
98
+ this._markAsDirty();
99
+ },
100
+ enumerable: false,
101
+ configurable: true
102
+ });
103
+ Object.defineProperty(TextBlock.prototype, "textWrapping", {
104
+ /**
105
+ * Gets or sets a boolean indicating if text must be wrapped
106
+ */
107
+ get: function () {
108
+ return this._textWrapping;
109
+ },
110
+ /**
111
+ * Gets or sets a boolean indicating if text must be wrapped
112
+ */
113
+ set: function (value) {
114
+ if (this._textWrapping === value) {
115
+ return;
116
+ }
117
+ this._textWrapping = +value;
118
+ this._markAsDirty();
119
+ },
120
+ enumerable: false,
121
+ configurable: true
122
+ });
123
+ Object.defineProperty(TextBlock.prototype, "text", {
124
+ /**
125
+ * Gets or sets text to display
126
+ */
127
+ get: function () {
128
+ return this._text;
129
+ },
130
+ /**
131
+ * Gets or sets text to display
132
+ */
133
+ set: function (value) {
134
+ if (this._text === value) {
135
+ return;
136
+ }
137
+ this._text = value + ""; // Making sure it is a text
138
+ this._markAsDirty();
139
+ this.onTextChangedObservable.notifyObservers(this);
140
+ },
141
+ enumerable: false,
142
+ configurable: true
143
+ });
144
+ Object.defineProperty(TextBlock.prototype, "textHorizontalAlignment", {
145
+ /**
146
+ * Gets or sets text horizontal alignment (BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_CENTER by default)
147
+ */
148
+ get: function () {
149
+ return this._textHorizontalAlignment;
150
+ },
151
+ /**
152
+ * Gets or sets text horizontal alignment (BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_CENTER by default)
153
+ */
154
+ set: function (value) {
155
+ if (this._textHorizontalAlignment === value) {
156
+ return;
157
+ }
158
+ this._textHorizontalAlignment = value;
159
+ this._markAsDirty();
160
+ },
161
+ enumerable: false,
162
+ configurable: true
163
+ });
164
+ Object.defineProperty(TextBlock.prototype, "textVerticalAlignment", {
165
+ /**
166
+ * Gets or sets text vertical alignment (BABYLON.GUI.Control.VERTICAL_ALIGNMENT_CENTER by default)
167
+ */
168
+ get: function () {
169
+ return this._textVerticalAlignment;
170
+ },
171
+ /**
172
+ * Gets or sets text vertical alignment (BABYLON.GUI.Control.VERTICAL_ALIGNMENT_CENTER by default)
173
+ */
174
+ set: function (value) {
175
+ if (this._textVerticalAlignment === value) {
176
+ return;
177
+ }
178
+ this._textVerticalAlignment = value;
179
+ this._markAsDirty();
180
+ },
181
+ enumerable: false,
182
+ configurable: true
183
+ });
184
+ Object.defineProperty(TextBlock.prototype, "lineSpacing", {
185
+ /**
186
+ * Gets or sets line spacing value
187
+ */
188
+ get: function () {
189
+ return this._lineSpacing.toString(this._host);
190
+ },
191
+ /**
192
+ * Gets or sets line spacing value
193
+ */
194
+ set: function (value) {
195
+ if (this._lineSpacing.fromString(value)) {
196
+ this._markAsDirty();
197
+ }
198
+ },
199
+ enumerable: false,
200
+ configurable: true
201
+ });
202
+ Object.defineProperty(TextBlock.prototype, "outlineWidth", {
203
+ /**
204
+ * Gets or sets outlineWidth of the text to display
205
+ */
206
+ get: function () {
207
+ return this._outlineWidth;
208
+ },
209
+ /**
210
+ * Gets or sets outlineWidth of the text to display
211
+ */
212
+ set: function (value) {
213
+ if (this._outlineWidth === value) {
214
+ return;
215
+ }
216
+ this._outlineWidth = value;
217
+ this._markAsDirty();
218
+ },
219
+ enumerable: false,
220
+ configurable: true
221
+ });
222
+ Object.defineProperty(TextBlock.prototype, "underline", {
223
+ /**
224
+ * Gets or sets a boolean indicating that text must have underline
225
+ */
226
+ get: function () {
227
+ return this._underline;
228
+ },
229
+ /**
230
+ * Gets or sets a boolean indicating that text must have underline
231
+ */
232
+ set: function (value) {
233
+ if (this._underline === value) {
234
+ return;
235
+ }
236
+ this._underline = value;
237
+ this._markAsDirty();
238
+ },
239
+ enumerable: false,
240
+ configurable: true
241
+ });
242
+ Object.defineProperty(TextBlock.prototype, "lineThrough", {
243
+ /**
244
+ * Gets or sets an boolean indicating that text must be crossed out
245
+ */
246
+ get: function () {
247
+ return this._lineThrough;
248
+ },
249
+ /**
250
+ * Gets or sets an boolean indicating that text must be crossed out
251
+ */
252
+ set: function (value) {
253
+ if (this._lineThrough === value) {
254
+ return;
255
+ }
256
+ this._lineThrough = value;
257
+ this._markAsDirty();
258
+ },
259
+ enumerable: false,
260
+ configurable: true
261
+ });
262
+ Object.defineProperty(TextBlock.prototype, "outlineColor", {
263
+ /**
264
+ * Gets or sets outlineColor of the text to display
265
+ */
266
+ get: function () {
267
+ return this._outlineColor;
268
+ },
269
+ /**
270
+ * Gets or sets outlineColor of the text to display
271
+ */
272
+ set: function (value) {
273
+ if (this._outlineColor === value) {
274
+ return;
275
+ }
276
+ this._outlineColor = value;
277
+ this._markAsDirty();
278
+ },
279
+ enumerable: false,
280
+ configurable: true
281
+ });
282
+ TextBlock.prototype._getTypeName = function () {
283
+ return "TextBlock";
284
+ };
285
+ TextBlock.prototype._processMeasures = function (parentMeasure, context) {
286
+ if (!this._fontOffset || this.isDirty) {
287
+ this._fontOffset = Control._GetFontOffset(context.font);
288
+ }
289
+ _super.prototype._processMeasures.call(this, parentMeasure, context);
290
+ // Prepare lines
291
+ this._lines = this._breakLines(this._currentMeasure.width, this._currentMeasure.height, context);
292
+ this.onLinesReadyObservable.notifyObservers(this);
293
+ var maxLineWidth = 0;
294
+ for (var i = 0; i < this._lines.length; i++) {
295
+ var line = this._lines[i];
296
+ if (line.width > maxLineWidth) {
297
+ maxLineWidth = line.width;
298
+ }
299
+ }
300
+ if (this._resizeToFit) {
301
+ if (this._textWrapping === TextWrapping.Clip) {
302
+ var newWidth = (this._paddingLeftInPixels + this._paddingRightInPixels + maxLineWidth) | 0;
303
+ if (newWidth !== this._width.internalValue) {
304
+ this._width.updateInPlace(newWidth, ValueAndUnit.UNITMODE_PIXEL);
305
+ this._rebuildLayout = true;
306
+ }
307
+ }
308
+ var newHeight = (this._paddingTopInPixels + this._paddingBottomInPixels + this._fontOffset.height * this._lines.length) | 0;
309
+ if (this._lines.length > 0 && this._lineSpacing.internalValue !== 0) {
310
+ var lineSpacing = 0;
311
+ if (this._lineSpacing.isPixel) {
312
+ lineSpacing = this._lineSpacing.getValue(this._host);
313
+ }
314
+ else {
315
+ lineSpacing = this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);
316
+ }
317
+ newHeight += (this._lines.length - 1) * lineSpacing;
318
+ }
319
+ if (newHeight !== this._height.internalValue) {
320
+ this._height.updateInPlace(newHeight, ValueAndUnit.UNITMODE_PIXEL);
321
+ this._rebuildLayout = true;
322
+ }
323
+ }
324
+ };
325
+ TextBlock.prototype._drawText = function (text, textWidth, y, context) {
326
+ var width = this._currentMeasure.width;
327
+ var x = 0;
328
+ switch (this._textHorizontalAlignment) {
329
+ case Control.HORIZONTAL_ALIGNMENT_LEFT:
330
+ x = 0;
331
+ break;
332
+ case Control.HORIZONTAL_ALIGNMENT_RIGHT:
333
+ x = width - textWidth;
334
+ break;
335
+ case Control.HORIZONTAL_ALIGNMENT_CENTER:
336
+ x = (width - textWidth) / 2;
337
+ break;
338
+ }
339
+ if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {
340
+ context.shadowColor = this.shadowColor;
341
+ context.shadowBlur = this.shadowBlur;
342
+ context.shadowOffsetX = this.shadowOffsetX;
343
+ context.shadowOffsetY = this.shadowOffsetY;
344
+ }
345
+ if (this.outlineWidth) {
346
+ context.strokeText(text, this._currentMeasure.left + x, y);
347
+ }
348
+ context.fillText(text, this._currentMeasure.left + x, y);
349
+ if (this._underline) {
350
+ context.beginPath();
351
+ context.lineWidth = Math.round(this.fontSizeInPixels * 0.05);
352
+ context.moveTo(this._currentMeasure.left + x, y + 3);
353
+ context.lineTo(this._currentMeasure.left + x + textWidth, y + 3);
354
+ context.stroke();
355
+ context.closePath();
356
+ }
357
+ if (this._lineThrough) {
358
+ context.beginPath();
359
+ context.lineWidth = Math.round(this.fontSizeInPixels * 0.05);
360
+ context.moveTo(this._currentMeasure.left + x, y - this.fontSizeInPixels / 3);
361
+ context.lineTo(this._currentMeasure.left + x + textWidth, y - this.fontSizeInPixels / 3);
362
+ context.stroke();
363
+ context.closePath();
364
+ }
365
+ };
366
+ /**
367
+ * @param context
368
+ * @hidden
369
+ */
370
+ TextBlock.prototype._draw = function (context) {
371
+ context.save();
372
+ this._applyStates(context);
373
+ // Render lines
374
+ this._renderLines(context);
375
+ context.restore();
376
+ };
377
+ TextBlock.prototype._applyStates = function (context) {
378
+ _super.prototype._applyStates.call(this, context);
379
+ if (this.outlineWidth) {
380
+ context.lineWidth = this.outlineWidth;
381
+ context.strokeStyle = this.outlineColor;
382
+ context.lineJoin = "miter";
383
+ context.miterLimit = 2;
384
+ }
385
+ };
386
+ TextBlock.prototype._breakLines = function (refWidth, refHeight, context) {
387
+ var lines = [];
388
+ var _lines = this.text.split("\n");
389
+ if (this._textWrapping === TextWrapping.Ellipsis) {
390
+ for (var _i = 0, _lines_1 = _lines; _i < _lines_1.length; _i++) {
391
+ var _line = _lines_1[_i];
392
+ lines.push(this._parseLineEllipsis(_line, refWidth, context));
393
+ }
394
+ }
395
+ else if (this._textWrapping === TextWrapping.WordWrap) {
396
+ for (var _a = 0, _lines_2 = _lines; _a < _lines_2.length; _a++) {
397
+ var _line = _lines_2[_a];
398
+ lines.push.apply(lines, this._parseLineWordWrap(_line, refWidth, context));
399
+ }
400
+ }
401
+ else if (this._textWrapping === TextWrapping.WordWrapEllipsis) {
402
+ for (var _b = 0, _lines_3 = _lines; _b < _lines_3.length; _b++) {
403
+ var _line = _lines_3[_b];
404
+ lines.push.apply(lines, this._parseLineWordWrapEllipsis(_line, refWidth, refHeight, context));
405
+ }
406
+ }
407
+ else {
408
+ for (var _c = 0, _lines_4 = _lines; _c < _lines_4.length; _c++) {
409
+ var _line = _lines_4[_c];
410
+ lines.push(this._parseLine(_line, context));
411
+ }
412
+ }
413
+ return lines;
414
+ };
415
+ TextBlock.prototype._parseLine = function (line, context) {
416
+ if (line === void 0) { line = ""; }
417
+ var textMetrics = context.measureText(line);
418
+ var lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);
419
+ return { text: line, width: lineWidth };
420
+ };
421
+ //Calculate how many characters approximately we need to remove
422
+ TextBlock.prototype._getCharsToRemove = function (lineWidth, width, lineLength) {
423
+ var diff = lineWidth > width ? lineWidth - width : 0;
424
+ // This isn't exact unless the font is monospaced
425
+ var charWidth = lineWidth / lineLength;
426
+ var removeChars = Math.max(Math.floor(diff / charWidth), 1);
427
+ return removeChars;
428
+ };
429
+ TextBlock.prototype._parseLineEllipsis = function (line, width, context) {
430
+ if (line === void 0) { line = ""; }
431
+ var textMetrics = context.measureText(line);
432
+ var lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);
433
+ var removeChars = this._getCharsToRemove(lineWidth, width, line.length);
434
+ // unicode support. split('') does not work with unicode!
435
+ // make sure Array.from is available
436
+ var characters = Array.from && Array.from(line);
437
+ if (!characters) {
438
+ // no array.from, use the old method
439
+ while (line.length > 2 && lineWidth > width) {
440
+ line = line.slice(0, -removeChars);
441
+ textMetrics = context.measureText(line + "…");
442
+ lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);
443
+ removeChars = this._getCharsToRemove(lineWidth, width, line.length);
444
+ }
445
+ // Add on the end
446
+ line += "…";
447
+ }
448
+ else {
449
+ while (characters.length && lineWidth > width) {
450
+ characters.splice(characters.length - removeChars, removeChars);
451
+ line = "".concat(characters.join(""), "\u2026");
452
+ textMetrics = context.measureText(line);
453
+ lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);
454
+ removeChars = this._getCharsToRemove(lineWidth, width, line.length);
455
+ }
456
+ }
457
+ return { text: line, width: lineWidth };
458
+ };
459
+ TextBlock.prototype._parseLineWordWrap = function (line, width, context) {
460
+ if (line === void 0) { line = ""; }
461
+ var lines = [];
462
+ var words = this.wordSplittingFunction ? this.wordSplittingFunction(line) : line.split(" ");
463
+ var textMetrics = context.measureText(line);
464
+ var lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);
465
+ for (var n = 0; n < words.length; n++) {
466
+ var testLine = n > 0 ? line + " " + words[n] : words[0];
467
+ var metrics = context.measureText(testLine);
468
+ var testWidth = Math.abs(metrics.actualBoundingBoxLeft) + Math.abs(metrics.actualBoundingBoxRight);
469
+ if (testWidth > width && n > 0) {
470
+ lines.push({ text: line, width: lineWidth });
471
+ line = words[n];
472
+ textMetrics = context.measureText(line);
473
+ lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);
474
+ }
475
+ else {
476
+ lineWidth = testWidth;
477
+ line = testLine;
478
+ }
479
+ }
480
+ lines.push({ text: line, width: lineWidth });
481
+ return lines;
482
+ };
483
+ TextBlock.prototype._parseLineWordWrapEllipsis = function (line, width, height, context) {
484
+ if (line === void 0) { line = ""; }
485
+ var lines = this._parseLineWordWrap(line, width, context);
486
+ for (var n = 1; n <= lines.length; n++) {
487
+ var currentHeight = this._computeHeightForLinesOf(n);
488
+ if (currentHeight > height && n > 1) {
489
+ var lastLine = lines[n - 2];
490
+ var currentLine = lines[n - 1];
491
+ lines[n - 2] = this._parseLineEllipsis("".concat(lastLine.text + currentLine.text), width, context);
492
+ var linesToRemove = lines.length - n + 1;
493
+ for (var i = 0; i < linesToRemove; i++) {
494
+ lines.pop();
495
+ }
496
+ return lines;
497
+ }
498
+ }
499
+ return lines;
500
+ };
501
+ TextBlock.prototype._renderLines = function (context) {
502
+ var height = this._currentMeasure.height;
503
+ var rootY = 0;
504
+ switch (this._textVerticalAlignment) {
505
+ case Control.VERTICAL_ALIGNMENT_TOP:
506
+ rootY = this._fontOffset.ascent;
507
+ break;
508
+ case Control.VERTICAL_ALIGNMENT_BOTTOM:
509
+ rootY = height - this._fontOffset.height * (this._lines.length - 1) - this._fontOffset.descent;
510
+ break;
511
+ case Control.VERTICAL_ALIGNMENT_CENTER:
512
+ rootY = this._fontOffset.ascent + (height - this._fontOffset.height * this._lines.length) / 2;
513
+ break;
514
+ }
515
+ rootY += this._currentMeasure.top;
516
+ for (var i = 0; i < this._lines.length; i++) {
517
+ var line = this._lines[i];
518
+ if (i !== 0 && this._lineSpacing.internalValue !== 0) {
519
+ if (this._lineSpacing.isPixel) {
520
+ rootY += this._lineSpacing.getValue(this._host);
521
+ }
522
+ else {
523
+ rootY = rootY + this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);
524
+ }
525
+ }
526
+ this._drawText(line.text, line.width, rootY, context);
527
+ rootY += this._fontOffset.height;
528
+ }
529
+ };
530
+ TextBlock.prototype._computeHeightForLinesOf = function (lineCount) {
531
+ var newHeight = this._paddingTopInPixels + this._paddingBottomInPixels + this._fontOffset.height * lineCount;
532
+ if (lineCount > 0 && this._lineSpacing.internalValue !== 0) {
533
+ var lineSpacing = 0;
534
+ if (this._lineSpacing.isPixel) {
535
+ lineSpacing = this._lineSpacing.getValue(this._host);
536
+ }
537
+ else {
538
+ lineSpacing = this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);
539
+ }
540
+ newHeight += (lineCount - 1) * lineSpacing;
541
+ }
542
+ return newHeight;
543
+ };
544
+ /**
545
+ * Given a width constraint applied on the text block, find the expected height
546
+ * @returns expected height
547
+ */
548
+ TextBlock.prototype.computeExpectedHeight = function () {
549
+ var _a;
550
+ if (this.text && this.widthInPixels) {
551
+ // Should abstract platform instead of using LastCreatedEngine
552
+ var context_1 = (_a = EngineStore.LastCreatedEngine) === null || _a === void 0 ? void 0 : _a.createCanvas(0, 0).getContext("2d");
553
+ if (context_1) {
554
+ this._applyStates(context_1);
555
+ if (!this._fontOffset) {
556
+ this._fontOffset = Control._GetFontOffset(context_1.font);
557
+ }
558
+ var lines = this._lines
559
+ ? this._lines
560
+ : this._breakLines(this.widthInPixels - this._paddingLeftInPixels - this._paddingRightInPixels, this.heightInPixels - this._paddingTopInPixels - this._paddingBottomInPixels, context_1);
561
+ return this._computeHeightForLinesOf(lines.length);
562
+ }
563
+ }
564
+ return 0;
565
+ };
566
+ TextBlock.prototype.dispose = function () {
567
+ _super.prototype.dispose.call(this);
568
+ this.onTextChangedObservable.clear();
569
+ };
570
+ __decorate([
571
+ serialize()
572
+ ], TextBlock.prototype, "resizeToFit", null);
573
+ __decorate([
574
+ serialize()
575
+ ], TextBlock.prototype, "textWrapping", null);
576
+ __decorate([
577
+ serialize()
578
+ ], TextBlock.prototype, "text", null);
579
+ __decorate([
580
+ serialize()
581
+ ], TextBlock.prototype, "textHorizontalAlignment", null);
582
+ __decorate([
583
+ serialize()
584
+ ], TextBlock.prototype, "textVerticalAlignment", null);
585
+ __decorate([
586
+ serialize()
587
+ ], TextBlock.prototype, "lineSpacing", null);
588
+ __decorate([
589
+ serialize()
590
+ ], TextBlock.prototype, "outlineWidth", null);
591
+ __decorate([
592
+ serialize()
593
+ ], TextBlock.prototype, "underline", null);
594
+ __decorate([
595
+ serialize()
596
+ ], TextBlock.prototype, "lineThrough", null);
597
+ __decorate([
598
+ serialize()
599
+ ], TextBlock.prototype, "outlineColor", null);
600
+ return TextBlock;
601
+ }(Control));
602
+ export { TextBlock };
603
+ RegisterClass("BABYLON.GUI.TextBlock", TextBlock);
604
604
  //# sourceMappingURL=textBlock.js.map