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/input.js
CHANGED
|
@@ -15,18 +15,6 @@
|
|
|
15
15
|
*/
|
|
16
16
|
goog.module('Blockly.Input');
|
|
17
17
|
|
|
18
|
-
/**
|
|
19
|
-
* Enum for alignment of inputs.
|
|
20
|
-
* @enum {number}
|
|
21
|
-
* @alias Blockly.Input.Align
|
|
22
|
-
*/
|
|
23
|
-
const Align = {
|
|
24
|
-
LEFT: -1,
|
|
25
|
-
CENTRE: 0,
|
|
26
|
-
RIGHT: 1,
|
|
27
|
-
};
|
|
28
|
-
exports.Align = Align;
|
|
29
|
-
|
|
30
18
|
const fieldRegistry = goog.require('Blockly.fieldRegistry');
|
|
31
19
|
/* eslint-disable-next-line no-unused-vars */
|
|
32
20
|
const {BlockSvg} = goog.requireType('Blockly.BlockSvg');
|
|
@@ -42,285 +30,306 @@ const {inputTypes} = goog.require('Blockly.inputTypes');
|
|
|
42
30
|
/** @suppress {extraRequire} */
|
|
43
31
|
goog.require('Blockly.FieldLabel');
|
|
44
32
|
|
|
33
|
+
|
|
45
34
|
/**
|
|
46
35
|
* Class for an input with an optional field.
|
|
47
|
-
* @param {number} type The type of the input.
|
|
48
|
-
* @param {string} name Language-neutral identifier which may used to find this
|
|
49
|
-
* input again.
|
|
50
|
-
* @param {!Block} block The block containing this input.
|
|
51
|
-
* @param {Connection} connection Optional connection for this input.
|
|
52
|
-
* @constructor
|
|
53
36
|
* @alias Blockly.Input
|
|
54
37
|
*/
|
|
55
|
-
|
|
56
|
-
if (type !== inputTypes.DUMMY && !name) {
|
|
57
|
-
throw Error('Value inputs and statement inputs must have non-empty name.');
|
|
58
|
-
}
|
|
59
|
-
/** @type {number} */
|
|
60
|
-
this.type = type;
|
|
61
|
-
/** @type {string} */
|
|
62
|
-
this.name = name;
|
|
38
|
+
class Input {
|
|
63
39
|
/**
|
|
64
|
-
* @
|
|
65
|
-
* @
|
|
40
|
+
* @param {number} type The type of the input.
|
|
41
|
+
* @param {string} name Language-neutral identifier which may used to find
|
|
42
|
+
* this input again.
|
|
43
|
+
* @param {!Block} block The block containing this input.
|
|
44
|
+
* @param {Connection} connection Optional connection for this input.
|
|
66
45
|
*/
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
Input.prototype.visible_ = true;
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Get the source block for this input.
|
|
89
|
-
* @return {?Block} The source block, or null if there is none.
|
|
90
|
-
*/
|
|
91
|
-
Input.prototype.getSourceBlock = function() {
|
|
92
|
-
return this.sourceBlock_;
|
|
93
|
-
};
|
|
46
|
+
constructor(type, name, block, connection) {
|
|
47
|
+
if (type !== inputTypes.DUMMY && !name) {
|
|
48
|
+
throw Error(
|
|
49
|
+
'Value inputs and statement inputs must have non-empty name.');
|
|
50
|
+
}
|
|
51
|
+
/** @type {number} */
|
|
52
|
+
this.type = type;
|
|
53
|
+
/** @type {string} */
|
|
54
|
+
this.name = name;
|
|
55
|
+
/**
|
|
56
|
+
* @type {!Block}
|
|
57
|
+
* @private
|
|
58
|
+
*/
|
|
59
|
+
this.sourceBlock_ = block;
|
|
60
|
+
/** @type {Connection} */
|
|
61
|
+
this.connection = connection;
|
|
62
|
+
/** @type {!Array<!Field>} */
|
|
63
|
+
this.fieldRow = [];
|
|
94
64
|
|
|
95
|
-
/**
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
* this field again. Should be unique to the host block.
|
|
101
|
-
* @return {!Input} The input being append to (to allow chaining).
|
|
102
|
-
*/
|
|
103
|
-
Input.prototype.appendField = function(field, opt_name) {
|
|
104
|
-
this.insertFieldAt(this.fieldRow.length, field, opt_name);
|
|
105
|
-
return this;
|
|
106
|
-
};
|
|
65
|
+
/**
|
|
66
|
+
* Alignment of input's fields (left, right or centre).
|
|
67
|
+
* @type {number}
|
|
68
|
+
*/
|
|
69
|
+
this.align = Align.LEFT;
|
|
107
70
|
|
|
108
|
-
/**
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
* this field again. Should be unique to the host block.
|
|
115
|
-
* @return {number} The index following the last inserted field.
|
|
116
|
-
*/
|
|
117
|
-
Input.prototype.insertFieldAt = function(index, field, opt_name) {
|
|
118
|
-
if (index < 0 || index > this.fieldRow.length) {
|
|
119
|
-
throw Error('index ' + index + ' out of bounds.');
|
|
120
|
-
}
|
|
121
|
-
// Falsy field values don't generate a field, unless the field is an empty
|
|
122
|
-
// string and named.
|
|
123
|
-
if (!field && !(field === '' && opt_name)) {
|
|
124
|
-
return index;
|
|
71
|
+
/**
|
|
72
|
+
* Is the input visible?
|
|
73
|
+
* @type {boolean}
|
|
74
|
+
* @private
|
|
75
|
+
*/
|
|
76
|
+
this.visible_ = true;
|
|
125
77
|
}
|
|
126
78
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
79
|
+
/**
|
|
80
|
+
* Get the source block for this input.
|
|
81
|
+
* @return {?Block} The source block, or null if there is none.
|
|
82
|
+
*/
|
|
83
|
+
getSourceBlock() {
|
|
84
|
+
return this.sourceBlock_;
|
|
133
85
|
}
|
|
134
86
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Add a field (or label from string), and all prefix and suffix fields, to
|
|
89
|
+
* the end of the input's field row.
|
|
90
|
+
* @param {string|!Field} field Something to add as a field.
|
|
91
|
+
* @param {string=} opt_name Language-neutral identifier which may used to
|
|
92
|
+
* find this field again. Should be unique to the host block.
|
|
93
|
+
* @return {!Input} The input being append to (to allow chaining).
|
|
94
|
+
*/
|
|
95
|
+
appendField(field, opt_name) {
|
|
96
|
+
this.insertFieldAt(this.fieldRow.length, field, opt_name);
|
|
97
|
+
return this;
|
|
139
98
|
}
|
|
140
|
-
field.name = opt_name;
|
|
141
|
-
field.setVisible(this.isVisible());
|
|
142
99
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
100
|
+
/**
|
|
101
|
+
* Inserts a field (or label from string), and all prefix and suffix fields,
|
|
102
|
+
* at the location of the input's field row.
|
|
103
|
+
* @param {number} index The index at which to insert field.
|
|
104
|
+
* @param {string|!Field} field Something to add as a field.
|
|
105
|
+
* @param {string=} opt_name Language-neutral identifier which may used to
|
|
106
|
+
* find this field again. Should be unique to the host block.
|
|
107
|
+
* @return {number} The index following the last inserted field.
|
|
108
|
+
*/
|
|
109
|
+
insertFieldAt(index, field, opt_name) {
|
|
110
|
+
if (index < 0 || index > this.fieldRow.length) {
|
|
111
|
+
throw Error('index ' + index + ' out of bounds.');
|
|
112
|
+
}
|
|
113
|
+
// Falsy field values don't generate a field, unless the field is an empty
|
|
114
|
+
// string and named.
|
|
115
|
+
if (!field && !(field === '' && opt_name)) {
|
|
116
|
+
return index;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Generate a FieldLabel when given a plain text field.
|
|
120
|
+
if (typeof field === 'string') {
|
|
121
|
+
field = /** @type {!Field} **/ (fieldRegistry.fromJson({
|
|
122
|
+
'type': 'field_label',
|
|
123
|
+
'text': field,
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
field.setSourceBlock(this.sourceBlock_);
|
|
128
|
+
if (this.sourceBlock_.rendered) {
|
|
129
|
+
field.init();
|
|
130
|
+
field.applyColour();
|
|
131
|
+
}
|
|
132
|
+
field.name = opt_name;
|
|
133
|
+
field.setVisible(this.isVisible());
|
|
134
|
+
|
|
135
|
+
if (field.prefixField) {
|
|
136
|
+
// Add any prefix.
|
|
137
|
+
index = this.insertFieldAt(index, field.prefixField);
|
|
138
|
+
}
|
|
139
|
+
// Add the field to the field row.
|
|
140
|
+
this.fieldRow.splice(index, 0, field);
|
|
141
|
+
index++;
|
|
142
|
+
if (field.suffixField) {
|
|
143
|
+
// Add any suffix.
|
|
144
|
+
index = this.insertFieldAt(index, field.suffixField);
|
|
145
|
+
}
|
|
154
146
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
147
|
+
if (this.sourceBlock_.rendered) {
|
|
148
|
+
this.sourceBlock_ = /** @type {!BlockSvg} */ (this.sourceBlock_);
|
|
149
|
+
this.sourceBlock_.render();
|
|
150
|
+
// Adding a field will cause the block to change shape.
|
|
151
|
+
this.sourceBlock_.bumpNeighbours();
|
|
152
|
+
}
|
|
153
|
+
return index;
|
|
160
154
|
}
|
|
161
|
-
return index;
|
|
162
|
-
};
|
|
163
155
|
|
|
164
|
-
/**
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
field.
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
156
|
+
/**
|
|
157
|
+
* Remove a field from this input.
|
|
158
|
+
* @param {string} name The name of the field.
|
|
159
|
+
* @param {boolean=} opt_quiet True to prevent an error if field is not
|
|
160
|
+
* present.
|
|
161
|
+
* @return {boolean} True if operation succeeds, false if field is not present
|
|
162
|
+
* and opt_quiet is true.
|
|
163
|
+
* @throws {Error} if the field is not present and opt_quiet is false.
|
|
164
|
+
*/
|
|
165
|
+
removeField(name, opt_quiet) {
|
|
166
|
+
for (let i = 0, field; (field = this.fieldRow[i]); i++) {
|
|
167
|
+
if (field.name === name) {
|
|
168
|
+
field.dispose();
|
|
169
|
+
this.fieldRow.splice(i, 1);
|
|
170
|
+
if (this.sourceBlock_.rendered) {
|
|
171
|
+
this.sourceBlock_ = /** @type {!BlockSvg} */ (this.sourceBlock_);
|
|
172
|
+
this.sourceBlock_.render();
|
|
173
|
+
// Removing a field will cause the block to change shape.
|
|
174
|
+
this.sourceBlock_.bumpNeighbours();
|
|
175
|
+
}
|
|
176
|
+
return true;
|
|
182
177
|
}
|
|
183
|
-
return true;
|
|
184
178
|
}
|
|
179
|
+
if (opt_quiet) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
throw Error('Field "' + name + '" not found.');
|
|
185
183
|
}
|
|
186
|
-
|
|
187
|
-
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Gets whether this input is visible or not.
|
|
187
|
+
* @return {boolean} True if visible.
|
|
188
|
+
*/
|
|
189
|
+
isVisible() {
|
|
190
|
+
return this.visible_;
|
|
188
191
|
}
|
|
189
|
-
throw Error('Field "' + name + '" not found.');
|
|
190
|
-
};
|
|
191
192
|
|
|
192
|
-
/**
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
193
|
+
/**
|
|
194
|
+
* Sets whether this input is visible or not.
|
|
195
|
+
* Should only be used to collapse/uncollapse a block.
|
|
196
|
+
* @param {boolean} visible True if visible.
|
|
197
|
+
* @return {!Array<!BlockSvg>} List of blocks to render.
|
|
198
|
+
* @package
|
|
199
|
+
*/
|
|
200
|
+
setVisible(visible) {
|
|
201
|
+
// Note: Currently there are only unit tests for block.setCollapsed()
|
|
202
|
+
// because this function is package. If this function goes back to being a
|
|
203
|
+
// public API tests (lots of tests) should be added.
|
|
204
|
+
let renderList = [];
|
|
205
|
+
if (this.visible_ === visible) {
|
|
206
|
+
return renderList;
|
|
207
|
+
}
|
|
208
|
+
this.visible_ = visible;
|
|
199
209
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
210
|
+
for (let y = 0, field; (field = this.fieldRow[y]); y++) {
|
|
211
|
+
field.setVisible(visible);
|
|
212
|
+
}
|
|
213
|
+
if (this.connection) {
|
|
214
|
+
this.connection =
|
|
215
|
+
/** @type {!RenderedConnection} */ (this.connection);
|
|
216
|
+
// Has a connection.
|
|
217
|
+
if (visible) {
|
|
218
|
+
renderList = this.connection.startTrackingAll();
|
|
219
|
+
} else {
|
|
220
|
+
this.connection.stopTrackingAll();
|
|
221
|
+
}
|
|
222
|
+
const child = this.connection.targetBlock();
|
|
223
|
+
if (child) {
|
|
224
|
+
child.getSvgRoot().style.display = visible ? 'block' : 'none';
|
|
225
|
+
}
|
|
226
|
+
}
|
|
213
227
|
return renderList;
|
|
214
228
|
}
|
|
215
|
-
this.visible_ = visible;
|
|
216
229
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
if (visible) {
|
|
225
|
-
renderList = this.connection.startTrackingAll();
|
|
226
|
-
} else {
|
|
227
|
-
this.connection.stopTrackingAll();
|
|
228
|
-
}
|
|
229
|
-
const child = this.connection.targetBlock();
|
|
230
|
-
if (child) {
|
|
231
|
-
child.getSvgRoot().style.display = visible ? 'block' : 'none';
|
|
230
|
+
/**
|
|
231
|
+
* Mark all fields on this input as dirty.
|
|
232
|
+
* @package
|
|
233
|
+
*/
|
|
234
|
+
markDirty() {
|
|
235
|
+
for (let y = 0, field; (field = this.fieldRow[y]); y++) {
|
|
236
|
+
field.markDirty();
|
|
232
237
|
}
|
|
233
238
|
}
|
|
234
|
-
return renderList;
|
|
235
|
-
};
|
|
236
239
|
|
|
237
|
-
/**
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
Input
|
|
242
|
-
|
|
243
|
-
|
|
240
|
+
/**
|
|
241
|
+
* Change a connection's compatibility.
|
|
242
|
+
* @param {string|Array<string>|null} check Compatible value type or
|
|
243
|
+
* list of value types. Null if all types are compatible.
|
|
244
|
+
* @return {!Input} The input being modified (to allow chaining).
|
|
245
|
+
*/
|
|
246
|
+
setCheck(check) {
|
|
247
|
+
if (!this.connection) {
|
|
248
|
+
throw Error('This input does not have a connection.');
|
|
249
|
+
}
|
|
250
|
+
this.connection.setCheck(check);
|
|
251
|
+
return this;
|
|
244
252
|
}
|
|
245
|
-
};
|
|
246
253
|
|
|
247
|
-
/**
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
254
|
+
/**
|
|
255
|
+
* Change the alignment of the connection's field(s).
|
|
256
|
+
* @param {number} align One of the values of Align
|
|
257
|
+
* In RTL mode directions are reversed, and Align.RIGHT aligns to the left.
|
|
258
|
+
* @return {!Input} The input being modified (to allow chaining).
|
|
259
|
+
*/
|
|
260
|
+
setAlign(align) {
|
|
261
|
+
this.align = align;
|
|
262
|
+
if (this.sourceBlock_.rendered) {
|
|
263
|
+
this.sourceBlock_ = /** @type {!BlockSvg} */ (this.sourceBlock_);
|
|
264
|
+
this.sourceBlock_.render();
|
|
265
|
+
}
|
|
266
|
+
return this;
|
|
256
267
|
}
|
|
257
|
-
this.connection.setCheck(check);
|
|
258
|
-
return this;
|
|
259
|
-
};
|
|
260
268
|
|
|
261
|
-
/**
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
this.
|
|
271
|
-
this
|
|
269
|
+
/**
|
|
270
|
+
* Changes the connection's shadow block.
|
|
271
|
+
* @param {?Element} shadow DOM representation of a block or null.
|
|
272
|
+
* @return {!Input} The input being modified (to allow chaining).
|
|
273
|
+
*/
|
|
274
|
+
setShadowDom(shadow) {
|
|
275
|
+
if (!this.connection) {
|
|
276
|
+
throw Error('This input does not have a connection.');
|
|
277
|
+
}
|
|
278
|
+
this.connection.setShadowDom(shadow);
|
|
279
|
+
return this;
|
|
272
280
|
}
|
|
273
|
-
return this;
|
|
274
|
-
};
|
|
275
281
|
|
|
276
|
-
/**
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
282
|
+
/**
|
|
283
|
+
* Returns the XML representation of the connection's shadow block.
|
|
284
|
+
* @return {?Element} Shadow DOM representation of a block or null.
|
|
285
|
+
*/
|
|
286
|
+
getShadowDom() {
|
|
287
|
+
if (!this.connection) {
|
|
288
|
+
throw Error('This input does not have a connection.');
|
|
289
|
+
}
|
|
290
|
+
return this.connection.getShadowDom();
|
|
284
291
|
}
|
|
285
|
-
this.connection.setShadowDom(shadow);
|
|
286
|
-
return this;
|
|
287
|
-
};
|
|
288
292
|
|
|
289
|
-
/**
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
293
|
+
/**
|
|
294
|
+
* Initialize the fields on this input.
|
|
295
|
+
*/
|
|
296
|
+
init() {
|
|
297
|
+
if (!this.sourceBlock_.workspace.rendered) {
|
|
298
|
+
return; // Headless blocks don't need fields initialized.
|
|
299
|
+
}
|
|
300
|
+
for (let i = 0; i < this.fieldRow.length; i++) {
|
|
301
|
+
this.fieldRow[i].init();
|
|
302
|
+
}
|
|
296
303
|
}
|
|
297
|
-
return this.connection.getShadowDom();
|
|
298
|
-
};
|
|
299
304
|
|
|
300
|
-
/**
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
this.
|
|
305
|
+
/**
|
|
306
|
+
* Sever all links to this input.
|
|
307
|
+
* @suppress {checkTypes}
|
|
308
|
+
*/
|
|
309
|
+
dispose() {
|
|
310
|
+
for (let i = 0, field; (field = this.fieldRow[i]); i++) {
|
|
311
|
+
field.dispose();
|
|
312
|
+
}
|
|
313
|
+
if (this.connection) {
|
|
314
|
+
this.connection.dispose();
|
|
315
|
+
}
|
|
316
|
+
this.sourceBlock_ = null;
|
|
309
317
|
}
|
|
310
|
-
}
|
|
318
|
+
}
|
|
311
319
|
|
|
312
320
|
/**
|
|
313
|
-
*
|
|
314
|
-
* @
|
|
321
|
+
* Enum for alignment of inputs.
|
|
322
|
+
* @enum {number}
|
|
323
|
+
* @alias Blockly.Input.Align
|
|
315
324
|
*/
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
if (this.connection) {
|
|
321
|
-
this.connection.dispose();
|
|
322
|
-
}
|
|
323
|
-
this.sourceBlock_ = null;
|
|
325
|
+
const Align = {
|
|
326
|
+
LEFT: -1,
|
|
327
|
+
CENTRE: 0,
|
|
328
|
+
RIGHT: 1,
|
|
324
329
|
};
|
|
330
|
+
exports.Align = Align;
|
|
331
|
+
|
|
332
|
+
// Add Align to Input so that `Blockly.Input.Align` is publicly accessible.
|
|
333
|
+
Input.Align = Align;
|
|
325
334
|
|
|
326
335
|
exports.Input = Input;
|