blockly 7.20211209.2 → 8.0.0

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 (262) hide show
  1. package/blockly.d.ts +18963 -18432
  2. package/blockly.min.js +852 -844
  3. package/blockly_compressed.js +669 -664
  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 +41 -27
  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 +146 -141
  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 +19 -9
  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/dart_compressed.js +40 -43
  208. package/dart_compressed.js.map +1 -1
  209. package/generators/dart/colour.js +56 -64
  210. package/generators/dart/lists.js +61 -50
  211. package/generators/dart/math.js +160 -148
  212. package/generators/dart/text.js +83 -61
  213. package/generators/javascript/colour.js +37 -34
  214. package/generators/javascript/lists.js +50 -43
  215. package/generators/javascript/math.js +123 -139
  216. package/generators/javascript/text.js +67 -81
  217. package/generators/lua/colour.js +25 -23
  218. package/generators/lua/lists.js +97 -69
  219. package/generators/lua/logic.js +1 -2
  220. package/generators/lua/math.js +182 -144
  221. package/generators/lua/text.js +116 -99
  222. package/generators/php/colour.js +38 -32
  223. package/generators/php/lists.js +109 -89
  224. package/generators/php/math.js +90 -81
  225. package/generators/php/text.js +63 -61
  226. package/generators/python/colour.js +18 -18
  227. package/generators/python/lists.js +38 -30
  228. package/generators/python/loops.js +12 -8
  229. package/generators/python/math.js +104 -106
  230. package/generators/python/text.js +34 -30
  231. package/javascript_compressed.js +37 -39
  232. package/javascript_compressed.js.map +1 -1
  233. package/lua_compressed.js +39 -42
  234. package/lua_compressed.js.map +1 -1
  235. package/msg/az.js +2 -2
  236. package/msg/be.js +4 -4
  237. package/msg/cs.js +15 -15
  238. package/msg/de.js +1 -1
  239. package/msg/diq.js +1 -1
  240. package/msg/eo.js +1 -1
  241. package/msg/es.js +1 -1
  242. package/msg/fa.js +1 -1
  243. package/msg/fr.js +4 -4
  244. package/msg/he.js +1 -1
  245. package/msg/hr.js +2 -2
  246. package/msg/hy.js +2 -2
  247. package/msg/id.js +12 -12
  248. package/msg/inh.js +14 -14
  249. package/msg/ja.js +7 -7
  250. package/msg/lv.js +29 -29
  251. package/msg/pa.js +3 -3
  252. package/msg/smn.js +436 -0
  253. package/msg/te.js +1 -1
  254. package/msg/yue.js +1 -1
  255. package/msg/zh-hans.js +3 -3
  256. package/msg/zh-hant.js +3 -3
  257. package/package.json +7 -6
  258. package/php_compressed.js +38 -42
  259. package/php_compressed.js.map +1 -1
  260. package/python_compressed.js +26 -25
  261. package/python_compressed.js.map +1 -1
  262. package/blocks/all.js +0 -23
package/core/common.js CHANGED
@@ -17,7 +17,8 @@
17
17
  */
18
18
  goog.module('Blockly.common');
19
19
 
20
- const {Blocks} = goog.require('Blockly.blocks');
20
+ /* eslint-disable-next-line no-unused-vars */
21
+ const {BlockDefinition, Blocks} = goog.require('Blockly.blocks');
21
22
  /* eslint-disable-next-line no-unused-vars */
22
23
  const {Connection} = goog.requireType('Blockly.Connection');
23
24
  /* eslint-disable-next-line no-unused-vars */
