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.
- package/blockly.d.ts +18963 -18432
- package/blockly.min.js +852 -844
- package/blockly_compressed.js +669 -664
- package/blockly_compressed.js.map +1 -1
- package/blocks/blocks.js +47 -0
- package/blocks/colour.js +13 -3
- package/blocks/lists.js +22 -13
- package/blocks/logic.js +13 -3
- package/blocks/loops.js +24 -11
- package/blocks/math.js +12 -3
- package/blocks/procedures.js +41 -27
- package/blocks/text.js +22 -13
- package/blocks/variables.js +14 -3
- package/blocks/variables_dynamic.js +13 -3
- package/blocks_compressed.js +146 -141
- package/blocks_compressed.js.map +1 -1
- package/core/block.js +1869 -1814
- package/core/block_drag_surface.js +201 -200
- package/core/block_dragger.js +377 -373
- package/core/block_svg.js +1593 -1479
- package/core/blockly.js +8 -22
- package/core/blocks.js +9 -2
- package/core/browser_events.js +22 -5
- package/core/bubble.js +841 -797
- package/core/bubble_dragger.js +213 -206
- package/core/bump_objects.js +2 -2
- package/core/clipboard.js +9 -9
- package/core/comment.js +353 -332
- package/core/common.js +46 -17
- package/core/component_manager.js +181 -174
- package/core/config.js +87 -0
- package/core/connection.js +595 -584
- package/core/connection_checker.js +242 -244
- package/core/connection_db.js +235 -230
- package/core/contextmenu.js +9 -6
- package/core/contextmenu_items.js +1 -2
- package/core/contextmenu_registry.js +93 -89
- package/core/css.js +474 -474
- package/core/delete_area.js +45 -42
- package/core/drag_target.js +57 -56
- package/core/dropdowndiv.js +153 -163
- package/core/events/events.js +2 -2
- package/core/events/events_abstract.js +89 -77
- package/core/events/events_block_base.js +37 -36
- package/core/events/events_block_change.js +130 -124
- package/core/events/events_block_create.js +73 -71
- package/core/events/events_block_delete.js +84 -82
- package/core/events/events_block_drag.js +50 -49
- package/core/events/events_block_move.js +147 -140
- package/core/events/events_bubble_open.js +51 -50
- package/core/events/events_click.js +48 -44
- package/core/events/events_comment_base.js +72 -69
- package/core/events/events_comment_change.js +63 -61
- package/core/events/events_comment_create.js +44 -42
- package/core/events/events_comment_delete.js +42 -40
- package/core/events/events_comment_move.js +106 -104
- package/core/events/events_marker_move.js +65 -64
- package/core/events/events_selected.js +46 -45
- package/core/events/events_theme_change.js +36 -35
- package/core/events/events_toolbox_item_select.js +46 -45
- package/core/events/events_trashcan_open.js +37 -36
- package/core/events/events_ui.js +47 -46
- package/core/events/events_ui_base.js +30 -29
- package/core/events/events_var_base.js +37 -36
- package/core/events/events_var_create.js +50 -48
- package/core/events/events_var_delete.js +50 -48
- package/core/events/events_var_rename.js +51 -49
- package/core/events/events_viewport.js +66 -65
- package/core/events/utils.js +29 -14
- package/core/events/workspace_events.js +49 -55
- package/core/extensions.js +4 -3
- package/core/field.js +1061 -997
- package/core/field_angle.js +462 -442
- package/core/field_checkbox.js +194 -182
- package/core/field_colour.js +519 -505
- package/core/field_dropdown.js +617 -598
- package/core/field_image.js +229 -220
- package/core/field_label.js +102 -91
- package/core/field_label_serializable.js +42 -41
- package/core/field_multilineinput.js +372 -358
- package/core/field_number.js +272 -253
- package/core/field_textinput.js +499 -467
- package/core/field_variable.js +458 -420
- package/core/flyout_base.js +1005 -952
- package/core/flyout_button.js +277 -260
- package/core/flyout_horizontal.js +304 -302
- package/core/flyout_metrics_manager.js +64 -64
- package/core/flyout_vertical.js +306 -300
- package/core/generator.js +459 -446
- package/core/gesture.js +829 -813
- package/core/grid.js +166 -163
- package/core/icon.js +168 -159
- package/core/inject.js +7 -5
- package/core/input.js +257 -248
- package/core/insertion_marker_manager.js +655 -624
- package/core/internal_constants.js +0 -129
- package/core/keyboard_nav/ast_node.js +605 -596
- package/core/keyboard_nav/basic_cursor.js +166 -165
- package/core/keyboard_nav/cursor.js +99 -97
- package/core/keyboard_nav/marker.js +83 -79
- package/core/keyboard_nav/tab_navigate_cursor.js +18 -23
- package/core/marker_manager.js +153 -141
- package/core/menu.js +377 -372
- package/core/menuitem.js +223 -217
- package/core/metrics_manager.js +403 -390
- package/core/mutator.js +468 -437
- package/core/names.js +229 -188
- package/core/options.js +290 -284
- package/core/procedures.js +29 -17
- package/core/registry.js +19 -16
- package/core/rendered_connection.js +482 -463
- package/core/renderers/common/block_rendering.js +9 -3
- package/core/renderers/common/constants.js +1119 -1112
- package/core/renderers/common/debug.js +14 -0
- package/core/renderers/common/debugger.js +338 -316
- package/core/renderers/common/drawer.js +380 -370
- package/core/renderers/common/i_path_object.js +2 -2
- package/core/renderers/common/info.js +626 -618
- package/core/renderers/common/marker_svg.js +579 -541
- package/core/renderers/common/path_object.js +203 -200
- package/core/renderers/common/renderer.js +220 -218
- package/core/renderers/geras/constants.js +36 -36
- package/core/renderers/geras/drawer.js +155 -147
- package/core/renderers/geras/highlight_constants.js +244 -238
- package/core/renderers/geras/highlighter.js +231 -179
- package/core/renderers/geras/info.js +392 -369
- package/core/renderers/geras/measurables/inline_input.js +25 -19
- package/core/renderers/geras/measurables/statement_input.js +23 -17
- package/core/renderers/geras/path_object.js +106 -121
- package/core/renderers/geras/renderer.js +96 -98
- package/core/renderers/measurables/base.js +30 -18
- package/core/renderers/measurables/bottom_row.js +83 -80
- package/core/renderers/measurables/connection.js +22 -15
- package/core/renderers/measurables/external_value_input.js +35 -22
- package/core/renderers/measurables/field.js +35 -20
- package/core/renderers/measurables/hat.js +18 -13
- package/core/renderers/measurables/icon.js +24 -17
- package/core/renderers/measurables/in_row_spacer.js +15 -13
- package/core/renderers/measurables/inline_input.js +43 -33
- package/core/renderers/measurables/input_connection.js +41 -28
- package/core/renderers/measurables/input_row.js +50 -44
- package/core/renderers/measurables/jagged_edge.js +14 -12
- package/core/renderers/measurables/next_connection.js +16 -14
- package/core/renderers/measurables/output_connection.js +26 -20
- package/core/renderers/measurables/previous_connection.js +16 -15
- package/core/renderers/measurables/round_corner.js +20 -18
- package/core/renderers/measurables/row.js +184 -168
- package/core/renderers/measurables/spacer_row.js +38 -23
- package/core/renderers/measurables/square_corner.js +18 -16
- package/core/renderers/measurables/statement_input.js +23 -20
- package/core/renderers/measurables/top_row.js +88 -85
- package/core/renderers/minimalist/constants.js +8 -7
- package/core/renderers/minimalist/drawer.js +11 -10
- package/core/renderers/minimalist/info.js +18 -18
- package/core/renderers/minimalist/renderer.js +40 -39
- package/core/renderers/thrasos/info.js +258 -248
- package/core/renderers/thrasos/renderer.js +20 -20
- package/core/renderers/zelos/constants.js +898 -873
- package/core/renderers/zelos/drawer.js +186 -169
- package/core/renderers/zelos/info.js +502 -479
- package/core/renderers/zelos/marker_svg.js +129 -115
- package/core/renderers/zelos/measurables/bottom_row.js +31 -30
- package/core/renderers/zelos/measurables/inputs.js +22 -21
- package/core/renderers/zelos/measurables/row_elements.js +14 -13
- package/core/renderers/zelos/measurables/top_row.js +34 -33
- package/core/renderers/zelos/path_object.js +181 -180
- package/core/renderers/zelos/renderer.js +91 -92
- package/core/scrollbar.js +759 -713
- package/core/scrollbar_pair.js +250 -245
- package/core/serialization/blocks.js +19 -9
- package/core/serialization/workspaces.js +3 -2
- package/core/shortcut_registry.js +286 -277
- package/core/sprites.js +31 -0
- package/core/theme.js +135 -141
- package/core/theme_manager.js +147 -143
- package/core/toolbox/category.js +602 -576
- package/core/toolbox/collapsible_category.js +226 -227
- package/core/toolbox/separator.js +70 -61
- package/core/toolbox/toolbox.js +934 -927
- package/core/toolbox/toolbox_item.js +115 -99
- package/core/tooltip.js +108 -35
- package/core/touch.js +8 -3
- package/core/touch_gesture.js +254 -251
- package/core/trashcan.js +606 -595
- package/core/utils/coordinate.js +97 -95
- package/core/utils/dom.js +2 -2
- package/core/utils/global.js +2 -0
- package/core/utils/rect.js +41 -37
- package/core/utils/sentinel.js +25 -0
- package/core/utils/size.js +30 -27
- package/core/utils/svg.js +18 -16
- package/core/variable_map.js +325 -341
- package/core/variable_model.js +55 -54
- package/core/variables.js +9 -2
- package/core/variables_dynamic.js +3 -1
- package/core/warning.js +126 -120
- package/core/widgetdiv.js +4 -4
- package/core/workspace.js +685 -664
- package/core/workspace_audio.js +124 -118
- package/core/workspace_comment.js +308 -298
- package/core/workspace_comment_svg.js +1029 -951
- package/core/workspace_drag_surface_svg.js +147 -140
- package/core/workspace_dragger.js +70 -71
- package/core/workspace_svg.js +2322 -2297
- package/core/xml.js +30 -20
- package/core/zoom_controls.js +431 -439
- package/dart_compressed.js +40 -43
- package/dart_compressed.js.map +1 -1
- package/generators/dart/colour.js +56 -64
- package/generators/dart/lists.js +61 -50
- package/generators/dart/math.js +160 -148
- package/generators/dart/text.js +83 -61
- package/generators/javascript/colour.js +37 -34
- package/generators/javascript/lists.js +50 -43
- package/generators/javascript/math.js +123 -139
- package/generators/javascript/text.js +67 -81
- package/generators/lua/colour.js +25 -23
- package/generators/lua/lists.js +97 -69
- package/generators/lua/logic.js +1 -2
- package/generators/lua/math.js +182 -144
- package/generators/lua/text.js +116 -99
- package/generators/php/colour.js +38 -32
- package/generators/php/lists.js +109 -89
- package/generators/php/math.js +90 -81
- package/generators/php/text.js +63 -61
- package/generators/python/colour.js +18 -18
- package/generators/python/lists.js +38 -30
- package/generators/python/loops.js +12 -8
- package/generators/python/math.js +104 -106
- package/generators/python/text.js +34 -30
- package/javascript_compressed.js +37 -39
- package/javascript_compressed.js.map +1 -1
- package/lua_compressed.js +39 -42
- package/lua_compressed.js.map +1 -1
- package/msg/az.js +2 -2
- package/msg/be.js +4 -4
- package/msg/cs.js +15 -15
- package/msg/de.js +1 -1
- package/msg/diq.js +1 -1
- package/msg/eo.js +1 -1
- package/msg/es.js +1 -1
- package/msg/fa.js +1 -1
- package/msg/fr.js +4 -4
- package/msg/he.js +1 -1
- package/msg/hr.js +2 -2
- package/msg/hy.js +2 -2
- package/msg/id.js +12 -12
- package/msg/inh.js +14 -14
- package/msg/ja.js +7 -7
- package/msg/lv.js +29 -29
- package/msg/pa.js +3 -3
- package/msg/smn.js +436 -0
- package/msg/te.js +1 -1
- package/msg/yue.js +1 -1
- package/msg/zh-hans.js +3 -3
- package/msg/zh-hant.js +3 -3
- package/package.json +7 -6
- package/php_compressed.js +38 -42
- package/php_compressed.js.map +1 -1
- package/python_compressed.js +26 -25
- package/python_compressed.js.map +1 -1
- 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
|
-
|
|
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
|
-
|
|
237
|
+
`Block definition #${i} in JSON array is missing a type attribute. ` +
|
|
218
238
|
'Skipping.');
|
|
219
|
-
|
|
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.
|
|
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
|
-
|
|
36
|
+
class ComponentManager {
|
|
38
37
|
/**
|
|
39
|
-
*
|
|
40
|
-
* @type {!Object<string, !ComponentManager.ComponentDatum>}
|
|
41
|
-
* @private
|
|
38
|
+
* Creates a new ComponentManager instance.
|
|
42
39
|
*/
|
|
43
|
-
|
|
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
|
-
*
|
|
47
|
-
* @
|
|
48
|
-
*
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
-
|
|
105
|
-
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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
|
-
*
|
|
183
|
-
* @
|
|
184
|
-
*
|
|
185
|
-
*
|
|
186
|
-
*
|
|
187
|
-
*
|
|
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.
|
|
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 =
|
|
225
|
+
ComponentManager.Capability = class {
|
|
224
226
|
/**
|
|
225
|
-
* @
|
|
226
|
-
* @private
|
|
227
|
+
* @param {string} name The name of the component capability.
|
|
227
228
|
*/
|
|
228
|
-
|
|
229
|
-
|
|
229
|
+
constructor(name) {
|
|
230
|
+
/**
|
|
231
|
+
* @type {string}
|
|
232
|
+
* @private
|
|
233
|
+
*/
|
|
234
|
+
this.name_ = name;
|
|
235
|
+
}
|
|
230
236
|
|
|
231
|
-
/**
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
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;
|