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
|
@@ -18,7 +18,6 @@ goog.module('Blockly.Events.BlockCreate');
|
|
|
18
18
|
const Xml = goog.require('Blockly.Xml');
|
|
19
19
|
const blocks = goog.require('Blockly.serialization.blocks');
|
|
20
20
|
const eventUtils = goog.require('Blockly.Events.utils');
|
|
21
|
-
const object = goog.require('Blockly.utils.object');
|
|
22
21
|
const registry = goog.require('Blockly.registry');
|
|
23
22
|
const {BlockBase} = goog.require('Blockly.Events.BlockBase');
|
|
24
23
|
/* eslint-disable-next-line no-unused-vars */
|
|
@@ -27,90 +26,93 @@ const {Block} = goog.requireType('Blockly.Block');
|
|
|
27
26
|
|
|
28
27
|
/**
|
|
29
28
|
* Class for a block creation event.
|
|
30
|
-
* @param {!Block=} opt_block The created block. Undefined for a blank
|
|
31
|
-
* event.
|
|
32
29
|
* @extends {BlockBase}
|
|
33
|
-
* @constructor
|
|
34
30
|
* @alias Blockly.Events.BlockCreate
|
|
35
31
|
*/
|
|
36
|
-
|
|
37
|
-
BlockCreate.superClass_.constructor.call(this, opt_block);
|
|
38
|
-
if (!opt_block) {
|
|
39
|
-
return; // Blank event to be populated by fromJson.
|
|
40
|
-
}
|
|
41
|
-
if (opt_block.isShadow()) {
|
|
42
|
-
// Moving shadow blocks is handled via disconnection.
|
|
43
|
-
this.recordUndo = false;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
this.xml = Xml.blockToDomWithXY(opt_block);
|
|
47
|
-
this.ids = eventUtils.getDescendantIds(opt_block);
|
|
48
|
-
|
|
32
|
+
class BlockCreate extends BlockBase {
|
|
49
33
|
/**
|
|
50
|
-
*
|
|
51
|
-
*
|
|
34
|
+
* @param {!Block=} opt_block The created block. Undefined for a blank
|
|
35
|
+
* event.
|
|
52
36
|
*/
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
};
|
|
56
|
-
object.inherits(BlockCreate, BlockBase);
|
|
37
|
+
constructor(opt_block) {
|
|
38
|
+
super(opt_block);
|
|
57
39
|
|
|
58
|
-
/**
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
40
|
+
/**
|
|
41
|
+
* Type of this event.
|
|
42
|
+
* @type {string}
|
|
43
|
+
*/
|
|
44
|
+
this.type = eventUtils.BLOCK_CREATE;
|
|
63
45
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
46
|
+
if (!opt_block) {
|
|
47
|
+
return; // Blank event to be populated by fromJson.
|
|
48
|
+
}
|
|
49
|
+
if (opt_block.isShadow()) {
|
|
50
|
+
// Moving shadow blocks is handled via disconnection.
|
|
51
|
+
this.recordUndo = false;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
this.xml = Xml.blockToDomWithXY(opt_block);
|
|
55
|
+
this.ids = eventUtils.getDescendantIds(opt_block);
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* JSON representation of the block that was just created.
|
|
59
|
+
* @type {!blocks.State}
|
|
60
|
+
*/
|
|
61
|
+
this.json = /** @type {!blocks.State} */ (
|
|
62
|
+
blocks.save(opt_block, {addCoordinates: true}));
|
|
75
63
|
}
|
|
76
|
-
return json;
|
|
77
|
-
};
|
|
78
64
|
|
|
79
|
-
/**
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
65
|
+
/**
|
|
66
|
+
* Encode the event as JSON.
|
|
67
|
+
* @return {!Object} JSON representation.
|
|
68
|
+
*/
|
|
69
|
+
toJson() {
|
|
70
|
+
const json = super.toJson();
|
|
71
|
+
json['xml'] = Xml.domToText(this.xml);
|
|
72
|
+
json['ids'] = this.ids;
|
|
73
|
+
json['json'] = this.json;
|
|
74
|
+
if (!this.recordUndo) {
|
|
75
|
+
json['recordUndo'] = this.recordUndo;
|
|
76
|
+
}
|
|
77
|
+
return json;
|
|
90
78
|
}
|
|
91
|
-
};
|
|
92
79
|
|
|
93
|
-
/**
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
80
|
+
/**
|
|
81
|
+
* Decode the JSON event.
|
|
82
|
+
* @param {!Object} json JSON representation.
|
|
83
|
+
*/
|
|
84
|
+
fromJson(json) {
|
|
85
|
+
super.fromJson(json);
|
|
86
|
+
this.xml = Xml.textToDom(json['xml']);
|
|
87
|
+
this.ids = json['ids'];
|
|
88
|
+
this.json = /** @type {!blocks.State} */ (json['json']);
|
|
89
|
+
if (json['recordUndo'] !== undefined) {
|
|
90
|
+
this.recordUndo = json['recordUndo'];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Run a creation event.
|
|
96
|
+
* @param {boolean} forward True if run forward, false if run backward (undo).
|
|
97
|
+
*/
|
|
98
|
+
run(forward) {
|
|
99
|
+
const workspace = this.getEventWorkspace_();
|
|
100
|
+
if (forward) {
|
|
101
|
+
blocks.append(this.json, workspace);
|
|
102
|
+
} else {
|
|
103
|
+
for (let i = 0; i < this.ids.length; i++) {
|
|
104
|
+
const id = this.ids[i];
|
|
105
|
+
const block = workspace.getBlockById(id);
|
|
106
|
+
if (block) {
|
|
107
|
+
block.dispose(false);
|
|
108
|
+
} else if (id === this.blockId) {
|
|
109
|
+
// Only complain about root-level block.
|
|
110
|
+
console.warn('Can\'t uncreate non-existent block: ' + id);
|
|
111
|
+
}
|
|
110
112
|
}
|
|
111
113
|
}
|
|
112
114
|
}
|
|
113
|
-
}
|
|
115
|
+
}
|
|
114
116
|
|
|
115
117
|
registry.register(registry.Type.EVENT, eventUtils.CREATE, BlockCreate);
|
|
116
118
|
|
|
@@ -18,7 +18,6 @@ goog.module('Blockly.Events.BlockDelete');
|
|
|
18
18
|
const Xml = goog.require('Blockly.Xml');
|
|
19
19
|
const blocks = goog.require('Blockly.serialization.blocks');
|
|
20
20
|
const eventUtils = goog.require('Blockly.Events.utils');
|
|
21
|
-
const object = goog.require('Blockly.utils.object');
|
|
22
21
|
const registry = goog.require('Blockly.registry');
|
|
23
22
|
const {BlockBase} = goog.require('Blockly.Events.BlockBase');
|
|
24
23
|
/* eslint-disable-next-line no-unused-vars */
|
|
@@ -27,102 +26,105 @@ const {Block} = goog.requireType('Blockly.Block');
|
|
|
27
26
|
|
|
28
27
|
/**
|
|
29
28
|
* Class for a block deletion event.
|
|
30
|
-
* @param {!Block=} opt_block The deleted block. Undefined for a blank
|
|
31
|
-
* event.
|
|
32
29
|
* @extends {BlockBase}
|
|
33
|
-
* @constructor
|
|
34
30
|
* @alias Blockly.Events.BlockDelete
|
|
35
31
|
*/
|
|
36
|
-
|
|
37
|
-
BlockDelete.superClass_.constructor.call(this, opt_block);
|
|
38
|
-
if (!opt_block) {
|
|
39
|
-
return; // Blank event to be populated by fromJson.
|
|
40
|
-
}
|
|
41
|
-
if (opt_block.getParent()) {
|
|
42
|
-
throw Error('Connected blocks cannot be deleted.');
|
|
43
|
-
}
|
|
44
|
-
if (opt_block.isShadow()) {
|
|
45
|
-
// Respawning shadow blocks is handled via disconnection.
|
|
46
|
-
this.recordUndo = false;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
this.oldXml = Xml.blockToDomWithXY(opt_block);
|
|
50
|
-
this.ids = eventUtils.getDescendantIds(opt_block);
|
|
51
|
-
|
|
32
|
+
class BlockDelete extends BlockBase {
|
|
52
33
|
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
34
|
+
* @param {!Block=} opt_block The deleted block. Undefined for a blank
|
|
35
|
+
* event.
|
|
55
36
|
*/
|
|
56
|
-
|
|
37
|
+
constructor(opt_block) {
|
|
38
|
+
super(opt_block);
|
|
57
39
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
blocks.save(opt_block, {addCoordinates: true}));
|
|
64
|
-
};
|
|
65
|
-
object.inherits(BlockDelete, BlockBase);
|
|
40
|
+
/**
|
|
41
|
+
* Type of this event.
|
|
42
|
+
* @type {string}
|
|
43
|
+
*/
|
|
44
|
+
this.type = eventUtils.BLOCK_DELETE;
|
|
66
45
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
46
|
+
if (!opt_block) {
|
|
47
|
+
return; // Blank event to be populated by fromJson.
|
|
48
|
+
}
|
|
49
|
+
if (opt_block.getParent()) {
|
|
50
|
+
throw Error('Connected blocks cannot be deleted.');
|
|
51
|
+
}
|
|
52
|
+
if (opt_block.isShadow()) {
|
|
53
|
+
// Respawning shadow blocks is handled via disconnection.
|
|
54
|
+
this.recordUndo = false;
|
|
55
|
+
}
|
|
72
56
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
57
|
+
this.oldXml = Xml.blockToDomWithXY(opt_block);
|
|
58
|
+
this.ids = eventUtils.getDescendantIds(opt_block);
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Was the block that was just deleted a shadow?
|
|
62
|
+
* @type {boolean}
|
|
63
|
+
*/
|
|
64
|
+
this.wasShadow = opt_block.isShadow();
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* JSON representation of the block that was just deleted.
|
|
68
|
+
* @type {!blocks.State}
|
|
69
|
+
*/
|
|
70
|
+
this.oldJson = /** @type {!blocks.State} */ (
|
|
71
|
+
blocks.save(opt_block, {addCoordinates: true}));
|
|
85
72
|
}
|
|
86
|
-
return json;
|
|
87
|
-
};
|
|
88
73
|
|
|
89
|
-
/**
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
74
|
+
/**
|
|
75
|
+
* Encode the event as JSON.
|
|
76
|
+
* @return {!Object} JSON representation.
|
|
77
|
+
*/
|
|
78
|
+
toJson() {
|
|
79
|
+
const json = super.toJson();
|
|
80
|
+
json['oldXml'] = Xml.domToText(this.oldXml);
|
|
81
|
+
json['ids'] = this.ids;
|
|
82
|
+
json['wasShadow'] = this.wasShadow;
|
|
83
|
+
json['oldJson'] = this.oldJson;
|
|
84
|
+
if (!this.recordUndo) {
|
|
85
|
+
json['recordUndo'] = this.recordUndo;
|
|
86
|
+
}
|
|
87
|
+
return json;
|
|
102
88
|
}
|
|
103
|
-
};
|
|
104
89
|
|
|
105
|
-
/**
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
90
|
+
/**
|
|
91
|
+
* Decode the JSON event.
|
|
92
|
+
* @param {!Object} json JSON representation.
|
|
93
|
+
*/
|
|
94
|
+
fromJson(json) {
|
|
95
|
+
super.fromJson(json);
|
|
96
|
+
this.oldXml = Xml.textToDom(json['oldXml']);
|
|
97
|
+
this.ids = json['ids'];
|
|
98
|
+
this.wasShadow =
|
|
99
|
+
json['wasShadow'] || this.oldXml.tagName.toLowerCase() === 'shadow';
|
|
100
|
+
this.oldJson = /** @type {!blocks.State} */ (json['oldJson']);
|
|
101
|
+
if (json['recordUndo'] !== undefined) {
|
|
102
|
+
this.recordUndo = json['recordUndo'];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Run a deletion event.
|
|
108
|
+
* @param {boolean} forward True if run forward, false if run backward (undo).
|
|
109
|
+
*/
|
|
110
|
+
run(forward) {
|
|
111
|
+
const workspace = this.getEventWorkspace_();
|
|
112
|
+
if (forward) {
|
|
113
|
+
for (let i = 0; i < this.ids.length; i++) {
|
|
114
|
+
const id = this.ids[i];
|
|
115
|
+
const block = workspace.getBlockById(id);
|
|
116
|
+
if (block) {
|
|
117
|
+
block.dispose(false);
|
|
118
|
+
} else if (id === this.blockId) {
|
|
119
|
+
// Only complain about root-level block.
|
|
120
|
+
console.warn('Can\'t delete non-existent block: ' + id);
|
|
121
|
+
}
|
|
120
122
|
}
|
|
123
|
+
} else {
|
|
124
|
+
blocks.append(this.oldJson, workspace);
|
|
121
125
|
}
|
|
122
|
-
} else {
|
|
123
|
-
blocks.append(this.oldJson, workspace);
|
|
124
126
|
}
|
|
125
|
-
}
|
|
127
|
+
}
|
|
126
128
|
|
|
127
129
|
registry.register(registry.Type.EVENT, eventUtils.DELETE, BlockDelete);
|
|
128
130
|
|
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
goog.module('Blockly.Events.BlockDrag');
|
|
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
|
/* eslint-disable-next-line no-unused-vars */
|
|
22
21
|
const {Block} = goog.requireType('Blockly.Block');
|
|
@@ -25,63 +24,65 @@ const {UiBase} = goog.require('Blockly.Events.UiBase');
|
|
|
25
24
|
|
|
26
25
|
/**
|
|
27
26
|
* Class for a block drag event.
|
|
28
|
-
* @param {!Block=} opt_block The top block in the stack that is being
|
|
29
|
-
* dragged. Undefined for a blank event.
|
|
30
|
-
* @param {boolean=} opt_isStart Whether this is the start of a block drag.
|
|
31
|
-
* Undefined for a blank event.
|
|
32
|
-
* @param {!Array<!Block>=} opt_blocks The blocks affected by this
|
|
33
|
-
* drag. Undefined for a blank event.
|
|
34
27
|
* @extends {UiBase}
|
|
35
|
-
* @constructor
|
|
36
28
|
* @alias Blockly.Events.BlockDrag
|
|
37
29
|
*/
|
|
38
|
-
|
|
39
|
-
const workspaceId = opt_block ? opt_block.workspace.id : undefined;
|
|
40
|
-
BlockDrag.superClass_.constructor.call(this, workspaceId);
|
|
41
|
-
this.blockId = opt_block ? opt_block.id : null;
|
|
42
|
-
|
|
30
|
+
class BlockDrag extends UiBase {
|
|
43
31
|
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
32
|
+
* @param {!Block=} opt_block The top block in the stack that is being
|
|
33
|
+
* dragged. Undefined for a blank event.
|
|
34
|
+
* @param {boolean=} opt_isStart Whether this is the start of a block drag.
|
|
35
|
+
* Undefined for a blank event.
|
|
36
|
+
* @param {!Array<!Block>=} opt_blocks The blocks affected by this
|
|
37
|
+
* drag. Undefined for a blank event.
|
|
46
38
|
*/
|
|
47
|
-
|
|
39
|
+
constructor(opt_block, opt_isStart, opt_blocks) {
|
|
40
|
+
const workspaceId = opt_block ? opt_block.workspace.id : undefined;
|
|
41
|
+
super(workspaceId);
|
|
42
|
+
this.blockId = opt_block ? opt_block.id : null;
|
|
48
43
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
};
|
|
55
|
-
object.inherits(BlockDrag, UiBase);
|
|
44
|
+
/**
|
|
45
|
+
* Whether this is the start of a block drag.
|
|
46
|
+
* @type {boolean|undefined}
|
|
47
|
+
*/
|
|
48
|
+
this.isStart = opt_isStart;
|
|
56
49
|
|
|
57
|
-
/**
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
50
|
+
/**
|
|
51
|
+
* The blocks affected by this drag event.
|
|
52
|
+
* @type {!Array<!Block>|undefined}
|
|
53
|
+
*/
|
|
54
|
+
this.blocks = opt_blocks;
|
|
62
55
|
|
|
63
|
-
/**
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
json['isStart'] = this.isStart;
|
|
70
|
-
json['blockId'] = this.blockId;
|
|
71
|
-
json['blocks'] = this.blocks;
|
|
72
|
-
return json;
|
|
73
|
-
};
|
|
56
|
+
/**
|
|
57
|
+
* Type of this event.
|
|
58
|
+
* @type {string}
|
|
59
|
+
*/
|
|
60
|
+
this.type = eventUtils.BLOCK_DRAG;
|
|
61
|
+
}
|
|
74
62
|
|
|
75
|
-
/**
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
63
|
+
/**
|
|
64
|
+
* Encode the event as JSON.
|
|
65
|
+
* @return {!Object} JSON representation.
|
|
66
|
+
*/
|
|
67
|
+
toJson() {
|
|
68
|
+
const json = super.toJson();
|
|
69
|
+
json['isStart'] = this.isStart;
|
|
70
|
+
json['blockId'] = this.blockId;
|
|
71
|
+
json['blocks'] = this.blocks;
|
|
72
|
+
return json;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Decode the JSON event.
|
|
77
|
+
* @param {!Object} json JSON representation.
|
|
78
|
+
*/
|
|
79
|
+
fromJson(json) {
|
|
80
|
+
super.fromJson(json);
|
|
81
|
+
this.isStart = json['isStart'];
|
|
82
|
+
this.blockId = json['blockId'];
|
|
83
|
+
this.blocks = json['blocks'];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
85
86
|
|
|
86
87
|
registry.register(registry.Type.EVENT, eventUtils.BLOCK_DRAG, BlockDrag);
|
|
87
88
|
|