@@ -210,27 +211,55 @@ const jsonInitFactory = function(jsonDef) {
210
211
  * @alias Blockly.common.defineBlocksWithJsonArray
211
212
  */
212
213
  const defineBlocksWithJsonArray = function(jsonArray) {
214
+ defineBlocks(createBlockDefinitionsFromJsonArray(jsonArray));
215
+ };
216
+ exports.defineBlocksWithJsonArray = defineBlocksWithJsonArray;
217
+
218
+ /**
219
+ * Define blocks from an array of JSON block definitions, as might be generated
220
+ * by the Blockly Developer Tools.
221
+ * @param {!Array<!Object>} jsonArray An array of JSON block definitions.
222
+ * @return {!Object<string, !BlockDefinition>} A map of the block
223
+ * definitions created.
224
+ * @alias Blockly.common.defineBlocksWithJsonArray
225
+ */
226
+ const createBlockDefinitionsFromJsonArray = function(jsonArray) {
227
+ const /** @type {!Object<string,!BlockDefinition>} */ blocks = {};
213
228
  for (let i = 0; i < jsonArray.length; i++) {
214
229
  const elem = jsonArray[i];
215
230
  if (!elem) {
231
+ console.warn(`Block definition #${i} in JSON array is ${elem}. Skipping`);
232
+ continue;
233
+ }
234
+ const type = elem.type;
235
+ if (!type) {
216
236
  console.warn(
217
- 'Block definition #' + i + ' in JSON array is ' + elem + '. ' +
237
+ `Block definition #${i} in JSON array is missing a type attribute. ` +
218
238
  'Skipping.');
219
- } else {
220
- const typename = elem.type;
221
- if (!typename) {
222
- console.warn(
223
- 'Block definition #' + i +
224
- ' in JSON array is missing a type attribute. Skipping.');
225
- } else {
226
- if (Blocks[typename]) {
227
- console.warn(
228
- 'Block definition #' + i + ' in JSON array' +
229
- ' overwrites prior definition of "' + typename + '".');
230
- }
231
- Blocks[typename] = {init: jsonInitFactory(elem)};
232
- }
239
+ continue;
233
240
  }
241
+ blocks[type] = {init: jsonInitFactory(elem)};
234
242
  }
243
+ return blocks;
235
244
  };
236
- exports.defineBlocksWithJsonArray = defineBlocksWithJsonArray;
245
+ exports.createBlockDefinitionsFromJsonArray =
246
+ createBlockDefinitionsFromJsonArray;
247
+
248
+ /**
249
+ * Add the specified block definitions to the block definitions
250
+ * dictionary (Blockly.Blocks).
251
+ * @param {!Object<string,!BlockDefinition>} blocks A map of block
252
+ * type names to block definitions.
253
+ * @alias Blockly.common.defineBlocks
254
+ */
255
+ const defineBlocks = function(blocks) {
256
+ // Iterate over own enumerable properties.
257
+ for (const type of Object.keys(blocks)) {
258
+ const definition = blocks[type];
259
+ if (type in Blocks) {
260
+ console.warn(`Block definiton "${type}" overwrites previous definition.`);
261
+ }
262
+ Blocks[type] = definition;
263
+ }
264
+ };
265
+ exports.defineBlocks = defineBlocks;
@@ -31,210 +31,217 @@ const {IPositionable} = goog.requireType('Blockly.IPositionable');
31
31
 
32
32
  /**
33
33
  * Manager for all items registered with the workspace.
34
- * @constructor
35
34
  * @alias Blockly.ComponentManager
36
35
  */
37
- const ComponentManager = function() {
36
+ class ComponentManager {
38
37
  /**
39
- * A map of the components registered with the workspace, mapped to id.
40
- * @type {!Object<string, !ComponentManager.ComponentDatum>}
41
- * @private
38
+ * Creates a new ComponentManager instance.
42
39
  */
43
- this.componentData_ = Object.create(null);
40
+ constructor() {
41
+ /**
42
+ * A map of the components registered with the workspace, mapped to id.
43
+ * @type {!Object<string, !ComponentManager.ComponentDatum>}
44
+ * @private
45
+ */
46
+ this.componentData_ = Object.create(null);
47
+
48
+ /**
49
+ * A map of capabilities to component IDs.
50
+ * @type {!Object<string, !Array<string>>}
51
+ * @private
52
+ */
53
+ this.capabilityToComponentIds_ = Object.create(null);
54
+ }
44
55
 
45
56
  /**
46
- * A map of capabilities to component IDs.
47
- * @type {!Object<string, !Array<string>>}
48
- * @private
57
+ * Adds a component.
58
+ * @param {!ComponentManager.ComponentDatum} componentInfo The data for
59
+ * the component to register.
60
+ * @param {boolean=} opt_allowOverrides True to prevent an error when
61
+ * overriding an already registered item.
49
62
  */
50
- this.capabilityToComponentIds_ = Object.create(null);
51
- };
52
-
53
- /**
54
- * An object storing component information.
55
- * @typedef {{
56
- * component: !IComponent,
57
- * capabilities: (
58
- * !Array<string|!ComponentManager.Capability<!IComponent>>
59
- * ),
60
- * weight: number
61
- * }}
62
- */
63
- ComponentManager.ComponentDatum;
64
-
65
- /**
66
- * Adds a component.
67
- * @param {!ComponentManager.ComponentDatum} componentInfo The data for
68
- * the component to register.
69
- * @param {boolean=} opt_allowOverrides True to prevent an error when overriding
70
- * an already registered item.
71
- */
72
- ComponentManager.prototype.addComponent = function(
73
- componentInfo, opt_allowOverrides) {
74
- // Don't throw an error if opt_allowOverrides is true.
75
- const id = componentInfo.component.id;
76
- if (!opt_allowOverrides && this.componentData_[id]) {
77
- throw Error(
78
- 'Plugin "' + id + '" with capabilities "' +
79
- this.componentData_[id].capabilities + '" already added.');
63
+ addComponent(componentInfo, opt_allowOverrides) {
64
+ // Don't throw an error if opt_allowOverrides is true.
65
+ const id = componentInfo.component.id;
66
+ if (!opt_allowOverrides && this.componentData_[id]) {
67
+ throw Error(
68
+ 'Plugin "' + id + '" with capabilities "' +
69
+ this.componentData_[id].capabilities + '" already added.');
70
+ }
71
+ this.componentData_[id] = componentInfo;
72
+ const stringCapabilities = [];
73
+ for (let i = 0; i < componentInfo.capabilities.length; i++) {
74
+ const capability = String(componentInfo.capabilities[i]).toLowerCase();
75
+ stringCapabilities.push(capability);
76
+ if (this.capabilityToComponentIds_[capability] === undefined) {
77
+ this.capabilityToComponentIds_[capability] = [id];
78
+ } else {
79
+ this.capabilityToComponentIds_[capability].push(id);
80
+ }
81
+ }
82
+ this.componentData_[id].capabilities = stringCapabilities;
80
83
  }
81
- this.componentData_[id] = componentInfo;
82
- const stringCapabilities = [];
83
- for (let i = 0; i < componentInfo.capabilities.length; i++) {
84
- const capability = String(componentInfo.capabilities[i]).toLowerCase();
85
- stringCapabilities.push(capability);
86
- if (this.capabilityToComponentIds_[capability] === undefined) {
87
- this.capabilityToComponentIds_[capability] = [id];
88
- } else {
89
- this.capabilityToComponentIds_[capability].push(id);
84
+
85
+ /**
86
+ * Removes a component.
87
+ * @param {string} id The ID of the component to remove.
88
+ */
89
+ removeComponent(id) {
90
+ const componentInfo = this.componentData_[id];
91
+ if (!componentInfo) {
92
+ return;
93
+ }
94
+ for (let i = 0; i < componentInfo.capabilities.length; i++) {
95
+ const capability = String(componentInfo.capabilities[i]).toLowerCase();
96
+ arrayUtils.removeElem(this.capabilityToComponentIds_[capability], id);
90
97
  }
98
+ delete this.componentData_[id];
91
99
  }
92
- this.componentData_[id].capabilities = stringCapabilities;
93
- };
94
100
 
95
- /**
96
- * Removes a component.
97
- * @param {string} id The ID of the component to remove.
98
- */
99
- ComponentManager.prototype.removeComponent = function(id) {
100
- const componentInfo = this.componentData_[id];
101
- if (!componentInfo) {
102
- return;
101
+ /**
102
+ * Adds a capability to a existing registered component.
103
+ * @param {string} id The ID of the component to add the capability to.
104
+ * @param {string|!ComponentManager.Capability<T>} capability The
105
+ * capability to add.
106
+ * @template T
107
+ */
108
+ addCapability(id, capability) {
109
+ if (!this.getComponent(id)) {
110
+ throw Error(
111
+ 'Cannot add capability, "' + capability + '". Plugin "' + id +
112
+ '" has not been added to the ComponentManager');
113
+ }
114
+ if (this.hasCapability(id, capability)) {
115
+ console.warn(
116
+ 'Plugin "' + id + 'already has capability "' + capability + '"');
117
+ return;
118
+ }
119
+ capability = String(capability).toLowerCase();
120
+ this.componentData_[id].capabilities.push(capability);
121
+ this.capabilityToComponentIds_[capability].push(id);
103
122
  }
104
- for (let i = 0; i < componentInfo.capabilities.length; i++) {
105
- const capability = String(componentInfo.capabilities[i]).toLowerCase();
123
+
124
+ /**
125
+ * Removes a capability from an existing registered component.
126
+ * @param {string} id The ID of the component to remove the capability from.
127
+ * @param {string|!ComponentManager.Capability<T>} capability The
128
+ * capability to remove.
129
+ * @template T
130
+ */
131
+ removeCapability(id, capability) {
132
+ if (!this.getComponent(id)) {
133
+ throw Error(
134
+ 'Cannot remove capability, "' + capability + '". Plugin "' + id +
135
+ '" has not been added to the ComponentManager');
136
+ }
137
+ if (!this.hasCapability(id, capability)) {
138
+ console.warn(
139
+ 'Plugin "' + id + 'doesn\'t have capability "' + capability +
140
+ '" to remove');
141
+ return;
142
+ }
143
+ capability = String(capability).toLowerCase();
144
+ arrayUtils.removeElem(this.componentData_[id].capabilities, capability);
106
145
  arrayUtils.removeElem(this.capabilityToComponentIds_[capability], id);
107
146
  }
108
- delete this.componentData_[id];
109
- };
110
147
 
111
- /**
112
- * Adds a capability to a existing registered component.
113
- * @param {string} id The ID of the component to add the capability to.
114
- * @param {string|!ComponentManager.Capability<T>} capability The
115
- * capability to add.
116
- * @template T
117
- */
118
- ComponentManager.prototype.addCapability = function(id, capability) {
119
- if (!this.getComponent(id)) {
120
- throw Error(
121
- 'Cannot add capability, "' + capability + '". Plugin "' + id +
122
- '" has not been added to the ComponentManager');
123
- }
124
- if (this.hasCapability(id, capability)) {
125
- console.warn(
126
- 'Plugin "' + id + 'already has capability "' + capability + '"');
127
- return;
148
+ /**
149
+ * Returns whether the component with this id has the specified capability.
150
+ * @param {string} id The ID of the component to check.
151
+ * @param {string|!ComponentManager.Capability<T>} capability The
152
+ * capability to check for.
153
+ * @return {boolean} Whether the component has the capability.
154
+ * @template T
155
+ */
156
+ hasCapability(id, capability) {
157
+ capability = String(capability).toLowerCase();
158
+ return this.componentData_[id].capabilities.indexOf(capability) !== -1;
128
159
  }
129
- capability = String(capability).toLowerCase();
130
- this.componentData_[id].capabilities.push(capability);
131
- this.capabilityToComponentIds_[capability].push(id);
132
- };
133
160
 
134
- /**
135
- * Removes a capability from an existing registered component.
136
- * @param {string} id The ID of the component to remove the capability from.
137
- * @param {string|!ComponentManager.Capability<T>} capability The
138
- * capability to remove.
139
- * @template T
140
- */
141
- ComponentManager.prototype.removeCapability = function(id, capability) {
142
- if (!this.getComponent(id)) {
143
- throw Error(
144
- 'Cannot remove capability, "' + capability + '". Plugin "' + id +
145
- '" has not been added to the ComponentManager');
146
- }
147
- if (!this.hasCapability(id, capability)) {
148
- console.warn(
149
- 'Plugin "' + id + 'doesn\'t have capability "' + capability +
150
- '" to remove');
151
- return;
161
+ /**
162
+ * Gets the component with the given ID.
163
+ * @param {string} id The ID of the component to get.
164
+ * @return {!IComponent|undefined} The component with the given name
165
+ * or undefined if not found.
166
+ */
167
+ getComponent(id) {
168
+ return this.componentData_[id] && this.componentData_[id].component;
152
169
  }
153
- capability = String(capability).toLowerCase();
154
- arrayUtils.removeElem(this.componentData_[id].capabilities, capability);
155
- arrayUtils.removeElem(this.capabilityToComponentIds_[capability], id);
156
- };
157
-
158
- /**
159
- * Returns whether the component with this id has the specified capability.
160
- * @param {string} id The ID of the component to check.
161
- * @param {string|!ComponentManager.Capability<T>} capability The
162
- * capability to check for.
163
- * @return {boolean} Whether the component has the capability.
164
- * @template T
165
- */
166
- ComponentManager.prototype.hasCapability = function(id, capability) {
167
- capability = String(capability).toLowerCase();
168
- return this.componentData_[id].capabilities.indexOf(capability) !== -1;
169
- };
170
170
 
171
- /**
172
- * Gets the component with the given ID.
173
- * @param {string} id The ID of the component to get.
174
- * @return {!IComponent|undefined} The component with the given name
175
- * or undefined if not found.
176
- */
177
- ComponentManager.prototype.getComponent = function(id) {
178
- return this.componentData_[id] && this.componentData_[id].component;
179
- };
171
+ /**
172
+ * Gets all the components with the specified capability.
173
+ * @param {string|!ComponentManager.Capability<T>
174
+ * } capability The capability of the component.
175
+ * @param {boolean} sorted Whether to return list ordered by weights.
176
+ * @return {!Array<T>} The components that match the specified capability.
177
+ * @template T
178
+ */
179
+ getComponents(capability, sorted) {
180
+ capability = String(capability).toLowerCase();
181
+ const componentIds = this.capabilityToComponentIds_[capability];
182
+ if (!componentIds) {
183
+ return [];
184
+ }
185
+ const components = [];
186
+ if (sorted) {
187
+ const componentDataList = [];
188
+ const componentData = this.componentData_;
189
+ componentIds.forEach(function(id) {
190
+ componentDataList.push(componentData[id]);
191
+ });
192
+ componentDataList.sort(function(a, b) {
193
+ return a.weight - b.weight;
194
+ });
195
+ componentDataList.forEach(function(ComponentDatum) {
196
+ components.push(ComponentDatum.component);
197
+ });
198
+ } else {
199
+ const componentData = this.componentData_;
200
+ componentIds.forEach(function(id) {
201
+ components.push(componentData[id].component);
202
+ });
203
+ }
204
+ return components;
205
+ }
206
+ }
180
207
 
181
208
  /**
182
- * Gets all the components with the specified capability.
183
- * @param {string|!ComponentManager.Capability<T>
184
- * } capability The capability of the component.
185
- * @param {boolean} sorted Whether to return list ordered by weights.
186
- * @return {!Array<T>} The components that match the specified capability.
187
- * @template T
209
+ * An object storing component information.
210
+ * @typedef {{
211
+ * component: !IComponent,
212
+ * capabilities: (
213
+ * !Array<string|!ComponentManager.Capability<!IComponent>>
214
+ * ),
215
+ * weight: number
216
+ * }}
188
217
  */
189
- ComponentManager.prototype.getComponents = function(capability, sorted) {
190
- capability = String(capability).toLowerCase();
191
- const componentIds = this.capabilityToComponentIds_[capability];
192
- if (!componentIds) {
193
- return [];
194
- }
195
- const components = [];
196
- if (sorted) {
197
- const componentDataList = [];
198
- const componentData = this.componentData_;
199
- componentIds.forEach(function(id) {
200
- componentDataList.push(componentData[id]);
201
- });
202
- componentDataList.sort(function(a, b) {
203
- return a.weight - b.weight;
204
- });
205
- componentDataList.forEach(function(ComponentDatum) {
206
- components.push(ComponentDatum.component);
207
- });
208
- } else {
209
- const componentData = this.componentData_;
210
- componentIds.forEach(function(id) {
211
- components.push(componentData[id].component);
212
- });
213
- }
214
- return components;
215
- };
218
+ ComponentManager.ComponentDatum;
216
219
 
217
220
  /**
218
221
  * A name with the capability of the element stored in the generic.
219
- * @param {string} name The name of the component capability.
220
- * @constructor
221
222
  * @template T
223
+ * @alias Blockly.ComponentManager.Capability
222
224
  */
223
- ComponentManager.Capability = function(name) {
225
+ ComponentManager.Capability = class {
224
226
  /**
225
- * @type {string}
226
- * @private
227
+ * @param {string} name The name of the component capability.
227
228
  */
228
- this.name_ = name;
229
- };
229
+ constructor(name) {
230
+ /**
231
+ * @type {string}
232
+ * @private
233
+ */
234
+ this.name_ = name;
235
+ }
230
236
 
231
- /**
232
- * Returns the name of the capability.
233
- * @return {string} The name.
234
- * @override
235
- */
236
- ComponentManager.Capability.prototype.toString = function() {
237
- return this.name_;
237
+ /**
238
+ * Returns the name of the capability.
239
+ * @return {string} The name.
240
+ * @override
241
+ */
242
+ toString() {
243
+ return this.name_;
244
+ }
238
245
  };
239
246
 
240
247
  /** @type {!ComponentManager.Capability<!IPositionable>} */
package/core/config.js ADDED
@@ -0,0 +1,87 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ /**
8
+ * @fileoverview All the values that we expect developers to be able to change
9
+ * before injecting Blockly. Changing these values during run time is not
10
+ * generally recommended.
11
+ */
12
+ 'use strict';
13
+
14
+ /**
15
+ * All the values that we expect developers to be able to change
16
+ * before injecting Blockly. Changing these values during run time is not
17
+ * generally recommended.
18
+ * @namespace Blockly.config
19
+ */
20
+ goog.module('Blockly.config');
21
+
22
+
23
+ /**
24
+ * All the values that we expect developers to be able to change
25
+ * before injecting Blockly.
26
+ * @typedef {{
27
+ * dragRadius: number,
28
+ * flyoutDragRadius: number,
29
+ * snapRadius: number,
30
+ * currentConnectionPreference: number,
31
+ * bumpDelay: number,
32
+ * connectingSnapRadius: number
33
+ * }}
34
+ */
35
+ let Config; // eslint-disable-line no-unused-vars
36
+
37
+ /**
38
+ * Default snap radius.
39
+ * @type {number}
40
+ */
41
+ const DEFAULT_SNAP_RADIUS = 28;
42
+
43
+ /**
44
+ * Object holding all the values on Blockly that we expect developers to be
45
+ * able to change.
46
+ * @type {Config}
47
+ */
48
+ const config = {
49
+ /**
50
+ * Number of pixels the mouse must move before a drag starts.
51
+ * @alias Blockly.config.dragRadius
52
+ */
53
+ dragRadius: 5,
54
+ /**
55
+ * Number of pixels the mouse must move before a drag/scroll starts from the
56
+ * flyout. Because the drag-intention is determined when this is reached, it
57
+ * is larger than dragRadius so that the drag-direction is clearer.
58
+ * @alias Blockly.config.flyoutDragRadius
59
+ */
60
+ flyoutDragRadius: 10,
61
+ /**
62
+ * Maximum misalignment between connections for them to snap together.
63
+ * @alias Blockly.config.snapRadius
64
+ */
65
+ snapRadius: DEFAULT_SNAP_RADIUS,
66
+ /**
67
+ * Maximum misalignment between connections for them to snap together.
68
+ * This should be the same as the snap radius.
69
+ * @alias Blockly.config.connectingSnapRadius
70
+ */
71
+ connectingSnapRadius: DEFAULT_SNAP_RADIUS,
72
+ /**
73
+ * How much to prefer staying connected to the current connection over moving
74
+ * to a new connection. The current previewed connection is considered to be
75
+ * this much closer to the matching connection on the block than it actually
76
+ * is.
77
+ * @alias Blockly.config.currentConnectionPreference
78
+ */
79
+ currentConnectionPreference: 8,
80
+ /**
81
+ * Delay in ms between trigger and bumping unconnected block out of alignment.
82
+ * @alias Blockly.config.bumpDelay
83
+ */
84
+ bumpDelay: 250,
85
+ };
86
+
87
+ exports.config = config;