blockly 7.20211209.4 → 8.0.1

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 (231) hide show
  1. package/blockly.d.ts +18963 -18432
  2. package/blockly.min.js +5 -4
  3. package/blockly_compressed.js +4 -3
  4. package/blockly_compressed.js.map +1 -1
  5. package/blocks/blocks.js +47 -0
  6. package/blocks/colour.js +13 -3
  7. package/blocks/lists.js +22 -13
  8. package/blocks/logic.js +13 -3
  9. package/blocks/loops.js +24 -11
  10. package/blocks/math.js +12 -3
  11. package/blocks/procedures.js +45 -32
  12. package/blocks/text.js +22 -13
  13. package/blocks/variables.js +14 -3
  14. package/blocks/variables_dynamic.js +13 -3
  15. package/blocks_compressed.js +1 -1
  16. package/blocks_compressed.js.map +1 -1
  17. package/core/block.js +1869 -1814
  18. package/core/block_drag_surface.js +201 -200
  19. package/core/block_dragger.js +377 -373
  20. package/core/block_svg.js +1593 -1479
  21. package/core/blockly.js +8 -22
  22. package/core/blocks.js +9 -2
  23. package/core/browser_events.js +22 -5
  24. package/core/bubble.js +841 -797
  25. package/core/bubble_dragger.js +213 -206
  26. package/core/bump_objects.js +2 -2
  27. package/core/clipboard.js +9 -9
  28. package/core/comment.js +353 -332
  29. package/core/common.js +46 -17
  30. package/core/component_manager.js +181 -174
  31. package/core/config.js +87 -0
  32. package/core/connection.js +595 -584
  33. package/core/connection_checker.js +242 -244
  34. package/core/connection_db.js +235 -230
  35. package/core/contextmenu.js +9 -6
  36. package/core/contextmenu_items.js +1 -2
  37. package/core/contextmenu_registry.js +93 -89
  38. package/core/css.js +474 -474
  39. package/core/delete_area.js +45 -42
  40. package/core/drag_target.js +57 -56
  41. package/core/dropdowndiv.js +153 -163
  42. package/core/events/events.js +2 -2
  43. package/core/events/events_abstract.js +89 -77
  44. package/core/events/events_block_base.js +37 -36
  45. package/core/events/events_block_change.js +130 -124
  46. package/core/events/events_block_create.js +73 -71
  47. package/core/events/events_block_delete.js +84 -82
  48. package/core/events/events_block_drag.js +50 -49
  49. package/core/events/events_block_move.js +147 -140
  50. package/core/events/events_bubble_open.js +51 -50
  51. package/core/events/events_click.js +48 -44
  52. package/core/events/events_comment_base.js +72 -69
  53. package/core/events/events_comment_change.js +63 -61
  54. package/core/events/events_comment_create.js +44 -42
  55. package/core/events/events_comment_delete.js +42 -40
  56. package/core/events/events_comment_move.js +106 -104
  57. package/core/events/events_marker_move.js +65 -64
  58. package/core/events/events_selected.js +46 -45
  59. package/core/events/events_theme_change.js +36 -35
  60. package/core/events/events_toolbox_item_select.js +46 -45
  61. package/core/events/events_trashcan_open.js +37 -36
  62. package/core/events/events_ui.js +47 -46
  63. package/core/events/events_ui_base.js +30 -29
  64. package/core/events/events_var_base.js +37 -36
  65. package/core/events/events_var_create.js +50 -48
  66. package/core/events/events_var_delete.js +50 -48
  67. package/core/events/events_var_rename.js +51 -49
  68. package/core/events/events_viewport.js +66 -65
  69. package/core/events/utils.js +29 -14
  70. package/core/events/workspace_events.js +49 -55
  71. package/core/extensions.js +4 -3
  72. package/core/field.js +1061 -997
  73. package/core/field_angle.js +462 -442
  74. package/core/field_checkbox.js +194 -182
  75. package/core/field_colour.js +519 -505
  76. package/core/field_dropdown.js +617 -598
  77. package/core/field_image.js +229 -220
  78. package/core/field_label.js +102 -91
  79. package/core/field_label_serializable.js +42 -41
  80. package/core/field_multilineinput.js +372 -358
  81. package/core/field_number.js +272 -253
  82. package/core/field_textinput.js +499 -467
  83. package/core/field_variable.js +458 -420
  84. package/core/flyout_base.js +1005 -952
  85. package/core/flyout_button.js +277 -260
  86. package/core/flyout_horizontal.js +304 -302
  87. package/core/flyout_metrics_manager.js +64 -64
  88. package/core/flyout_vertical.js +306 -300
  89. package/core/generator.js +459 -446
  90. package/core/gesture.js +829 -813
  91. package/core/grid.js +166 -163
  92. package/core/icon.js +168 -159
  93. package/core/inject.js +7 -5
  94. package/core/input.js +257 -248
  95. package/core/insertion_marker_manager.js +655 -624
  96. package/core/internal_constants.js +0 -129
  97. package/core/keyboard_nav/ast_node.js +605 -596
  98. package/core/keyboard_nav/basic_cursor.js +166 -165
  99. package/core/keyboard_nav/cursor.js +99 -97
  100. package/core/keyboard_nav/marker.js +83 -79
  101. package/core/keyboard_nav/tab_navigate_cursor.js +18 -23
  102. package/core/marker_manager.js +153 -141
  103. package/core/menu.js +377 -372
  104. package/core/menuitem.js +223 -217
  105. package/core/metrics_manager.js +403 -390
  106. package/core/mutator.js +468 -437
  107. package/core/names.js +229 -188
  108. package/core/options.js +290 -284
  109. package/core/procedures.js +29 -17
  110. package/core/registry.js +19 -16
  111. package/core/rendered_connection.js +482 -463
  112. package/core/renderers/common/block_rendering.js +9 -3
  113. package/core/renderers/common/constants.js +1119 -1112
  114. package/core/renderers/common/debug.js +14 -0
  115. package/core/renderers/common/debugger.js +338 -316
  116. package/core/renderers/common/drawer.js +380 -370
  117. package/core/renderers/common/i_path_object.js +2 -2
  118. package/core/renderers/common/info.js +626 -618
  119. package/core/renderers/common/marker_svg.js +579 -541
  120. package/core/renderers/common/path_object.js +203 -200
  121. package/core/renderers/common/renderer.js +220 -218
  122. package/core/renderers/geras/constants.js +36 -36
  123. package/core/renderers/geras/drawer.js +155 -147
  124. package/core/renderers/geras/highlight_constants.js +244 -238
  125. package/core/renderers/geras/highlighter.js +231 -179
  126. package/core/renderers/geras/info.js +392 -369
  127. package/core/renderers/geras/measurables/inline_input.js +25 -19
  128. package/core/renderers/geras/measurables/statement_input.js +23 -17
  129. package/core/renderers/geras/path_object.js +106 -121
  130. package/core/renderers/geras/renderer.js +96 -98
  131. package/core/renderers/measurables/base.js +30 -18
  132. package/core/renderers/measurables/bottom_row.js +83 -80
  133. package/core/renderers/measurables/connection.js +22 -15
  134. package/core/renderers/measurables/external_value_input.js +35 -22
  135. package/core/renderers/measurables/field.js +35 -20
  136. package/core/renderers/measurables/hat.js +18 -13
  137. package/core/renderers/measurables/icon.js +24 -17
  138. package/core/renderers/measurables/in_row_spacer.js +15 -13
  139. package/core/renderers/measurables/inline_input.js +43 -33
  140. package/core/renderers/measurables/input_connection.js +41 -28
  141. package/core/renderers/measurables/input_row.js +50 -44
  142. package/core/renderers/measurables/jagged_edge.js +14 -12
  143. package/core/renderers/measurables/next_connection.js +16 -14
  144. package/core/renderers/measurables/output_connection.js +26 -20
  145. package/core/renderers/measurables/previous_connection.js +16 -15
  146. package/core/renderers/measurables/round_corner.js +20 -18
  147. package/core/renderers/measurables/row.js +184 -168
  148. package/core/renderers/measurables/spacer_row.js +38 -23
  149. package/core/renderers/measurables/square_corner.js +18 -16
  150. package/core/renderers/measurables/statement_input.js +23 -20
  151. package/core/renderers/measurables/top_row.js +88 -85
  152. package/core/renderers/minimalist/constants.js +8 -7
  153. package/core/renderers/minimalist/drawer.js +11 -10
  154. package/core/renderers/minimalist/info.js +18 -18
  155. package/core/renderers/minimalist/renderer.js +40 -39
  156. package/core/renderers/thrasos/info.js +258 -248
  157. package/core/renderers/thrasos/renderer.js +20 -20
  158. package/core/renderers/zelos/constants.js +898 -873
  159. package/core/renderers/zelos/drawer.js +186 -169
  160. package/core/renderers/zelos/info.js +502 -479
  161. package/core/renderers/zelos/marker_svg.js +129 -115
  162. package/core/renderers/zelos/measurables/bottom_row.js +31 -30
  163. package/core/renderers/zelos/measurables/inputs.js +22 -21
  164. package/core/renderers/zelos/measurables/row_elements.js +14 -13
  165. package/core/renderers/zelos/measurables/top_row.js +34 -33
  166. package/core/renderers/zelos/path_object.js +181 -180
  167. package/core/renderers/zelos/renderer.js +91 -92
  168. package/core/scrollbar.js +759 -713
  169. package/core/scrollbar_pair.js +250 -245
  170. package/core/serialization/blocks.js +26 -10
  171. package/core/serialization/workspaces.js +3 -2
  172. package/core/shortcut_registry.js +286 -277
  173. package/core/sprites.js +31 -0
  174. package/core/theme.js +135 -141
  175. package/core/theme_manager.js +147 -143
  176. package/core/toolbox/category.js +602 -576
  177. package/core/toolbox/collapsible_category.js +226 -227
  178. package/core/toolbox/separator.js +70 -61
  179. package/core/toolbox/toolbox.js +934 -927
  180. package/core/toolbox/toolbox_item.js +115 -99
  181. package/core/tooltip.js +108 -35
  182. package/core/touch.js +8 -3
  183. package/core/touch_gesture.js +254 -251
  184. package/core/trashcan.js +606 -595
  185. package/core/utils/coordinate.js +97 -95
  186. package/core/utils/dom.js +2 -2
  187. package/core/utils/global.js +2 -0
  188. package/core/utils/rect.js +41 -37
  189. package/core/utils/sentinel.js +25 -0
  190. package/core/utils/size.js +30 -27
  191. package/core/utils/svg.js +18 -16
  192. package/core/variable_map.js +325 -341
  193. package/core/variable_model.js +55 -54
  194. package/core/variables.js +9 -2
  195. package/core/variables_dynamic.js +3 -1
  196. package/core/warning.js +126 -120
  197. package/core/widgetdiv.js +4 -4
  198. package/core/workspace.js +685 -664
  199. package/core/workspace_audio.js +124 -118
  200. package/core/workspace_comment.js +308 -298
  201. package/core/workspace_comment_svg.js +1029 -951
  202. package/core/workspace_drag_surface_svg.js +147 -140
  203. package/core/workspace_dragger.js +70 -71
  204. package/core/workspace_svg.js +2322 -2297
  205. package/core/xml.js +30 -20
  206. package/core/zoom_controls.js +431 -439
  207. package/generators/dart/colour.js +56 -64
  208. package/generators/dart/lists.js +61 -50
  209. package/generators/dart/math.js +160 -148
  210. package/generators/dart/text.js +83 -61
  211. package/generators/javascript/colour.js +37 -34
  212. package/generators/javascript/lists.js +50 -43
  213. package/generators/javascript/math.js +123 -139
  214. package/generators/javascript/text.js +67 -81
  215. package/generators/lua/colour.js +25 -23
  216. package/generators/lua/lists.js +97 -69
  217. package/generators/lua/logic.js +1 -2
  218. package/generators/lua/math.js +182 -144
  219. package/generators/lua/text.js +116 -99
  220. package/generators/php/colour.js +38 -32
  221. package/generators/php/lists.js +109 -89
  222. package/generators/php/math.js +90 -81
  223. package/generators/php/text.js +63 -61
  224. package/generators/python/colour.js +18 -18
  225. package/generators/python/lists.js +38 -30
  226. package/generators/python/loops.js +12 -8
  227. package/generators/python/math.js +104 -106
  228. package/generators/python/text.js +34 -30
  229. package/msg/smn.js +436 -0
  230. package/package.json +7 -6
  231. package/blocks/all.js +0 -23
