blockly 7.20211209.4 → 8.0.1
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 +5 -4
- package/blockly_compressed.js +4 -3
- 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 +45 -32
- package/blocks/text.js +22 -13
- package/blocks/variables.js +14 -3
- package/blocks/variables_dynamic.js +13 -3
- package/blocks_compressed.js +1 -1
- 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 +26 -10
- 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/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/msg/smn.js +436 -0
- package/package.json +7 -6
- package/blocks/all.js +0 -23
package/core/events/events.js
CHANGED
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
*/
|
|
16
16
|
goog.module('Blockly.Events');
|
|
17
17
|
|
|
18
|
-
const Abstract = goog.require('Blockly.Events.Abstract');
|
|
19
18
|
const deprecation = goog.require('Blockly.utils.deprecation');
|
|
20
19
|
const eventUtils = goog.require('Blockly.Events.utils');
|
|
20
|
+
const {Abstract: AbstractEvent} = goog.require('Blockly.Events.Abstract');
|
|
21
21
|
const {BlockBase} = goog.require('Blockly.Events.BlockBase');
|
|
22
22
|
const {BlockChange} = goog.require('Blockly.Events.BlockChange');
|
|
23
23
|
const {BlockCreate} = goog.require('Blockly.Events.BlockCreate');
|
|
@@ -47,7 +47,7 @@ const {ViewportChange} = goog.require('Blockly.Events.ViewportChange');
|
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
// Events.
|
|
50
|
-
exports.Abstract =
|
|
50
|
+
exports.Abstract = AbstractEvent;
|
|
51
51
|
exports.BubbleOpen = BubbleOpen;
|
|
52
52
|
exports.BlockBase = BlockBase;
|
|
53
53
|
exports.BlockChange = BlockChange;
|
|
@@ -24,98 +24,110 @@ const {Workspace} = goog.requireType('Blockly.Workspace');
|
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
26
|
* Abstract class for an event.
|
|
27
|
-
* @
|
|
27
|
+
* @abstract
|
|
28
28
|
* @alias Blockly.Events.Abstract
|
|
29
29
|
*/
|
|
30
|
-
|
|
30
|
+
class Abstract {
|
|
31
31
|
/**
|
|
32
|
-
*
|
|
33
|
-
* @type {?boolean}
|
|
32
|
+
* @alias Blockly.Events.Abstract
|
|
34
33
|
*/
|
|
35
|
-
|
|
34
|
+
constructor() {
|
|
35
|
+
/**
|
|
36
|
+
* Whether or not the event is blank (to be populated by fromJson).
|
|
37
|
+
* @type {?boolean}
|
|
38
|
+
*/
|
|
39
|
+
this.isBlank = null;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The workspace identifier for this event.
|
|
43
|
+
* @type {string|undefined}
|
|
44
|
+
*/
|
|
45
|
+
this.workspaceId = undefined;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The event group id for the group this event belongs to. Groups define
|
|
49
|
+
* events that should be treated as an single action from the user's
|
|
50
|
+
* perspective, and should be undone together.
|
|
51
|
+
* @type {string}
|
|
52
|
+
*/
|
|
53
|
+
this.group = eventUtils.getGroup();
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Sets whether the event should be added to the undo stack.
|
|
57
|
+
* @type {boolean}
|
|
58
|
+
*/
|
|
59
|
+
this.recordUndo = eventUtils.getRecordUndo();
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Whether or not the event is a UI event.
|
|
63
|
+
* @type {boolean}
|
|
64
|
+
*/
|
|
65
|
+
this.isUiEvent = false;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Type of this event.
|
|
69
|
+
* @type {string|undefined}
|
|
70
|
+
*/
|
|
71
|
+
this.type = undefined;
|
|
72
|
+
}
|
|
36
73
|
|
|
37
74
|
/**
|
|
38
|
-
*
|
|
39
|
-
* @
|
|
75
|
+
* Encode the event as JSON.
|
|
76
|
+
* @return {!Object} JSON representation.
|
|
40
77
|
*/
|
|
41
|
-
|
|
78
|
+
toJson() {
|
|
79
|
+
const json = {'type': this.type};
|
|
80
|
+
if (this.group) {
|
|
81
|
+
json['group'] = this.group;
|
|
82
|
+
}
|
|
83
|
+
return json;
|
|
84
|
+
}
|
|
42
85
|
|
|
43
86
|
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* perspective, and should be undone together.
|
|
47
|
-
* @type {string}
|
|
87
|
+
* Decode the JSON event.
|
|
88
|
+
* @param {!Object} json JSON representation.
|
|
48
89
|
*/
|
|
49
|
-
|
|
90
|
+
fromJson(json) {
|
|
91
|
+
this.isBlank = false;
|
|
92
|
+
this.group = json['group'];
|
|
93
|
+
}
|
|
50
94
|
|
|
51
95
|
/**
|
|
52
|
-
*
|
|
53
|
-
* @
|
|
96
|
+
* Does this event record any change of state?
|
|
97
|
+
* @return {boolean} True if null, false if something changed.
|
|
54
98
|
*/
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Whether or not the event is a UI event.
|
|
60
|
-
* @type {boolean}
|
|
61
|
-
*/
|
|
62
|
-
Abstract.prototype.isUiEvent = false;
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Encode the event as JSON.
|
|
66
|
-
* @return {!Object} JSON representation.
|
|
67
|
-
*/
|
|
68
|
-
Abstract.prototype.toJson = function() {
|
|
69
|
-
const json = {'type': this.type};
|
|
70
|
-
if (this.group) {
|
|
71
|
-
json['group'] = this.group;
|
|
99
|
+
isNull() {
|
|
100
|
+
return false;
|
|
72
101
|
}
|
|
73
|
-
return json;
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Decode the JSON event.
|
|
78
|
-
* @param {!Object} json JSON representation.
|
|
79
|
-
*/
|
|
80
|
-
Abstract.prototype.fromJson = function(json) {
|
|
81
|
-
this.isBlank = false;
|
|
82
|
-
this.group = json['group'];
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Does this event record any change of state?
|
|
87
|
-
* @return {boolean} True if null, false if something changed.
|
|
88
|
-
*/
|
|
89
|
-
Abstract.prototype.isNull = function() {
|
|
90
|
-
return false;
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Run an event.
|
|
95
|
-
* @param {boolean} _forward True if run forward, false if run backward (undo).
|
|
96
|
-
*/
|
|
97
|
-
Abstract.prototype.run = function(_forward) {
|
|
98
|
-
// Defined by subclasses.
|
|
99
|
-
};
|
|
100
102
|
|
|
101
|
-
/**
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
let workspace;
|
|
109
|
-
if (this.workspaceId) {
|
|
110
|
-
const {Workspace} = goog.module.get('Blockly.Workspace');
|
|
111
|
-
workspace = Workspace.getById(this.workspaceId);
|
|
103
|
+
/**
|
|
104
|
+
* Run an event.
|
|
105
|
+
* @param {boolean} _forward True if run forward, false if run backward
|
|
106
|
+
* (undo).
|
|
107
|
+
*/
|
|
108
|
+
run(_forward) {
|
|
109
|
+
// Defined by subclasses.
|
|
112
110
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Get workspace the event belongs to.
|
|
114
|
+
* @return {!Workspace} The workspace the event belongs to.
|
|
115
|
+
* @throws {Error} if workspace is null.
|
|
116
|
+
* @protected
|
|
117
|
+
*/
|
|
118
|
+
getEventWorkspace_() {
|
|
119
|
+
let workspace;
|
|
120
|
+
if (this.workspaceId) {
|
|
121
|
+
const {Workspace} = goog.module.get('Blockly.Workspace');
|
|
122
|
+
workspace = Workspace.getById(this.workspaceId);
|
|
123
|
+
}
|
|
124
|
+
if (!workspace) {
|
|
125
|
+
throw Error(
|
|
126
|
+
'Workspace is null. Event must have been generated from real' +
|
|
127
|
+
' Blockly events.');
|
|
128
|
+
}
|
|
129
|
+
return workspace;
|
|
117
130
|
}
|
|
118
|
-
|
|
119
|
-
};
|
|
131
|
+
}
|
|
120
132
|
|
|
121
|
-
exports = Abstract;
|
|
133
|
+
exports.Abstract = Abstract;
|
|
@@ -15,55 +15,56 @@
|
|
|
15
15
|
*/
|
|
16
16
|
goog.module('Blockly.Events.BlockBase');
|
|
17
17
|
|
|
18
|
-
const Abstract = goog.require('Blockly.Events.Abstract');
|
|
19
|
-
const object = goog.require('Blockly.utils.object');
|
|
18
|
+
const {Abstract: AbstractEvent} = goog.require('Blockly.Events.Abstract');
|
|
20
19
|
/* eslint-disable-next-line no-unused-vars */
|
|
21
20
|
const {Block} = goog.requireType('Blockly.Block');
|
|
22
21
|
|
|
23
22
|
|
|
24
23
|
/**
|
|
25
24
|
* Abstract class for a block event.
|
|
26
|
-
* @
|
|
27
|
-
* Undefined for a blank event.
|
|
28
|
-
* @extends {Abstract}
|
|
29
|
-
* @constructor
|
|
25
|
+
* @extends {AbstractEvent}
|
|
30
26
|
* @alias Blockly.Events.BlockBase
|
|
31
27
|
*/
|
|
32
|
-
|
|
33
|
-
BlockBase.superClass_.constructor.call(this);
|
|
34
|
-
this.isBlank = typeof opt_block === 'undefined';
|
|
35
|
-
|
|
28
|
+
class BlockBase extends AbstractEvent {
|
|
36
29
|
/**
|
|
37
|
-
*
|
|
38
|
-
*
|
|
30
|
+
* @param {!Block=} opt_block The block this event corresponds to.
|
|
31
|
+
* Undefined for a blank event.
|
|
39
32
|
*/
|
|
40
|
-
|
|
33
|
+
constructor(opt_block) {
|
|
34
|
+
super();
|
|
35
|
+
this.isBlank = typeof opt_block === 'undefined';
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* The block ID for the block this event pertains to
|
|
39
|
+
* @type {string}
|
|
40
|
+
*/
|
|
41
|
+
this.blockId = this.isBlank ? '' : opt_block.id;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The workspace identifier for this event.
|
|
45
|
+
* @type {string}
|
|
46
|
+
*/
|
|
47
|
+
this.workspaceId = this.isBlank ? '' : opt_block.workspace.id;
|
|
48
|
+
}
|
|
41
49
|
|
|
42
50
|
/**
|
|
43
|
-
*
|
|
44
|
-
* @
|
|
51
|
+
* Encode the event as JSON.
|
|
52
|
+
* @return {!Object} JSON representation.
|
|
45
53
|
*/
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
* Encode the event as JSON.
|
|
52
|
-
* @return {!Object} JSON representation.
|
|
53
|
-
*/
|
|
54
|
-
BlockBase.prototype.toJson = function() {
|
|
55
|
-
const json = BlockBase.superClass_.toJson.call(this);
|
|
56
|
-
json['blockId'] = this.blockId;
|
|
57
|
-
return json;
|
|
58
|
-
};
|
|
54
|
+
toJson() {
|
|
55
|
+
const json = super.toJson();
|
|
56
|
+
json['blockId'] = this.blockId;
|
|
57
|
+
return json;
|
|
58
|
+
}
|
|
59
59
|
|
|
60
|
-
/**
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
60
|
+
/**
|
|
61
|
+
* Decode the JSON event.
|
|
62
|
+
* @param {!Object} json JSON representation.
|
|
63
|
+
*/
|
|
64
|
+
fromJson(json) {
|
|
65
|
+
super.fromJson(json);
|
|
66
|
+
this.blockId = json['blockId'];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
68
69
|
|
|
69
70
|
exports.BlockBase = BlockBase;
|
|
@@ -17,7 +17,6 @@ goog.module('Blockly.Events.BlockChange');
|
|
|
17
17
|
|
|
18
18
|
const Xml = goog.require('Blockly.Xml');
|
|
19
19
|
const eventUtils = goog.require('Blockly.Events.utils');
|
|
20
|
-
const object = goog.require('Blockly.utils.object');
|
|
21
20
|
const registry = goog.require('Blockly.registry');
|
|
22
21
|
const {BlockBase} = goog.require('Blockly.Events.BlockBase');
|
|
23
22
|
/* eslint-disable-next-line no-unused-vars */
|
|
@@ -28,145 +27,152 @@ const {Block} = goog.requireType('Blockly.Block');
|
|
|
28
27
|
|
|
29
28
|
/**
|
|
30
29
|
* Class for a block change event.
|
|
31
|
-
* @param {!Block=} opt_block The changed block. Undefined for a blank
|
|
32
|
-
* event.
|
|
33
|
-
* @param {string=} opt_element One of 'field', 'comment', 'disabled', etc.
|
|
34
|
-
* @param {?string=} opt_name Name of input or field affected, or null.
|
|
35
|
-
* @param {*=} opt_oldValue Previous value of element.
|
|
36
|
-
* @param {*=} opt_newValue New value of element.
|
|
37
30
|
* @extends {BlockBase}
|
|
38
|
-
* @constructor
|
|
39
31
|
* @alias Blockly.Events.BlockChange
|
|
40
32
|
*/
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
object.inherits(BlockChange, BlockBase);
|
|
33
|
+
class BlockChange extends BlockBase {
|
|
34
|
+
/**
|
|
35
|
+
* @param {!Block=} opt_block The changed block. Undefined for a blank
|
|
36
|
+
* event.
|
|
37
|
+
* @param {string=} opt_element One of 'field', 'comment', 'disabled', etc.
|
|
38
|
+
* @param {?string=} opt_name Name of input or field affected, or null.
|
|
39
|
+
* @param {*=} opt_oldValue Previous value of element.
|
|
40
|
+
* @param {*=} opt_newValue New value of element.
|
|
41
|
+
*/
|
|
42
|
+
constructor(opt_block, opt_element, opt_name, opt_oldValue, opt_newValue) {
|
|
43
|
+
super(opt_block);
|
|
53
44
|
|
|
54
|
-
/**
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Type of this event.
|
|
47
|
+
* @type {string}
|
|
48
|
+
*/
|
|
49
|
+
this.type = eventUtils.BLOCK_CHANGE;
|
|
59
50
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
if (this.name) {
|
|
68
|
-
json['name'] = this.name;
|
|
51
|
+
if (!opt_block) {
|
|
52
|
+
return; // Blank event to be populated by fromJson.
|
|
53
|
+
}
|
|
54
|
+
this.element = typeof opt_element === 'undefined' ? '' : opt_element;
|
|
55
|
+
this.name = typeof opt_name === 'undefined' ? '' : opt_name;
|
|
56
|
+
this.oldValue = typeof opt_oldValue === 'undefined' ? '' : opt_oldValue;
|
|
57
|
+
this.newValue = typeof opt_newValue === 'undefined' ? '' : opt_newValue;
|
|
69
58
|
}
|
|
70
|
-
json['oldValue'] = this.oldValue;
|
|
71
|
-
json['newValue'] = this.newValue;
|
|
72
|
-
return json;
|
|
73
|
-
};
|
|
74
59
|
|
|
75
|
-
/**
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
* @return {boolean} False if something changed.
|
|
90
|
-
*/
|
|
91
|
-
BlockChange.prototype.isNull = function() {
|
|
92
|
-
return this.oldValue === this.newValue;
|
|
93
|
-
};
|
|
60
|
+
/**
|
|
61
|
+
* Encode the event as JSON.
|
|
62
|
+
* @return {!Object} JSON representation.
|
|
63
|
+
*/
|
|
64
|
+
toJson() {
|
|
65
|
+
const json = super.toJson();
|
|
66
|
+
json['element'] = this.element;
|
|
67
|
+
if (this.name) {
|
|
68
|
+
json['name'] = this.name;
|
|
69
|
+
}
|
|
70
|
+
json['oldValue'] = this.oldValue;
|
|
71
|
+
json['newValue'] = this.newValue;
|
|
72
|
+
return json;
|
|
73
|
+
}
|
|
94
74
|
|
|
95
|
-
/**
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
75
|
+
/**
|
|
76
|
+
* Decode the JSON event.
|
|
77
|
+
* @param {!Object} json JSON representation.
|
|
78
|
+
*/
|
|
79
|
+
fromJson(json) {
|
|
80
|
+
super.fromJson(json);
|
|
81
|
+
this.element = json['element'];
|
|
82
|
+
this.name = json['name'];
|
|
83
|
+
this.oldValue = json['oldValue'];
|
|
84
|
+
this.newValue = json['newValue'];
|
|
105
85
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Does this event record any change of state?
|
|
89
|
+
* @return {boolean} False if something changed.
|
|
90
|
+
*/
|
|
91
|
+
isNull() {
|
|
92
|
+
return this.oldValue === this.newValue;
|
|
109
93
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Run a change event.
|
|
97
|
+
* @param {boolean} forward True if run forward, false if run backward (undo).
|
|
98
|
+
*/
|
|
99
|
+
run(forward) {
|
|
100
|
+
const workspace = this.getEventWorkspace_();
|
|
101
|
+
const block = workspace.getBlockById(this.blockId);
|
|
102
|
+
if (!block) {
|
|
103
|
+
console.warn('Can\'t change non-existent block: ' + this.blockId);
|
|
104
|
+
return;
|
|
120
105
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
|
|
106
|
+
|
|
107
|
+
// Assume the block is rendered so that then we can check.
|
|
108
|
+
const blockSvg = /** @type {!BlockSvg} */ (block);
|
|
109
|
+
if (blockSvg.mutator) {
|
|
110
|
+
// Close the mutator (if open) since we don't want to update it.
|
|
111
|
+
blockSvg.mutator.setVisible(false);
|
|
112
|
+
}
|
|
113
|
+
const value = forward ? this.newValue : this.oldValue;
|
|
114
|
+
switch (this.element) {
|
|
115
|
+
case 'field': {
|
|
116
|
+
const field = block.getField(this.name);
|
|
117
|
+
if (field) {
|
|
118
|
+
field.setValue(value);
|
|
119
|
+
} else {
|
|
120
|
+
console.warn('Can\'t set non-existent field: ' + this.name);
|
|
121
|
+
}
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
case 'comment':
|
|
125
|
+
block.setCommentText(/** @type {string} */ (value) || null);
|
|
126
|
+
break;
|
|
127
|
+
case 'collapsed':
|
|
128
|
+
block.setCollapsed(!!value);
|
|
129
|
+
break;
|
|
130
|
+
case 'disabled':
|
|
131
|
+
block.setEnabled(!value);
|
|
132
|
+
break;
|
|
133
|
+
case 'inline':
|
|
134
|
+
block.setInputsInline(!!value);
|
|
135
|
+
break;
|
|
136
|
+
case 'mutation': {
|
|
137
|
+
const oldState = BlockChange.getExtraBlockState_(
|
|
138
|
+
/** @type {!BlockSvg} */ (block));
|
|
139
|
+
if (block.loadExtraState) {
|
|
140
|
+
block.loadExtraState(
|
|
141
|
+
JSON.parse(/** @type {string} */ (value) || '{}'));
|
|
142
|
+
} else if (block.domToMutation) {
|
|
143
|
+
block.domToMutation(
|
|
144
|
+
Xml.textToDom(/** @type {string} */ (value) || '<mutation/>'));
|
|
145
|
+
}
|
|
146
|
+
eventUtils.fire(
|
|
147
|
+
new BlockChange(block, 'mutation', null, oldState, value));
|
|
148
|
+
break;
|
|
141
149
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
break;
|
|
150
|
+
default:
|
|
151
|
+
console.warn('Unknown change type: ' + this.element);
|
|
145
152
|
}
|
|
146
|
-
default:
|
|
147
|
-
console.warn('Unknown change type: ' + this.element);
|
|
148
153
|
}
|
|
149
|
-
};
|
|
150
154
|
|
|
151
|
-
// TODO (#5397): Encapsulate this in the BlocklyMutationChange event when
|
|
152
|
-
// refactoring change events.
|
|
153
|
-
/**
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
155
|
+
// TODO (#5397): Encapsulate this in the BlocklyMutationChange event when
|
|
156
|
+
// refactoring change events.
|
|
157
|
+
/**
|
|
158
|
+
* Returns the extra state of the given block (either as XML or a JSO,
|
|
159
|
+
* depending on the block's definition).
|
|
160
|
+
* @param {!BlockSvg} block The block to get the extra state of.
|
|
161
|
+
* @return {string} A stringified version of the extra state of the given
|
|
162
|
+
* block.
|
|
163
|
+
* @package
|
|
164
|
+
*/
|
|
165
|
+
static getExtraBlockState_(block) {
|
|
166
|
+
if (block.saveExtraState) {
|
|
167
|
+
const state = block.saveExtraState();
|
|
168
|
+
return state ? JSON.stringify(state) : '';
|
|
169
|
+
} else if (block.mutationToDom) {
|
|
170
|
+
const state = block.mutationToDom();
|
|
171
|
+
return state ? Xml.domToText(state) : '';
|
|
172
|
+
}
|
|
173
|
+
return '';
|
|
167
174
|
}
|
|
168
|
-
|
|
169
|
-
};
|
|
175
|
+
}
|
|
170
176
|
|
|
171
177
|
registry.register(registry.Type.EVENT, eventUtils.CHANGE, BlockChange);
|
|
172
178
|
|