blockly 7.20211209.4 → 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
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
goog.module('Blockly.Events.VarDelete');
|
|
17
17
|
|
|
18
18
|
const eventUtils = goog.require('Blockly.Events.utils');
|
|
19
|
-
const object = goog.require('Blockly.utils.object');
|
|
20
19
|
const registry = goog.require('Blockly.registry');
|
|
21
20
|
const {VarBase} = goog.require('Blockly.Events.VarBase');
|
|
22
21
|
/* eslint-disable-next-line no-unused-vars */
|
|
@@ -25,62 +24,65 @@ const {VariableModel} = goog.requireType('Blockly.VariableModel');
|
|
|
25
24
|
|
|
26
25
|
/**
|
|
27
26
|
* Class for a variable deletion event.
|
|
28
|
-
* @param {!VariableModel=} opt_variable The deleted variable. Undefined
|
|
29
|
-
* for a blank event.
|
|
30
27
|
* @extends {VarBase}
|
|
31
|
-
* @constructor
|
|
32
28
|
* @alias Blockly.Events.VarDelete
|
|
33
29
|
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
30
|
+
class VarDelete extends VarBase {
|
|
31
|
+
/**
|
|
32
|
+
* @param {!VariableModel=} opt_variable The deleted variable. Undefined
|
|
33
|
+
* for a blank event.
|
|
34
|
+
*/
|
|
35
|
+
constructor(opt_variable) {
|
|
36
|
+
super(opt_variable);
|
|
39
37
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
|
|
38
|
+
/**
|
|
39
|
+
* Type of this event.
|
|
40
|
+
* @type {string}
|
|
41
|
+
*/
|
|
42
|
+
this.type = eventUtils.VAR_DELETE;
|
|
44
43
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
*/
|
|
49
|
-
VarDelete.prototype.type = eventUtils.VAR_DELETE;
|
|
44
|
+
if (!opt_variable) {
|
|
45
|
+
return; // Blank event to be populated by fromJson.
|
|
46
|
+
}
|
|
50
47
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
*/
|
|
55
|
-
VarDelete.prototype.toJson = function() {
|
|
56
|
-
const json = VarDelete.superClass_.toJson.call(this);
|
|
57
|
-
json['varType'] = this.varType;
|
|
58
|
-
json['varName'] = this.varName;
|
|
59
|
-
return json;
|
|
60
|
-
};
|
|
48
|
+
this.varType = opt_variable.type;
|
|
49
|
+
this.varName = opt_variable.name;
|
|
50
|
+
}
|
|
61
51
|
|
|
62
|
-
/**
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
52
|
+
/**
|
|
53
|
+
* Encode the event as JSON.
|
|
54
|
+
* @return {!Object} JSON representation.
|
|
55
|
+
*/
|
|
56
|
+
toJson() {
|
|
57
|
+
const json = super.toJson();
|
|
58
|
+
json['varType'] = this.varType;
|
|
59
|
+
json['varName'] = this.varName;
|
|
60
|
+
return json;
|
|
61
|
+
}
|
|
71
62
|
|
|
72
|
-
/**
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
|
|
63
|
+
/**
|
|
64
|
+
* Decode the JSON event.
|
|
65
|
+
* @param {!Object} json JSON representation.
|
|
66
|
+
*/
|
|
67
|
+
fromJson(json) {
|
|
68
|
+
super.fromJson(json);
|
|
69
|
+
this.varType = json['varType'];
|
|
70
|
+
this.varName = json['varName'];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Run a variable deletion event.
|
|
75
|
+
* @param {boolean} forward True if run forward, false if run backward (undo).
|
|
76
|
+
*/
|
|
77
|
+
run(forward) {
|
|
78
|
+
const workspace = this.getEventWorkspace_();
|
|
79
|
+
if (forward) {
|
|
80
|
+
workspace.deleteVariableById(this.varId);
|
|
81
|
+
} else {
|
|
82
|
+
workspace.createVariable(this.varName, this.varType, this.varId);
|
|
83
|
+
}
|
|
82
84
|
}
|
|
83
|
-
}
|
|
85
|
+
}
|
|
84
86
|
|
|
85
87
|
registry.register(registry.Type.EVENT, eventUtils.VAR_DELETE, VarDelete);
|
|
86
88
|
|
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
goog.module('Blockly.Events.VarRename');
|
|
17
17
|
|
|
18
18
|
const eventUtils = goog.require('Blockly.Events.utils');
|
|
19
|
-
const object = goog.require('Blockly.utils.object');
|
|
20
19
|
const registry = goog.require('Blockly.registry');
|
|
21
20
|
const {VarBase} = goog.require('Blockly.Events.VarBase');
|
|
22
21
|
/* eslint-disable-next-line no-unused-vars */
|
|
@@ -25,63 +24,66 @@ const {VariableModel} = goog.requireType('Blockly.VariableModel');
|
|
|
25
24
|
|
|
26
25
|
/**
|
|
27
26
|
* Class for a variable rename event.
|
|
28
|
-
* @param {!VariableModel=} opt_variable The renamed variable. Undefined
|
|
29
|
-
* for a blank event.
|
|
30
|
-
* @param {string=} newName The new name the variable will be changed to.
|
|
31
27
|
* @extends {VarBase}
|
|
32
|
-
* @constructor
|
|
33
28
|
* @alias Blockly.Events.VarRename
|
|
34
29
|
*/
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
30
|
+
class VarRename extends VarBase {
|
|
31
|
+
/**
|
|
32
|
+
* @param {!VariableModel=} opt_variable The renamed variable. Undefined
|
|
33
|
+
* for a blank event.
|
|
34
|
+
* @param {string=} newName The new name the variable will be changed to.
|
|
35
|
+
*/
|
|
36
|
+
constructor(opt_variable, newName) {
|
|
37
|
+
super(opt_variable);
|
|
40
38
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
|
|
39
|
+
/**
|
|
40
|
+
* Type of this event.
|
|
41
|
+
* @type {string}
|
|
42
|
+
*/
|
|
43
|
+
this.type = eventUtils.VAR_RENAME;
|
|
45
44
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
*/
|
|
50
|
-
VarRename.prototype.type = eventUtils.VAR_RENAME;
|
|
45
|
+
if (!opt_variable) {
|
|
46
|
+
return; // Blank event to be populated by fromJson.
|
|
47
|
+
}
|
|
51
48
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
*/
|
|
56
|
-
VarRename.prototype.toJson = function() {
|
|
57
|
-
const json = VarRename.superClass_.toJson.call(this);
|
|
58
|
-
json['oldName'] = this.oldName;
|
|
59
|
-
json['newName'] = this.newName;
|
|
60
|
-
return json;
|
|
61
|
-
};
|
|
49
|
+
this.oldName = opt_variable.name;
|
|
50
|
+
this.newName = typeof newName === 'undefined' ? '' : newName;
|
|
51
|
+
}
|
|
62
52
|
|
|
63
|
-
/**
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Encode the event as JSON.
|
|
55
|
+
* @return {!Object} JSON representation.
|
|
56
|
+
*/
|
|
57
|
+
toJson() {
|
|
58
|
+
const json = super.toJson();
|
|
59
|
+
json['oldName'] = this.oldName;
|
|
60
|
+
json['newName'] = this.newName;
|
|
61
|
+
return json;
|
|
62
|
+
}
|
|
72
63
|
|
|
73
|
-
/**
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
|
|
64
|
+
/**
|
|
65
|
+
* Decode the JSON event.
|
|
66
|
+
* @param {!Object} json JSON representation.
|
|
67
|
+
*/
|
|
68
|
+
fromJson(json) {
|
|
69
|
+
super.fromJson(json);
|
|
70
|
+
this.oldName = json['oldName'];
|
|
71
|
+
this.newName = json['newName'];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Run a variable rename event.
|
|
76
|
+
* @param {boolean} forward True if run forward, false if run backward (undo).
|
|
77
|
+
*/
|
|
78
|
+
run(forward) {
|
|
79
|
+
const workspace = this.getEventWorkspace_();
|
|
80
|
+
if (forward) {
|
|
81
|
+
workspace.renameVariableById(this.varId, this.newName);
|
|
82
|
+
} else {
|
|
83
|
+
workspace.renameVariableById(this.varId, this.oldName);
|
|
84
|
+
}
|
|
83
85
|
}
|
|
84
|
-
}
|
|
86
|
+
}
|
|
85
87
|
|
|
86
88
|
registry.register(registry.Type.EVENT, eventUtils.VAR_RENAME, VarRename);
|
|
87
89
|
|
|
@@ -16,89 +16,90 @@
|
|
|
16
16
|
goog.module('Blockly.Events.ViewportChange');
|
|
17
17
|
|
|
18
18
|
const eventUtils = goog.require('Blockly.Events.utils');
|
|
19
|
-
const object = goog.require('Blockly.utils.object');
|
|
20
19
|
const registry = goog.require('Blockly.registry');
|
|
21
20
|
const {UiBase} = goog.require('Blockly.Events.UiBase');
|
|
22
21
|
|
|
23
22
|
|
|
24
23
|
/**
|
|
25
24
|
* Class for a viewport change event.
|
|
26
|
-
* @param {number=} opt_top Top-edge of the visible portion of the workspace,
|
|
27
|
-
* relative to the workspace origin. Undefined for a blank event.
|
|
28
|
-
* @param {number=} opt_left Left-edge of the visible portion of the workspace,
|
|
29
|
-
* relative to the workspace origin. Undefined for a blank event.
|
|
30
|
-
* @param {number=} opt_scale The scale of the workspace. Undefined for a blank
|
|
31
|
-
* event.
|
|
32
|
-
* @param {string=} opt_workspaceId The workspace identifier for this event.
|
|
33
|
-
* Undefined for a blank event.
|
|
34
|
-
* @param {number=} opt_oldScale The old scale of the workspace. Undefined for a
|
|
35
|
-
* blank event.
|
|
36
25
|
* @extends {UiBase}
|
|
37
|
-
* @constructor
|
|
38
26
|
* @alias Blockly.Events.ViewportChange
|
|
39
27
|
*/
|
|
40
|
-
|
|
41
|
-
opt_top, opt_left, opt_scale, opt_workspaceId, opt_oldScale) {
|
|
42
|
-
ViewportChange.superClass_.constructor.call(this, opt_workspaceId);
|
|
43
|
-
|
|
28
|
+
class ViewportChange extends UiBase {
|
|
44
29
|
/**
|
|
45
|
-
* Top-edge of the visible portion of the workspace,
|
|
46
|
-
* origin.
|
|
47
|
-
* @
|
|
30
|
+
* @param {number=} opt_top Top-edge of the visible portion of the workspace,
|
|
31
|
+
* relative to the workspace origin. Undefined for a blank event.
|
|
32
|
+
* @param {number=} opt_left Left-edge of the visible portion of the
|
|
33
|
+
* workspace relative to the workspace origin. Undefined for a blank
|
|
34
|
+
* event.
|
|
35
|
+
* @param {number=} opt_scale The scale of the workspace. Undefined for a
|
|
36
|
+
* blank event.
|
|
37
|
+
* @param {string=} opt_workspaceId The workspace identifier for this event.
|
|
38
|
+
* Undefined for a blank event.
|
|
39
|
+
* @param {number=} opt_oldScale The old scale of the workspace. Undefined for
|
|
40
|
+
* a blank event.
|
|
48
41
|
*/
|
|
49
|
-
|
|
42
|
+
constructor(opt_top, opt_left, opt_scale, opt_workspaceId, opt_oldScale) {
|
|
43
|
+
super(opt_workspaceId);
|
|
50
44
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Top-edge of the visible portion of the workspace, relative to the
|
|
47
|
+
* workspace origin.
|
|
48
|
+
* @type {number|undefined}
|
|
49
|
+
*/
|
|
50
|
+
this.viewTop = opt_top;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Left-edge of the visible portion of the workspace, relative to the
|
|
54
|
+
* workspace origin.
|
|
55
|
+
* @type {number|undefined}
|
|
56
|
+
*/
|
|
57
|
+
this.viewLeft = opt_left;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* The scale of the workspace.
|
|
61
|
+
* @type {number|undefined}
|
|
62
|
+
*/
|
|
63
|
+
this.scale = opt_scale;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The old scale of the workspace.
|
|
67
|
+
* @type {number|undefined}
|
|
68
|
+
*/
|
|
69
|
+
this.oldScale = opt_oldScale;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Type of this event.
|
|
73
|
+
* @type {string}
|
|
74
|
+
*/
|
|
75
|
+
this.type = eventUtils.VIEWPORT_CHANGE;
|
|
76
|
+
}
|
|
57
77
|
|
|
58
78
|
/**
|
|
59
|
-
*
|
|
60
|
-
* @
|
|
79
|
+
* Encode the event as JSON.
|
|
80
|
+
* @return {!Object} JSON representation.
|
|
61
81
|
*/
|
|
62
|
-
|
|
82
|
+
toJson() {
|
|
83
|
+
const json = super.toJson();
|
|
84
|
+
json['viewTop'] = this.viewTop;
|
|
85
|
+
json['viewLeft'] = this.viewLeft;
|
|
86
|
+
json['scale'] = this.scale;
|
|
87
|
+
json['oldScale'] = this.oldScale;
|
|
88
|
+
return json;
|
|
89
|
+
}
|
|
63
90
|
|
|
64
91
|
/**
|
|
65
|
-
*
|
|
66
|
-
* @
|
|
92
|
+
* Decode the JSON event.
|
|
93
|
+
* @param {!Object} json JSON representation.
|
|
67
94
|
*/
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
ViewportChange.prototype.type = eventUtils.VIEWPORT_CHANGE;
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Encode the event as JSON.
|
|
80
|
-
* @return {!Object} JSON representation.
|
|
81
|
-
*/
|
|
82
|
-
ViewportChange.prototype.toJson = function() {
|
|
83
|
-
const json = ViewportChange.superClass_.toJson.call(this);
|
|
84
|
-
json['viewTop'] = this.viewTop;
|
|
85
|
-
json['viewLeft'] = this.viewLeft;
|
|
86
|
-
json['scale'] = this.scale;
|
|
87
|
-
json['oldScale'] = this.oldScale;
|
|
88
|
-
return json;
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Decode the JSON event.
|
|
93
|
-
* @param {!Object} json JSON representation.
|
|
94
|
-
*/
|
|
95
|
-
ViewportChange.prototype.fromJson = function(json) {
|
|
96
|
-
ViewportChange.superClass_.fromJson.call(this, json);
|
|
97
|
-
this.viewTop = json['viewTop'];
|
|
98
|
-
this.viewLeft = json['viewLeft'];
|
|
99
|
-
this.scale = json['scale'];
|
|
100
|
-
this.oldScale = json['oldScale'];
|
|
101
|
-
};
|
|
95
|
+
fromJson(json) {
|
|
96
|
+
super.fromJson(json);
|
|
97
|
+
this.viewTop = json['viewTop'];
|
|
98
|
+
this.viewLeft = json['viewLeft'];
|
|
99
|
+
this.scale = json['scale'];
|
|
100
|
+
this.oldScale = json['oldScale'];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
102
103
|
|
|
103
104
|
registry.register(
|
|
104
105
|
registry.Type.EVENT, eventUtils.VIEWPORT_CHANGE, ViewportChange);
|
package/core/events/utils.js
CHANGED
|
@@ -17,11 +17,13 @@
|
|
|
17
17
|
*/
|
|
18
18
|
goog.module('Blockly.Events.utils');
|
|
19
19
|
|
|
20
|
-
/* eslint-disable-next-line no-unused-vars */
|
|
21
|
-
const Abstract = goog.requireType('Blockly.Events.Abstract');
|
|
22
20
|
const idGenerator = goog.require('Blockly.utils.idGenerator');
|
|
23
21
|
const registry = goog.require('Blockly.registry');
|
|
24
22
|
/* eslint-disable-next-line no-unused-vars */
|
|
23
|
+
const {Abstract} = goog.requireType('Blockly.Events.Abstract');
|
|
24
|
+
/* eslint-disable-next-line no-unused-vars */
|
|
25
|
+
const {BlockChange} = goog.requireType('Blockly.Events.BlockChange');
|
|
26
|
+
/* eslint-disable-next-line no-unused-vars */
|
|
25
27
|
const {BlockCreate} = goog.requireType('Blockly.Events.BlockCreate');
|
|
26
28
|
/* eslint-disable-next-line no-unused-vars */
|
|
27
29
|
const {BlockMove} = goog.requireType('Blockly.Events.BlockMove');
|
|
@@ -32,7 +34,11 @@ const {CommentCreate} = goog.requireType('Blockly.Events.CommentCreate');
|
|
|
32
34
|
/* eslint-disable-next-line no-unused-vars */
|
|
33
35
|
const {CommentMove} = goog.requireType('Blockly.Events.CommentMove');
|
|
34
36
|
/* eslint-disable-next-line no-unused-vars */
|
|
37
|
+
const {ViewportChange} = goog.requireType('Blockly.Events.ViewportChange');
|
|
38
|
+
/* eslint-disable-next-line no-unused-vars */
|
|
35
39
|
const {Workspace} = goog.requireType('Blockly.Workspace');
|
|
40
|
+
/* eslint-disable-next-line no-unused-vars */
|
|
41
|
+
const {WorkspaceSvg} = goog.requireType('Blockly.WorkspaceSvg');
|
|
36
42
|
|
|
37
43
|
|
|
38
44
|
/**
|
|
@@ -307,6 +313,7 @@ exports.BUMP_EVENTS = BUMP_EVENTS;
|
|
|
307
313
|
|
|
308
314
|
/**
|
|
309
315
|
* List of events queued for firing.
|
|
316
|
+
* @type {!Array<!Abstract>}
|
|
310
317
|
*/
|
|
311
318
|
const FIRE_QUEUE = [];
|
|
312
319
|
|
|
@@ -365,7 +372,9 @@ const filter = function(queueIn, forward) {
|
|
|
365
372
|
if (!event.isNull()) {
|
|
366
373
|
// Treat all UI events as the same type in hash table.
|
|
367
374
|
const eventType = event.isUiEvent ? UI : event.type;
|
|
368
|
-
|
|
375
|
+
// TODO(#5927): Ceck whether `blockId` exists before accessing it.
|
|
376
|
+
const blockId = /** @type {*} */ (event).blockId;
|
|
377
|
+
const key = [eventType, blockId, event.workspaceId].join(' ');
|
|
369
378
|
|
|
370
379
|
const lastEntry = hash[key];
|
|
371
380
|
const lastEvent = lastEntry ? lastEntry.event : null;
|
|
@@ -376,22 +385,25 @@ const filter = function(queueIn, forward) {
|
|
|
376
385
|
hash[key] = {event: event, index: i};
|
|
377
386
|
mergedQueue.push(event);
|
|
378
387
|
} else if (event.type === MOVE && lastEntry.index === i - 1) {
|
|
388
|
+
const moveEvent = /** @type {!BlockMove} */ (event);
|
|
379
389
|
// Merge move events.
|
|
380
|
-
lastEvent.newParentId =
|
|
381
|
-
lastEvent.newInputName =
|
|
382
|
-
lastEvent.newCoordinate =
|
|
390
|
+
lastEvent.newParentId = moveEvent.newParentId;
|
|
391
|
+
lastEvent.newInputName = moveEvent.newInputName;
|
|
392
|
+
lastEvent.newCoordinate = moveEvent.newCoordinate;
|
|
383
393
|
lastEntry.index = i;
|
|
384
394
|
} else if (
|
|
385
395
|
event.type === CHANGE && event.element === lastEvent.element &&
|
|
386
396
|
event.name === lastEvent.name) {
|
|
397
|
+
const changeEvent = /** @type {!BlockChange} */ (event);
|
|
387
398
|
// Merge change events.
|
|
388
|
-
lastEvent.newValue =
|
|
399
|
+
lastEvent.newValue = changeEvent.newValue;
|
|
389
400
|
} else if (event.type === VIEWPORT_CHANGE) {
|
|
401
|
+
const viewportEvent = /** @type {!ViewportChange} */ (event);
|
|
390
402
|
// Merge viewport change events.
|
|
391
|
-
lastEvent.viewTop =
|
|
392
|
-
lastEvent.viewLeft =
|
|
393
|
-
lastEvent.scale =
|
|
394
|
-
lastEvent.oldScale =
|
|
403
|
+
lastEvent.viewTop = viewportEvent.viewTop;
|
|
404
|
+
lastEvent.viewLeft = viewportEvent.viewLeft;
|
|
405
|
+
lastEvent.scale = viewportEvent.scale;
|
|
406
|
+
lastEvent.oldScale = viewportEvent.oldScale;
|
|
395
407
|
} else if (event.type === CLICK && lastEvent.type === BUBBLE_OPEN) {
|
|
396
408
|
// Drop click events caused by opening/closing bubbles.
|
|
397
409
|
} else {
|
|
@@ -546,12 +558,15 @@ exports.get = get;
|
|
|
546
558
|
*/
|
|
547
559
|
const disableOrphans = function(event) {
|
|
548
560
|
if (event.type === MOVE || event.type === CREATE) {
|
|
549
|
-
|
|
561
|
+
const blockEvent = /** @type {!BlockMove|!BlockCreate} */ (event);
|
|
562
|
+
if (!blockEvent.workspaceId) {
|
|
550
563
|
return;
|
|
551
564
|
}
|
|
552
565
|
const {Workspace} = goog.module.get('Blockly.Workspace');
|
|
553
|
-
const eventWorkspace =
|
|
554
|
-
|
|
566
|
+
const eventWorkspace =
|
|
567
|
+
/** @type {!WorkspaceSvg} */ (
|
|
568
|
+
Workspace.getById(blockEvent.workspaceId));
|
|
569
|
+
let block = eventWorkspace.getBlockById(blockEvent.blockId);
|
|
555
570
|
if (block) {
|
|
556
571
|
// Changing blocks as part of this event shouldn't be undoable.
|
|
557
572
|
const initialUndoFlag = recordUndo;
|
|
@@ -15,10 +15,9 @@
|
|
|
15
15
|
*/
|
|
16
16
|
goog.module('Blockly.Events.FinishedLoading');
|
|
17
17
|
|
|
18
|
-
const Abstract = goog.require('Blockly.Events.Abstract');
|
|
19
18
|
const eventUtils = goog.require('Blockly.Events.utils');
|
|
20
|
-
const object = goog.require('Blockly.utils.object');
|
|
21
19
|
const registry = goog.require('Blockly.registry');
|
|
20
|
+
const {Abstract: AbstractEvent} = goog.require('Blockly.Events.Abstract');
|
|
22
21
|
/* eslint-disable-next-line no-unused-vars */
|
|
23
22
|
const {Workspace} = goog.requireType('Blockly.Workspace');
|
|
24
23
|
|
|
@@ -28,70 +27,65 @@ const {Workspace} = goog.requireType('Blockly.Workspace');
|
|
|
28
27
|
* Used to notify the developer when the workspace has finished loading (i.e
|
|
29
28
|
* domToWorkspace).
|
|
30
29
|
* Finished loading events do not record undo or redo.
|
|
31
|
-
* @
|
|
32
|
-
* loading. Undefined for a blank event.
|
|
33
|
-
* @extends {Abstract}
|
|
34
|
-
* @constructor
|
|
30
|
+
* @extends {AbstractEvent}
|
|
35
31
|
* @alias Blockly.Events.FinishedLoading
|
|
36
32
|
*/
|
|
37
|
-
|
|
33
|
+
class FinishedLoading extends AbstractEvent {
|
|
38
34
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
35
|
+
* @param {!Workspace=} opt_workspace The workspace that has finished
|
|
36
|
+
* loading. Undefined for a blank event.
|
|
41
37
|
*/
|
|
42
|
-
|
|
38
|
+
constructor(opt_workspace) {
|
|
39
|
+
super();
|
|
40
|
+
/**
|
|
41
|
+
* Whether or not the event is blank (to be populated by fromJson).
|
|
42
|
+
* @type {boolean}
|
|
43
|
+
*/
|
|
44
|
+
this.isBlank = typeof opt_workspace === 'undefined';
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The workspace identifier for this event.
|
|
48
|
+
* @type {string}
|
|
49
|
+
*/
|
|
50
|
+
this.workspaceId = opt_workspace ? opt_workspace.id : '';
|
|
51
|
+
|
|
52
|
+
// Workspace events do not undo or redo.
|
|
53
|
+
this.recordUndo = false;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Type of this event.
|
|
57
|
+
* @type {string}
|
|
58
|
+
*/
|
|
59
|
+
this.type = eventUtils.FINISHED_LOADING;
|
|
60
|
+
}
|
|
43
61
|
|
|
44
62
|
/**
|
|
45
|
-
*
|
|
46
|
-
* @
|
|
63
|
+
* Encode the event as JSON.
|
|
64
|
+
* @return {!Object} JSON representation.
|
|
47
65
|
*/
|
|
48
|
-
|
|
66
|
+
toJson() {
|
|
67
|
+
const json = {
|
|
68
|
+
'type': this.type,
|
|
69
|
+
};
|
|
70
|
+
if (this.group) {
|
|
71
|
+
json['group'] = this.group;
|
|
72
|
+
}
|
|
73
|
+
if (this.workspaceId) {
|
|
74
|
+
json['workspaceId'] = this.workspaceId;
|
|
75
|
+
}
|
|
76
|
+
return json;
|
|
77
|
+
}
|
|
49
78
|
|
|
50
79
|
/**
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* perspective, and should be undone together.
|
|
54
|
-
* @type {string}
|
|
80
|
+
* Decode the JSON event.
|
|
81
|
+
* @param {!Object} json JSON representation.
|
|
55
82
|
*/
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
};
|
|
61
|
-
object.inherits(FinishedLoading, Abstract);
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Type of this event.
|
|
65
|
-
* @type {string}
|
|
66
|
-
*/
|
|
67
|
-
FinishedLoading.prototype.type = eventUtils.FINISHED_LOADING;
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Encode the event as JSON.
|
|
71
|
-
* @return {!Object} JSON representation.
|
|
72
|
-
*/
|
|
73
|
-
FinishedLoading.prototype.toJson = function() {
|
|
74
|
-
const json = {
|
|
75
|
-
'type': this.type,
|
|
76
|
-
};
|
|
77
|
-
if (this.group) {
|
|
78
|
-
json['group'] = this.group;
|
|
83
|
+
fromJson(json) {
|
|
84
|
+
this.isBlank = false;
|
|
85
|
+
this.workspaceId = json['workspaceId'];
|
|
86
|
+
this.group = json['group'];
|
|
79
87
|
}
|
|
80
|
-
|
|
81
|
-
json['workspaceId'] = this.workspaceId;
|
|
82
|
-
}
|
|
83
|
-
return json;
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Decode the JSON event.
|
|
88
|
-
* @param {!Object} json JSON representation.
|
|
89
|
-
*/
|
|
90
|
-
FinishedLoading.prototype.fromJson = function(json) {
|
|
91
|
-
this.isBlank = false;
|
|
92
|
-
this.workspaceId = json['workspaceId'];
|
|
93
|
-
this.group = json['group'];
|
|
94
|
-
};
|
|
88
|
+
}
|
|
95
89
|
|
|
96
90
|
registry.register(
|
|
97
91
|
registry.Type.EVENT, eventUtils.FINISHED_LOADING, FinishedLoading);
|
package/core/extensions.js
CHANGED
|
@@ -24,6 +24,7 @@ goog.module('Blockly.Extensions');
|
|
|
24
24
|
const parsing = goog.require('Blockly.utils.parsing');
|
|
25
25
|
/* eslint-disable-next-line no-unused-vars */
|
|
26
26
|
const {Block} = goog.requireType('Blockly.Block');
|
|
27
|
+
const {FieldDropdown} = goog.require('Blockly.FieldDropdown');
|
|
27
28
|
goog.requireType('Blockly.Mutator');
|
|
28
29
|
|
|
29
30
|
|
|
@@ -454,7 +455,7 @@ exports.buildTooltipForDropdown = buildTooltipForDropdown;
|
|
|
454
455
|
const checkDropdownOptionsInTable = function(block, dropdownName, lookupTable) {
|
|
455
456
|
// Validate all dropdown options have values.
|
|
456
457
|
const dropdown = block.getField(dropdownName);
|
|
457
|
-
if (!dropdown.isOptionListDynamic()) {
|
|
458
|
+
if (dropdown instanceof FieldDropdown && !dropdown.isOptionListDynamic()) {
|
|
458
459
|
const options = dropdown.getOptions();
|
|
459
460
|
for (let i = 0; i < options.length; i++) {
|
|
460
461
|
const optionKey = options[i][1]; // label, then value
|
|
@@ -512,11 +513,11 @@ exports.buildTooltipWithFieldText = buildTooltipWithFieldText;
|
|
|
512
513
|
* @this {Block}
|
|
513
514
|
*/
|
|
514
515
|
const extensionParentTooltip = function() {
|
|
515
|
-
|
|
516
|
+
const tooltipWhenNotConnected = this.tooltip;
|
|
516
517
|
this.setTooltip(function() {
|
|
517
518
|
const parent = this.getParent();
|
|
518
519
|
return (parent && parent.getInputsInline() && parent.tooltip) ||
|
|
519
|
-
|
|
520
|
+
tooltipWhenNotConnected;
|
|
520
521
|
}.bind(this));
|
|
521
522
|
};
|
|
522
523
|
register('parent_tooltip_when_inline', extensionParentTooltip);
|