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
|
@@ -31,282 +31,280 @@ const {RenderedConnection} = goog.requireType('Blockly.RenderedConnection');
|
|
|
31
31
|
/**
|
|
32
32
|
* Class for connection type checking logic.
|
|
33
33
|
* @implements {IConnectionChecker}
|
|
34
|
-
* @constructor
|
|
35
34
|
* @alias Blockly.ConnectionChecker
|
|
36
35
|
*/
|
|
37
|
-
|
|
36
|
+
class ConnectionChecker {
|
|
37
|
+
/**
|
|
38
|
+
* Check whether the current connection can connect with the target
|
|
39
|
+
* connection.
|
|
40
|
+
* @param {Connection} a Connection to check compatibility with.
|
|
41
|
+
* @param {Connection} b Connection to check compatibility with.
|
|
42
|
+
* @param {boolean} isDragging True if the connection is being made by
|
|
43
|
+
* dragging a block.
|
|
44
|
+
* @param {number=} opt_distance The max allowable distance between the
|
|
45
|
+
* connections for drag checks.
|
|
46
|
+
* @return {boolean} Whether the connection is legal.
|
|
47
|
+
* @public
|
|
48
|
+
*/
|
|
49
|
+
canConnect(a, b, isDragging, opt_distance) {
|
|
50
|
+
return this.canConnectWithReason(a, b, isDragging, opt_distance) ===
|
|
51
|
+
Connection.CAN_CONNECT;
|
|
52
|
+
}
|
|
38
53
|
|
|
39
|
-
/**
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
/**
|
|
55
|
+
* Checks whether the current connection can connect with the target
|
|
56
|
+
* connection, and return an error code if there are problems.
|
|
57
|
+
* @param {Connection} a Connection to check compatibility with.
|
|
58
|
+
* @param {Connection} b Connection to check compatibility with.
|
|
59
|
+
* @param {boolean} isDragging True if the connection is being made by
|
|
60
|
+
* dragging a block.
|
|
61
|
+
* @param {number=} opt_distance The max allowable distance between the
|
|
62
|
+
* connections for drag checks.
|
|
63
|
+
* @return {number} Connection.CAN_CONNECT if the connection is legal,
|
|
64
|
+
* an error code otherwise.
|
|
65
|
+
* @public
|
|
66
|
+
*/
|
|
67
|
+
canConnectWithReason(a, b, isDragging, opt_distance) {
|
|
68
|
+
const safety = this.doSafetyChecks(a, b);
|
|
69
|
+
if (safety !== Connection.CAN_CONNECT) {
|
|
70
|
+
return safety;
|
|
71
|
+
}
|
|
56
72
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
* a block.
|
|
64
|
-
* @param {number=} opt_distance The max allowable distance between the
|
|
65
|
-
* connections for drag checks.
|
|
66
|
-
* @return {number} Connection.CAN_CONNECT if the connection is legal,
|
|
67
|
-
* an error code otherwise.
|
|
68
|
-
* @public
|
|
69
|
-
*/
|
|
70
|
-
ConnectionChecker.prototype.canConnectWithReason = function(
|
|
71
|
-
a, b, isDragging, opt_distance) {
|
|
72
|
-
const safety = this.doSafetyChecks(a, b);
|
|
73
|
-
if (safety !== Connection.CAN_CONNECT) {
|
|
74
|
-
return safety;
|
|
75
|
-
}
|
|
73
|
+
// If the safety checks passed, both connections are non-null.
|
|
74
|
+
const connOne = /** @type {!Connection} **/ (a);
|
|
75
|
+
const connTwo = /** @type {!Connection} **/ (b);
|
|
76
|
+
if (!this.doTypeChecks(connOne, connTwo)) {
|
|
77
|
+
return Connection.REASON_CHECKS_FAILED;
|
|
78
|
+
}
|
|
76
79
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
80
|
+
if (isDragging &&
|
|
81
|
+
!this.doDragChecks(
|
|
82
|
+
/** @type {!RenderedConnection} **/ (a),
|
|
83
|
+
/** @type {!RenderedConnection} **/ (b), opt_distance || 0)) {
|
|
84
|
+
return Connection.REASON_DRAG_CHECKS_FAILED;
|
|
85
|
+
}
|
|
83
86
|
|
|
84
|
-
|
|
85
|
-
!this.doDragChecks(
|
|
86
|
-
/** @type {!RenderedConnection} **/ (a),
|
|
87
|
-
/** @type {!RenderedConnection} **/ (b), opt_distance || 0)) {
|
|
88
|
-
return Connection.REASON_DRAG_CHECKS_FAILED;
|
|
87
|
+
return Connection.CAN_CONNECT;
|
|
89
88
|
}
|
|
90
89
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
90
|
+
/**
|
|
91
|
+
* Helper method that translates a connection error code into a string.
|
|
92
|
+
* @param {number} errorCode The error code.
|
|
93
|
+
* @param {Connection} a One of the two connections being checked.
|
|
94
|
+
* @param {Connection} b The second of the two connections being
|
|
95
|
+
* checked.
|
|
96
|
+
* @return {string} A developer-readable error string.
|
|
97
|
+
* @public
|
|
98
|
+
*/
|
|
99
|
+
getErrorMessage(errorCode, a, b) {
|
|
100
|
+
switch (errorCode) {
|
|
101
|
+
case Connection.REASON_SELF_CONNECTION:
|
|
102
|
+
return 'Attempted to connect a block to itself.';
|
|
103
|
+
case Connection.REASON_DIFFERENT_WORKSPACES:
|
|
104
|
+
// Usually this means one block has been deleted.
|
|
105
|
+
return 'Blocks not on same workspace.';
|
|
106
|
+
case Connection.REASON_WRONG_TYPE:
|
|
107
|
+
return 'Attempt to connect incompatible types.';
|
|
108
|
+
case Connection.REASON_TARGET_NULL:
|
|
109
|
+
return 'Target connection is null.';
|
|
110
|
+
case Connection.REASON_CHECKS_FAILED: {
|
|
111
|
+
const connOne = /** @type {!Connection} **/ (a);
|
|
112
|
+
const connTwo = /** @type {!Connection} **/ (b);
|
|
113
|
+
let msg = 'Connection checks failed. ';
|
|
114
|
+
msg += connOne + ' expected ' + connOne.getCheck() + ', found ' +
|
|
115
|
+
connTwo.getCheck();
|
|
116
|
+
return msg;
|
|
117
|
+
}
|
|
118
|
+
case Connection.REASON_SHADOW_PARENT:
|
|
119
|
+
return 'Connecting non-shadow to shadow block.';
|
|
120
|
+
case Connection.REASON_DRAG_CHECKS_FAILED:
|
|
121
|
+
return 'Drag checks failed.';
|
|
122
|
+
case Connection.REASON_PREVIOUS_AND_OUTPUT:
|
|
123
|
+
return 'Block would have an output and a previous connection.';
|
|
124
|
+
default:
|
|
125
|
+
return 'Unknown connection failure: this should never happen!';
|
|
121
126
|
}
|
|
122
|
-
case Connection.REASON_SHADOW_PARENT:
|
|
123
|
-
return 'Connecting non-shadow to shadow block.';
|
|
124
|
-
case Connection.REASON_DRAG_CHECKS_FAILED:
|
|
125
|
-
return 'Drag checks failed.';
|
|
126
|
-
case Connection.REASON_PREVIOUS_AND_OUTPUT:
|
|
127
|
-
return 'Block would have an output and a previous connection.';
|
|
128
|
-
default:
|
|
129
|
-
return 'Unknown connection failure: this should never happen!';
|
|
130
127
|
}
|
|
131
|
-
};
|
|
132
128
|
|
|
133
|
-
/**
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
129
|
+
/**
|
|
130
|
+
* Check that connecting the given connections is safe, meaning that it would
|
|
131
|
+
* not break any of Blockly's basic assumptions (e.g. no self connections).
|
|
132
|
+
* @param {Connection} a The first of the connections to check.
|
|
133
|
+
* @param {Connection} b The second of the connections to check.
|
|
134
|
+
* @return {number} An enum with the reason this connection is safe or unsafe.
|
|
135
|
+
* @public
|
|
136
|
+
*/
|
|
137
|
+
doSafetyChecks(a, b) {
|
|
138
|
+
if (!a || !b) {
|
|
139
|
+
return Connection.REASON_TARGET_NULL;
|
|
140
|
+
}
|
|
141
|
+
let superiorBlock;
|
|
142
|
+
let inferiorBlock;
|
|
143
|
+
let superiorConnection;
|
|
144
|
+
let inferiorConnection;
|
|
145
|
+
if (a.isSuperior()) {
|
|
146
|
+
superiorBlock = a.getSourceBlock();
|
|
147
|
+
inferiorBlock = b.getSourceBlock();
|
|
148
|
+
superiorConnection = a;
|
|
149
|
+
inferiorConnection = b;
|
|
150
|
+
} else {
|
|
151
|
+
inferiorBlock = a.getSourceBlock();
|
|
152
|
+
superiorBlock = b.getSourceBlock();
|
|
153
|
+
inferiorConnection = a;
|
|
154
|
+
superiorConnection = b;
|
|
155
|
+
}
|
|
156
|
+
if (superiorBlock === inferiorBlock) {
|
|
157
|
+
return Connection.REASON_SELF_CONNECTION;
|
|
158
|
+
} else if (
|
|
159
|
+
inferiorConnection.type !==
|
|
160
|
+
internalConstants.OPPOSITE_TYPE[superiorConnection.type]) {
|
|
161
|
+
return Connection.REASON_WRONG_TYPE;
|
|
162
|
+
} else if (superiorBlock.workspace !== inferiorBlock.workspace) {
|
|
163
|
+
return Connection.REASON_DIFFERENT_WORKSPACES;
|
|
164
|
+
} else if (superiorBlock.isShadow() && !inferiorBlock.isShadow()) {
|
|
165
|
+
return Connection.REASON_SHADOW_PARENT;
|
|
166
|
+
} else if (
|
|
167
|
+
inferiorConnection.type === ConnectionType.OUTPUT_VALUE &&
|
|
168
|
+
inferiorBlock.previousConnection &&
|
|
169
|
+
inferiorBlock.previousConnection.isConnected()) {
|
|
170
|
+
return Connection.REASON_PREVIOUS_AND_OUTPUT;
|
|
171
|
+
} else if (
|
|
172
|
+
inferiorConnection.type === ConnectionType.PREVIOUS_STATEMENT &&
|
|
173
|
+
inferiorBlock.outputConnection &&
|
|
174
|
+
inferiorBlock.outputConnection.isConnected()) {
|
|
175
|
+
return Connection.REASON_PREVIOUS_AND_OUTPUT;
|
|
176
|
+
}
|
|
177
|
+
return Connection.CAN_CONNECT;
|
|
180
178
|
}
|
|
181
|
-
return Connection.CAN_CONNECT;
|
|
182
|
-
};
|
|
183
179
|
|
|
184
|
-
/**
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
180
|
+
/**
|
|
181
|
+
* Check whether this connection is compatible with another connection with
|
|
182
|
+
* respect to the value type system. E.g. square_root("Hello") is not
|
|
183
|
+
* compatible.
|
|
184
|
+
* @param {!Connection} a Connection to compare.
|
|
185
|
+
* @param {!Connection} b Connection to compare against.
|
|
186
|
+
* @return {boolean} True if the connections share a type.
|
|
187
|
+
* @public
|
|
188
|
+
*/
|
|
189
|
+
doTypeChecks(a, b) {
|
|
190
|
+
const checkArrayOne = a.getCheck();
|
|
191
|
+
const checkArrayTwo = b.getCheck();
|
|
196
192
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
return true;
|
|
200
|
-
}
|
|
201
|
-
// Find any intersection in the check lists.
|
|
202
|
-
for (let i = 0; i < checkArrayOne.length; i++) {
|
|
203
|
-
if (checkArrayTwo.indexOf(checkArrayOne[i]) !== -1) {
|
|
193
|
+
if (!checkArrayOne || !checkArrayTwo) {
|
|
194
|
+
// One or both sides are promiscuous enough that anything will fit.
|
|
204
195
|
return true;
|
|
205
196
|
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
* @param {!RenderedConnection} a Connection to compare.
|
|
214
|
-
* @param {!RenderedConnection} b Connection to compare against.
|
|
215
|
-
* @param {number} distance The maximum allowable distance between connections.
|
|
216
|
-
* @return {boolean} True if the connection is allowed during a drag.
|
|
217
|
-
* @public
|
|
218
|
-
*/
|
|
219
|
-
ConnectionChecker.prototype.doDragChecks = function(a, b, distance) {
|
|
220
|
-
if (a.distanceFrom(b) > distance) {
|
|
197
|
+
// Find any intersection in the check lists.
|
|
198
|
+
for (let i = 0; i < checkArrayOne.length; i++) {
|
|
199
|
+
if (checkArrayTwo.indexOf(checkArrayOne[i]) !== -1) {
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// No intersection.
|
|
221
204
|
return false;
|
|
222
205
|
}
|
|
223
206
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
207
|
+
/**
|
|
208
|
+
* Check whether this connection can be made by dragging.
|
|
209
|
+
* @param {!RenderedConnection} a Connection to compare.
|
|
210
|
+
* @param {!RenderedConnection} b Connection to compare against.
|
|
211
|
+
* @param {number} distance The maximum allowable distance between
|
|
212
|
+
* connections.
|
|
213
|
+
* @return {boolean} True if the connection is allowed during a drag.
|
|
214
|
+
* @public
|
|
215
|
+
*/
|
|
216
|
+
doDragChecks(a, b, distance) {
|
|
217
|
+
if (a.distanceFrom(b) > distance) {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
228
220
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
return
|
|
232
|
-
case ConnectionType.OUTPUT_VALUE: {
|
|
233
|
-
// Don't offer to connect an already connected left (male) value plug to
|
|
234
|
-
// an available right (female) value plug.
|
|
235
|
-
if ((b.isConnected() && !b.targetBlock().isInsertionMarker()) ||
|
|
236
|
-
a.isConnected()) {
|
|
237
|
-
return false;
|
|
238
|
-
}
|
|
239
|
-
break;
|
|
221
|
+
// Don't consider insertion markers.
|
|
222
|
+
if (b.getSourceBlock().isInsertionMarker()) {
|
|
223
|
+
return false;
|
|
240
224
|
}
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
225
|
+
|
|
226
|
+
switch (b.type) {
|
|
227
|
+
case ConnectionType.PREVIOUS_STATEMENT:
|
|
228
|
+
return this.canConnectToPrevious_(a, b);
|
|
229
|
+
case ConnectionType.OUTPUT_VALUE: {
|
|
230
|
+
// Don't offer to connect an already connected left (male) value plug to
|
|
231
|
+
// an available right (female) value plug.
|
|
232
|
+
if ((b.isConnected() && !b.targetBlock().isInsertionMarker()) ||
|
|
233
|
+
a.isConnected()) {
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
break;
|
|
248
237
|
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
238
|
+
case ConnectionType.INPUT_VALUE: {
|
|
239
|
+
// Offering to connect the left (male) of a value block to an already
|
|
240
|
+
// connected value pair is ok, we'll splice it in.
|
|
241
|
+
// However, don't offer to splice into an immovable block.
|
|
242
|
+
if (b.isConnected() && !b.targetBlock().isMovable() &&
|
|
243
|
+
!b.targetBlock().isShadow()) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
case ConnectionType.NEXT_STATEMENT: {
|
|
249
|
+
// Don't let a block with no next connection bump other blocks out of
|
|
250
|
+
// the stack. But covering up a shadow block or stack of shadow blocks
|
|
251
|
+
// is fine. Similarly, replacing a terminal statement with another
|
|
252
|
+
// terminal statement is allowed.
|
|
253
|
+
if (b.isConnected() && !a.getSourceBlock().nextConnection &&
|
|
254
|
+
!b.targetBlock().isShadow() && b.targetBlock().nextConnection) {
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
break;
|
|
259
258
|
}
|
|
260
|
-
|
|
259
|
+
default:
|
|
260
|
+
// Unexpected connection type.
|
|
261
|
+
return false;
|
|
261
262
|
}
|
|
262
|
-
|
|
263
|
-
|
|
263
|
+
|
|
264
|
+
// Don't let blocks try to connect to themselves or ones they nest.
|
|
265
|
+
if (common.draggingConnections.indexOf(b) !== -1) {
|
|
264
266
|
return false;
|
|
265
|
-
|
|
267
|
+
}
|
|
266
268
|
|
|
267
|
-
|
|
268
|
-
if (common.draggingConnections.indexOf(b) !== -1) {
|
|
269
|
-
return false;
|
|
269
|
+
return true;
|
|
270
270
|
}
|
|
271
271
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
// A next connection will never disconnect itself mid-drag.
|
|
288
|
-
return false;
|
|
289
|
-
}
|
|
272
|
+
/**
|
|
273
|
+
* Helper function for drag checking.
|
|
274
|
+
* @param {!Connection} a The connection to check, which must be a
|
|
275
|
+
* statement input or next connection.
|
|
276
|
+
* @param {!Connection} b A nearby connection to check, which
|
|
277
|
+
* must be a previous connection.
|
|
278
|
+
* @return {boolean} True if the connection is allowed, false otherwise.
|
|
279
|
+
* @protected
|
|
280
|
+
*/
|
|
281
|
+
canConnectToPrevious_(a, b) {
|
|
282
|
+
if (a.targetConnection) {
|
|
283
|
+
// This connection is already occupied.
|
|
284
|
+
// A next connection will never disconnect itself mid-drag.
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
290
287
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
288
|
+
// Don't let blocks try to connect to themselves or ones they nest.
|
|
289
|
+
if (common.draggingConnections.indexOf(b) !== -1) {
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
295
292
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
293
|
+
if (!b.targetConnection) {
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
299
296
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
297
|
+
const targetBlock = b.targetBlock();
|
|
298
|
+
// If it is connected to a real block, game over.
|
|
299
|
+
if (!targetBlock.isInsertionMarker()) {
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
// If it's connected to an insertion marker but that insertion marker
|
|
303
|
+
// is the first block in a stack, it's still fine. If that insertion
|
|
304
|
+
// marker is in the middle of a stack, it won't work.
|
|
305
|
+
return !targetBlock.getPreviousBlock();
|
|
304
306
|
}
|
|
305
|
-
|
|
306
|
-
// is the first block in a stack, it's still fine. If that insertion
|
|
307
|
-
// marker is in the middle of a stack, it won't work.
|
|
308
|
-
return !targetBlock.getPreviousBlock();
|
|
309
|
-
};
|
|
307
|
+
}
|
|
310
308
|
|
|
311
309
|
registry.register(
|
|
312
310
|
registry.Type.CONNECTION_CHECKER, registry.DEFAULT, ConnectionChecker);
|