@@ -29,311 +29,328 @@ const {WorkspaceSvg} = goog.requireType('Blockly.WorkspaceSvg');
29
29
 
30
30
 
31
31
  /**
32
- * Class for a button in the flyout.
33
- * @param {!WorkspaceSvg} workspace The workspace in which to place this
34
- * button.
35
- * @param {!WorkspaceSvg} targetWorkspace The flyout's target workspace.
36
- * @param {!toolbox.ButtonOrLabelInfo} json
37
- * The JSON specifying the label/button.
38
- * @param {boolean} isLabel Whether this button should be styled as a label.
39
- * @constructor
40
- * @package
32
+ * Class for a button or label in the flyout.
41
33
  * @alias Blockly.FlyoutButton
42
34
  */
43
- const FlyoutButton = function(workspace, targetWorkspace, json, isLabel) {
44
- // Labels behave the same as buttons, but are styled differently.
45
-
35
+ class FlyoutButton {
46
36
  /**
47
- * @type {!WorkspaceSvg}
48
- * @private
37
+ * @param {!WorkspaceSvg} workspace The workspace in which to place this
38
+ * button.
39
+ * @param {!WorkspaceSvg} targetWorkspace The flyout's target workspace.
40
+ * @param {!toolbox.ButtonOrLabelInfo} json
41
+ * The JSON specifying the label/button.
42
+ * @param {boolean} isLabel Whether this button should be styled as a label.
43
+ * @package
49
44
  */
50
- this.workspace_ = workspace;
45
+ constructor(workspace, targetWorkspace, json, isLabel) {
46
+ /**
47
+ * @type {!WorkspaceSvg}
48
+ * @private
49
+ */
50
+ this.workspace_ = workspace;
51
+
52
+ /**
53
+ * @type {!WorkspaceSvg}
54
+ * @private
55
+ */
56
+ this.targetWorkspace_ = targetWorkspace;
57
+
58
+ /**
59
+ * @type {string}
60
+ * @private
61
+ */
62
+ this.text_ = json['text'];
63
+
64
+ /**
65
+ * @type {!Coordinate}
66
+ * @private
67
+ */
68
+ this.position_ = new Coordinate(0, 0);
69
+
70
+ /**
71
+ * Whether this button should be styled as a label.
72
+ * Labels behave the same as buttons, but are styled differently.
73
+ * @type {boolean}
74
+ * @private
75
+ */
76
+ this.isLabel_ = isLabel;
77
+
78
+ /**
79
+ * The key to the function called when this button is clicked.
80
+ * @type {string}
81
+ * @private
82
+ */
83
+ this.callbackKey_ = json['callbackKey'] ||
84
+ /* Check the lower case version too to satisfy IE */
85
+ json['callbackkey'];
86
+
87
+ /**
88
+ * If specified, a CSS class to add to this button.
89
+ * @type {?string}
90
+ * @private
91
+ */
92
+ this.cssClass_ = json['web-class'] || null;
93
+
94
+ /**
95
+ * Mouse up event data.
96
+ * @type {?browserEvents.Data}
97
+ * @private
98
+ */
99
+ this.onMouseUpWrapper_ = null;
100
+
101
+ /**
102
+ * The JSON specifying the label / button.
103
+ * @type {!toolbox.ButtonOrLabelInfo}
104
+ */
105
+ this.info = json;
106
+
107
+ /**
108
+ * The width of the button's rect.
109
+ * @type {number}
110
+ */
111
+ this.width = 0;
112
+
113
+ /**
114
+ * The height of the button's rect.
115
+ * @type {number}
116
+ */
117
+ this.height = 0;
118
+
119
+ /**
120
+ * The root SVG group for the button or label.
121
+ * @type {?SVGGElement}
122
+ * @private
123
+ */
124
+ this.svgGroup_ = null;
125
+
126
+ /**
127
+ * The SVG element with the text of the label or button.
128
+ * @type {?SVGTextElement}
129
+ * @private
130
+ */
131
+ this.svgText_ = null;
132
+ }
51
133
 
52
134
  /**
53
- * @type {!WorkspaceSvg}
54
- * @private
135
+ * Create the button elements.
136
+ * @return {!SVGElement} The button's SVG group.
55
137
  */
56
- this.targetWorkspace_ = targetWorkspace;
138
+ createDom() {
139
+ let cssClass = this.isLabel_ ? 'blocklyFlyoutLabel' : 'blocklyFlyoutButton';
140
+ if (this.cssClass_) {
141
+ cssClass += ' ' + this.cssClass_;
142
+ }
143
+
144
+ this.svgGroup_ = dom.createSvgElement(
145
+ Svg.G, {'class': cssClass}, this.workspace_.getCanvas());
146
+
147
+ let shadow;
148
+ if (!this.isLabel_) {
149
+ // Shadow rectangle (light source does not mirror in RTL).
150
+ shadow = dom.createSvgElement(
151
+ Svg.RECT, {
152
+ 'class': 'blocklyFlyoutButtonShadow',
153
+ 'rx': 4,
154
+ 'ry': 4,
155
+ 'x': 1,
156
+ 'y': 1,
157
+ },
158
+ this.svgGroup_);
159
+ }
160
+ // Background rectangle.
161
+ const rect = dom.createSvgElement(
162
+ Svg.RECT, {
163
+ 'class': this.isLabel_ ? 'blocklyFlyoutLabelBackground' :
164
+ 'blocklyFlyoutButtonBackground',
165
+ 'rx': 4,
166
+ 'ry': 4,
167
+ },
168
+ this.svgGroup_);
169
+
170
+ const svgText = dom.createSvgElement(
171
+ Svg.TEXT, {
172
+ 'class': this.isLabel_ ? 'blocklyFlyoutLabelText' : 'blocklyText',
173
+ 'x': 0,
174
+ 'y': 0,
175
+ 'text-anchor': 'middle',
176
+ },
177
+ this.svgGroup_);
178
+ let text = parsing.replaceMessageReferences(this.text_);
179
+ if (this.workspace_.RTL) {
180
+ // Force text to be RTL by adding an RLM.
181
+ text += '\u200F';
182
+ }
183
+ svgText.textContent = text;
184
+ if (this.isLabel_) {
185
+ this.svgText_ = svgText;
186
+ this.workspace_.getThemeManager().subscribe(
187
+ this.svgText_, 'flyoutForegroundColour', 'fill');
188
+ }
189
+
190
+ const fontSize = style.getComputedStyle(svgText, 'fontSize');
191
+ const fontWeight = style.getComputedStyle(svgText, 'fontWeight');
192
+ const fontFamily = style.getComputedStyle(svgText, 'fontFamily');
193
+ this.width = dom.getFastTextWidthWithSizeString(
194
+ svgText, fontSize, fontWeight, fontFamily);
195
+ const fontMetrics =
196
+ dom.measureFontMetrics(text, fontSize, fontWeight, fontFamily);
197
+ this.height = fontMetrics.height;
198
+
199
+ if (!this.isLabel_) {
200
+ this.width += 2 * FlyoutButton.TEXT_MARGIN_X;
201
+ this.height += 2 * FlyoutButton.TEXT_MARGIN_Y;
202
+ shadow.setAttribute('width', this.width);
203
+ shadow.setAttribute('height', this.height);
204
+ }
205
+ rect.setAttribute('width', this.width);
206
+ rect.setAttribute('height', this.height);
207
+
208
+ svgText.setAttribute('x', this.width / 2);
209
+ svgText.setAttribute(
210
+ 'y', this.height / 2 - fontMetrics.height / 2 + fontMetrics.baseline);
211
+
212
+ this.updateTransform_();
213
+
214
+ this.onMouseUpWrapper_ = browserEvents.conditionalBind(
215
+ this.svgGroup_, 'mouseup', this, this.onMouseUp_);
216
+ return this.svgGroup_;
217
+ }
57
218
 
58
219
  /**
59
- * @type {string}
60
- * @private
220
+ * Correctly position the flyout button and make it visible.
61
221
  */
62
- this.text_ = json['text'];
222
+ show() {
223
+ this.updateTransform_();
224
+ this.svgGroup_.setAttribute('display', 'block');
225
+ }
63
226
 
64
227
  /**
65
- * @type {!Coordinate}
228
+ * Update SVG attributes to match internal state.
66
229
  * @private
67
230
  */
68
- this.position_ = new Coordinate(0, 0);
231
+ updateTransform_() {
232
+ this.svgGroup_.setAttribute(
233
+ 'transform',
234
+ 'translate(' + this.position_.x + ',' + this.position_.y + ')');
235
+ }
69
236
 
70
237
  /**
71
- * Whether this button should be styled as a label.
72
- * @type {boolean}
73
- * @private
238
+ * Move the button to the given x, y coordinates.
239
+ * @param {number} x The new x coordinate.
240
+ * @param {number} y The new y coordinate.
74
241
  */
75
- this.isLabel_ = isLabel;
242
+ moveTo(x, y) {
243
+ this.position_.x = x;
244
+ this.position_.y = y;
245
+ this.updateTransform_();
246
+ }
76
247
 
77
248
  /**
78
- * The key to the function called when this button is clicked.
79
- * @type {string}
80
- * @private
249
+ * @return {boolean} Whether or not the button is a label.
81
250
  */
82
- this.callbackKey_ = json['callbackKey'] ||
83
- /* Check the lower case version too to satisfy IE */
84
- json['callbackkey'];
251
+ isLabel() {
252
+ return this.isLabel_;
253
+ }
85
254
 
86
255
  /**
87
- * If specified, a CSS class to add to this button.
88
- * @type {?string}
89
- * @private
256
+ * Location of the button.
257
+ * @return {!Coordinate} x, y coordinates.
258
+ * @package
90
259
  */
91
- this.cssClass_ = json['web-class'] || null;
260
+ getPosition() {
261
+ return this.position_;
262
+ }
92
263
 
93
264
  /**
94
- * Mouse up event data.
95
- * @type {?browserEvents.Data}
96
- * @private
265
+ * @return {string} Text of the button.
97
266
  */
98
- this.onMouseUpWrapper_ = null;
267
+ getButtonText() {
268
+ return this.text_;
269
+ }
99
270
 
100
271
  /**
101
- * The JSON specifying the label / button.
102
- * @type {!toolbox.ButtonOrLabelInfo}
272
+ * Get the button's target workspace.
273
+ * @return {!WorkspaceSvg} The target workspace of the flyout where this
274
+ * button resides.
103
275
  */
104
- this.info = json;
105
- };
106
-
107
- /**
108
- * The horizontal margin around the text in the button.
109
- */
110
- FlyoutButton.MARGIN_X = 5;
111
-
112
- /**
113
- * The vertical margin around the text in the button.
114
- */
115
- FlyoutButton.MARGIN_Y = 2;
116
-
117
- /**
118
- * The width of the button's rect.
119
- * @type {number}
120
- */
121
- FlyoutButton.prototype.width = 0;
122
-
123
- /**
124
- * The height of the button's rect.
125
- * @type {number}
126
- */
127
- FlyoutButton.prototype.height = 0;
128
-
129
- /**
130
- * Create the button elements.
131
- * @return {!SVGElement} The button's SVG group.
132
- */
133
- FlyoutButton.prototype.createDom = function() {
134
- let cssClass = this.isLabel_ ? 'blocklyFlyoutLabel' : 'blocklyFlyoutButton';
135
- if (this.cssClass_) {
136
- cssClass += ' ' + this.cssClass_;
276
+ getTargetWorkspace() {
277
+ return this.targetWorkspace_;
137
278
  }
138
279
 
139
- this.svgGroup_ = dom.createSvgElement(
140
- Svg.G, {'class': cssClass}, this.workspace_.getCanvas());
141
-
142
- let shadow;
143
- if (!this.isLabel_) {
144
- // Shadow rectangle (light source does not mirror in RTL).
145
- shadow = dom.createSvgElement(
146
- Svg.RECT, {
147
- 'class': 'blocklyFlyoutButtonShadow',
148
- 'rx': 4,
149
- 'ry': 4,
150
- 'x': 1,
151
- 'y': 1,
152
- },
153
- this.svgGroup_);
154
- }
155
- // Background rectangle.
156
- const rect = dom.createSvgElement(
157
- Svg.RECT, {
158
- 'class': this.isLabel_ ? 'blocklyFlyoutLabelBackground' :
159
- 'blocklyFlyoutButtonBackground',
160
- 'rx': 4,
161
- 'ry': 4,
162
- },
163
- this.svgGroup_);
164
-
165
- const svgText = dom.createSvgElement(
166
- Svg.TEXT, {
167
- 'class': this.isLabel_ ? 'blocklyFlyoutLabelText' : 'blocklyText',
168
- 'x': 0,
169
- 'y': 0,
170
- 'text-anchor': 'middle',
171
- },
172
- this.svgGroup_);
173
- let text = parsing.replaceMessageReferences(this.text_);
174
- if (this.workspace_.RTL) {
175
- // Force text to be RTL by adding an RLM.
176
- text += '\u200F';
177
- }
178
- svgText.textContent = text;
179
- if (this.isLabel_) {
180
- this.svgText_ = svgText;
181
- this.workspace_.getThemeManager().subscribe(
182
- this.svgText_, 'flyoutForegroundColour', 'fill');
280
+ /**
281
+ * Dispose of this button.
282
+ */
283
+ dispose() {
284
+ if (this.onMouseUpWrapper_) {
285
+ browserEvents.unbind(this.onMouseUpWrapper_);
286
+ }
287
+ if (this.svgGroup_) {
288
+ dom.removeNode(this.svgGroup_);
289
+ }
290
+ if (this.svgText_) {
291
+ this.workspace_.getThemeManager().unsubscribe(this.svgText_);
292
+ }
183
293
  }
184
294
 
185
- const fontSize = style.getComputedStyle(svgText, 'fontSize');
186
- const fontWeight = style.getComputedStyle(svgText, 'fontWeight');
187
- const fontFamily = style.getComputedStyle(svgText, 'fontFamily');
188
- this.width = dom.getFastTextWidthWithSizeString(
189
- svgText, fontSize, fontWeight, fontFamily);
190
- const fontMetrics =
191
- dom.measureFontMetrics(text, fontSize, fontWeight, fontFamily);
192
- this.height = fontMetrics.height;
193
-
194
- if (!this.isLabel_) {
195
- this.width += 2 * FlyoutButton.MARGIN_X;
196
- this.height += 2 * FlyoutButton.MARGIN_Y;
197
- shadow.setAttribute('width', this.width);
198
- shadow.setAttribute('height', this.height);
295
+ /**
296
+ * Do something when the button is clicked.
297
+ * @param {!Event} e Mouse up event.
298
+ * @private
299
+ */
300
+ onMouseUp_(e) {
301
+ const gesture = this.targetWorkspace_.getGesture(e);
302
+ if (gesture) {
303
+ gesture.cancel();
304
+ }
305
+
306
+ if (this.isLabel_ && this.callbackKey_) {
307
+ console.warn(
308
+ 'Labels should not have callbacks. Label text: ' + this.text_);
309
+ } else if (
310
+ !this.isLabel_ &&
311
+ !(this.callbackKey_ &&
312
+ this.targetWorkspace_.getButtonCallback(this.callbackKey_))) {
313
+ console.warn('Buttons should have callbacks. Button text: ' + this.text_);
314
+ } else if (!this.isLabel_) {
315
+ this.targetWorkspace_.getButtonCallback(this.callbackKey_)(this);
316
+ }
199
317
  }
200
- rect.setAttribute('width', this.width);
201
- rect.setAttribute('height', this.height);
202
-
203
- svgText.setAttribute('x', this.width / 2);
204
- svgText.setAttribute(
205
- 'y', this.height / 2 - fontMetrics.height / 2 + fontMetrics.baseline);
206
-
207
- this.updateTransform_();
208
-
209
- this.onMouseUpWrapper_ = browserEvents.conditionalBind(
210
- this.svgGroup_, 'mouseup', this, this.onMouseUp_);
211
- return this.svgGroup_;
212
- };
213
-
214
- /**
215
- * Correctly position the flyout button and make it visible.
216
- */
217
- FlyoutButton.prototype.show = function() {
218
- this.updateTransform_();
219
- this.svgGroup_.setAttribute('display', 'block');
220
- };
221
-
222
- /**
223
- * Update SVG attributes to match internal state.
224
- * @private
225
- */
226
- FlyoutButton.prototype.updateTransform_ = function() {
227
- this.svgGroup_.setAttribute(
228
- 'transform',
229
- 'translate(' + this.position_.x + ',' + this.position_.y + ')');
230
- };
231
-
232
- /**
233
- * Move the button to the given x, y coordinates.
234
- * @param {number} x The new x coordinate.
235
- * @param {number} y The new y coordinate.
236
- */
237
- FlyoutButton.prototype.moveTo = function(x, y) {
238
- this.position_.x = x;
239
- this.position_.y = y;
240
- this.updateTransform_();
241
- };
242
-
243
- /**
244
- * @return {boolean} Whether or not the button is a label.
245
- */
246
- FlyoutButton.prototype.isLabel = function() {
247
- return this.isLabel_;
248
- };
249
-
250
- /**
251
- * Location of the button.
252
- * @return {!Coordinate} x, y coordinates.
253
- * @package
254
- */
255
- FlyoutButton.prototype.getPosition = function() {
256
- return this.position_;
257
- };
258
-
259
- /**
260
- * @return {string} Text of the button.
261
- */
262
- FlyoutButton.prototype.getButtonText = function() {
263
- return this.text_;
264
- };
265
-
266
- /**
267
- * Get the button's target workspace.
268
- * @return {!WorkspaceSvg} The target workspace of the flyout where this
269
- * button resides.
270
- */
271
- FlyoutButton.prototype.getTargetWorkspace = function() {
272
- return this.targetWorkspace_;
273
- };
318
+ }
274
319
 
275
320
  /**
276
- * Dispose of this button.
321
+ * The horizontal margin around the text in the button.
277
322
  */
278
- FlyoutButton.prototype.dispose = function() {
279
- if (this.onMouseUpWrapper_) {
280
- browserEvents.unbind(this.onMouseUpWrapper_);
281
- }
282
- if (this.svgGroup_) {
283
- dom.removeNode(this.svgGroup_);
284
- }
285
- if (this.svgText_) {
286
- this.workspace_.getThemeManager().unsubscribe(this.svgText_);
287
- }
288
- };
323
+ FlyoutButton.TEXT_MARGIN_X = 5;
289
324
 
290
325
  /**
291
- * Do something when the button is clicked.
292
- * @param {!Event} e Mouse up event.
293
- * @private
326
+ * The vertical margin around the text in the button.
294
327
  */
295
- FlyoutButton.prototype.onMouseUp_ = function(e) {
296
- const gesture = this.targetWorkspace_.getGesture(e);
297
- if (gesture) {
298
- gesture.cancel();
299
- }
300
-
301
- if (this.isLabel_ && this.callbackKey_) {
302
- console.warn('Labels should not have callbacks. Label text: ' + this.text_);
303
- } else if (
304
- !this.isLabel_ &&
305
- !(this.callbackKey_ &&
306
- this.targetWorkspace_.getButtonCallback(this.callbackKey_))) {
307
- console.warn('Buttons should have callbacks. Button text: ' + this.text_);
308
- } else if (!this.isLabel_) {
309
- this.targetWorkspace_.getButtonCallback(this.callbackKey_)(this);
310
- }
311
- };
328
+ FlyoutButton.TEXT_MARGIN_Y = 2;
312
329
 
313
330
  /**
314
331
  * CSS for buttons and labels. See css.js for use.
315
332
  */
316
333
  Css.register(`
317
- .blocklyFlyoutButton {
318
- fill: #888;
319
- cursor: default;
320
- }
321
-
322
- .blocklyFlyoutButtonShadow {
323
- fill: #666;
324
- }
325
-
326
- .blocklyFlyoutButton:hover {
327
- fill: #aaa;
328
- }
329
-
330
- .blocklyFlyoutLabel {
331
- cursor: default;
332
- }
333
-
334
- .blocklyFlyoutLabelBackground {
335
- opacity: 0;
336
- }
334
+ .blocklyFlyoutButton {
335
+ fill: #888;
336
+ cursor: default;
337
+ }
338
+
339
+ .blocklyFlyoutButtonShadow {
340
+ fill: #666;
341
+ }
342
+
343
+ .blocklyFlyoutButton:hover {
344
+ fill: #aaa;
345
+ }
346
+
347
+ .blocklyFlyoutLabel {
348
+ cursor: default;
349
+ }
350
+
351
+ .blocklyFlyoutLabelBackground {
352
+ opacity: 0;
353
+ }
337
354
  `);
338
355
 
339
356
  exports.FlyoutButton = FlyoutButton;