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.
Files changed (262) hide show
  1. package/blockly.d.ts +18963 -18432
  2. package/blockly.min.js +852 -844
  3. package/blockly_compressed.js +669 -664
  4. package/blockly_compressed.js.map +1 -1
  5. package/blocks/blocks.js +47 -0
  6. package/blocks/colour.js +13 -3
  7. package/blocks/lists.js +22 -13
  8. package/blocks/logic.js +13 -3
  9. package/blocks/loops.js +24 -11
  10. package/blocks/math.js +12 -3
  11. package/blocks/procedures.js +41 -27
  12. package/blocks/text.js +22 -13
  13. package/blocks/variables.js +14 -3
  14. package/blocks/variables_dynamic.js +13 -3
  15. package/blocks_compressed.js +146 -141
  16. package/blocks_compressed.js.map +1 -1
  17. package/core/block.js +1869 -1814
  18. package/core/block_drag_surface.js +201 -200
  19. package/core/block_dragger.js +377 -373
  20. package/core/block_svg.js +1593 -1479
  21. package/core/blockly.js +8 -22
  22. package/core/blocks.js +9 -2
  23. package/core/browser_events.js +22 -5
  24. package/core/bubble.js +841 -797
  25. package/core/bubble_dragger.js +213 -206
  26. package/core/bump_objects.js +2 -2
  27. package/core/clipboard.js +9 -9
  28. package/core/comment.js +353 -332
  29. package/core/common.js +46 -17
  30. package/core/component_manager.js +181 -174
  31. package/core/config.js +87 -0
  32. package/core/connection.js +595 -584
  33. package/core/connection_checker.js +242 -244
  34. package/core/connection_db.js +235 -230
  35. package/core/contextmenu.js +9 -6
  36. package/core/contextmenu_items.js +1 -2
  37. package/core/contextmenu_registry.js +93 -89
  38. package/core/css.js +474 -474
  39. package/core/delete_area.js +45 -42
  40. package/core/drag_target.js +57 -56
  41. package/core/dropdowndiv.js +153 -163
  42. package/core/events/events.js +2 -2
  43. package/core/events/events_abstract.js +89 -77
  44. package/core/events/events_block_base.js +37 -36
  45. package/core/events/events_block_change.js +130 -124
  46. package/core/events/events_block_create.js +73 -71
  47. package/core/events/events_block_delete.js +84 -82
  48. package/core/events/events_block_drag.js +50 -49
  49. package/core/events/events_block_move.js +147 -140
  50. package/core/events/events_bubble_open.js +51 -50
  51. package/core/events/events_click.js +48 -44
  52. package/core/events/events_comment_base.js +72 -69
  53. package/core/events/events_comment_change.js +63 -61
  54. package/core/events/events_comment_create.js +44 -42
  55. package/core/events/events_comment_delete.js +42 -40
  56. package/core/events/events_comment_move.js +106 -104
  57. package/core/events/events_marker_move.js +65 -64
  58. package/core/events/events_selected.js +46 -45
  59. package/core/events/events_theme_change.js +36 -35
  60. package/core/events/events_toolbox_item_select.js +46 -45
  61. package/core/events/events_trashcan_open.js +37 -36
  62. package/core/events/events_ui.js +47 -46
  63. package/core/events/events_ui_base.js +30 -29
  64. package/core/events/events_var_base.js +37 -36
  65. package/core/events/events_var_create.js +50 -48
  66. package/core/events/events_var_delete.js +50 -48
  67. package/core/events/events_var_rename.js +51 -49
  68. package/core/events/events_viewport.js +66 -65
  69. package/core/events/utils.js +29 -14
  70. package/core/events/workspace_events.js +49 -55
  71. package/core/extensions.js +4 -3
  72. package/core/field.js +1061 -997
  73. package/core/field_angle.js +462 -442
  74. package/core/field_checkbox.js +194 -182
  75. package/core/field_colour.js +519 -505
  76. package/core/field_dropdown.js +617 -598
  77. package/core/field_image.js +229 -220
  78. package/core/field_label.js +102 -91
  79. package/core/field_label_serializable.js +42 -41
  80. package/core/field_multilineinput.js +372 -358
  81. package/core/field_number.js +272 -253
  82. package/core/field_textinput.js +499 -467
  83. package/core/field_variable.js +458 -420
  84. package/core/flyout_base.js +1005 -952
  85. package/core/flyout_button.js +277 -260
  86. package/core/flyout_horizontal.js +304 -302
  87. package/core/flyout_metrics_manager.js +64 -64
  88. package/core/flyout_vertical.js +306 -300
  89. package/core/generator.js +459 -446
  90. package/core/gesture.js +829 -813
  91. package/core/grid.js +166 -163
  92. package/core/icon.js +168 -159
  93. package/core/inject.js +7 -5
  94. package/core/input.js +257 -248
  95. package/core/insertion_marker_manager.js +655 -624
  96. package/core/internal_constants.js +0 -129
  97. package/core/keyboard_nav/ast_node.js +605 -596
  98. package/core/keyboard_nav/basic_cursor.js +166 -165
  99. package/core/keyboard_nav/cursor.js +99 -97
  100. package/core/keyboard_nav/marker.js +83 -79
  101. package/core/keyboard_nav/tab_navigate_cursor.js +18 -23
  102. package/core/marker_manager.js +153 -141
  103. package/core/menu.js +377 -372
  104. package/core/menuitem.js +223 -217
  105. package/core/metrics_manager.js +403 -390
  106. package/core/mutator.js +468 -437
  107. package/core/names.js +229 -188
  108. package/core/options.js +290 -284
  109. package/core/procedures.js +29 -17
  110. package/core/registry.js +19 -16
  111. package/core/rendered_connection.js +482 -463
  112. package/core/renderers/common/block_rendering.js +9 -3
  113. package/core/renderers/common/constants.js +1119 -1112
  114. package/core/renderers/common/debug.js +14 -0
  115. package/core/renderers/common/debugger.js +338 -316
  116. package/core/renderers/common/drawer.js +380 -370
  117. package/core/renderers/common/i_path_object.js +2 -2
  118. package/core/renderers/common/info.js +626 -618
  119. package/core/renderers/common/marker_svg.js +579 -541
  120. package/core/renderers/common/path_object.js +203 -200
  121. package/core/renderers/common/renderer.js +220 -218
  122. package/core/renderers/geras/constants.js +36 -36
  123. package/core/renderers/geras/drawer.js +155 -147
  124. package/core/renderers/geras/highlight_constants.js +244 -238
  125. package/core/renderers/geras/highlighter.js +231 -179
  126. package/core/renderers/geras/info.js +392 -369
  127. package/core/renderers/geras/measurables/inline_input.js +25 -19
  128. package/core/renderers/geras/measurables/statement_input.js +23 -17
  129. package/core/renderers/geras/path_object.js +106 -121
  130. package/core/renderers/geras/renderer.js +96 -98
  131. package/core/renderers/measurables/base.js +30 -18
  132. package/core/renderers/measurables/bottom_row.js +83 -80
  133. package/core/renderers/measurables/connection.js +22 -15
  134. package/core/renderers/measurables/external_value_input.js +35 -22
  135. package/core/renderers/measurables/field.js +35 -20
  136. package/core/renderers/measurables/hat.js +18 -13
  137. package/core/renderers/measurables/icon.js +24 -17
  138. package/core/renderers/measurables/in_row_spacer.js +15 -13
  139. package/core/renderers/measurables/inline_input.js +43 -33
  140. package/core/renderers/measurables/input_connection.js +41 -28
  141. package/core/renderers/measurables/input_row.js +50 -44
  142. package/core/renderers/measurables/jagged_edge.js +14 -12
  143. package/core/renderers/measurables/next_connection.js +16 -14
  144. package/core/renderers/measurables/output_connection.js +26 -20
  145. package/core/renderers/measurables/previous_connection.js +16 -15
  146. package/core/renderers/measurables/round_corner.js +20 -18
  147. package/core/renderers/measurables/row.js +184 -168
  148. package/core/renderers/measurables/spacer_row.js +38 -23
  149. package/core/renderers/measurables/square_corner.js +18 -16
  150. package/core/renderers/measurables/statement_input.js +23 -20
  151. package/core/renderers/measurables/top_row.js +88 -85
  152. package/core/renderers/minimalist/constants.js +8 -7
  153. package/core/renderers/minimalist/drawer.js +11 -10
  154. package/core/renderers/minimalist/info.js +18 -18
  155. package/core/renderers/minimalist/renderer.js +40 -39
  156. package/core/renderers/thrasos/info.js +258 -248
  157. package/core/renderers/thrasos/renderer.js +20 -20
  158. package/core/renderers/zelos/constants.js +898 -873
  159. package/core/renderers/zelos/drawer.js +186 -169
  160. package/core/renderers/zelos/info.js +502 -479
  161. package/core/renderers/zelos/marker_svg.js +129 -115
  162. package/core/renderers/zelos/measurables/bottom_row.js +31 -30
  163. package/core/renderers/zelos/measurables/inputs.js +22 -21
  164. package/core/renderers/zelos/measurables/row_elements.js +14 -13
  165. package/core/renderers/zelos/measurables/top_row.js +34 -33
  166. package/core/renderers/zelos/path_object.js +181 -180
  167. package/core/renderers/zelos/renderer.js +91 -92
  168. package/core/scrollbar.js +759 -713
  169. package/core/scrollbar_pair.js +250 -245
  170. package/core/serialization/blocks.js +19 -9
  171. package/core/serialization/workspaces.js +3 -2
  172. package/core/shortcut_registry.js +286 -277
  173. package/core/sprites.js +31 -0
  174. package/core/theme.js +135 -141
  175. package/core/theme_manager.js +147 -143
  176. package/core/toolbox/category.js +602 -576
  177. package/core/toolbox/collapsible_category.js +226 -227
  178. package/core/toolbox/separator.js +70 -61
  179. package/core/toolbox/toolbox.js +934 -927
  180. package/core/toolbox/toolbox_item.js +115 -99
  181. package/core/tooltip.js +108 -35
  182. package/core/touch.js +8 -3
  183. package/core/touch_gesture.js +254 -251
  184. package/core/trashcan.js +606 -595
  185. package/core/utils/coordinate.js +97 -95
  186. package/core/utils/dom.js +2 -2
  187. package/core/utils/global.js +2 -0
  188. package/core/utils/rect.js +41 -37
  189. package/core/utils/sentinel.js +25 -0
  190. package/core/utils/size.js +30 -27
  191. package/core/utils/svg.js +18 -16
  192. package/core/variable_map.js +325 -341
  193. package/core/variable_model.js +55 -54
  194. package/core/variables.js +9 -2
  195. package/core/variables_dynamic.js +3 -1
  196. package/core/warning.js +126 -120
  197. package/core/widgetdiv.js +4 -4
  198. package/core/workspace.js +685 -664
  199. package/core/workspace_audio.js +124 -118
  200. package/core/workspace_comment.js +308 -298
  201. package/core/workspace_comment_svg.js +1029 -951
  202. package/core/workspace_drag_surface_svg.js +147 -140
  203. package/core/workspace_dragger.js +70 -71
  204. package/core/workspace_svg.js +2322 -2297
  205. package/core/xml.js +30 -20
  206. package/core/zoom_controls.js +431 -439
  207. package/dart_compressed.js +40 -43
  208. package/dart_compressed.js.map +1 -1
  209. package/generators/dart/colour.js +56 -64
  210. package/generators/dart/lists.js +61 -50
  211. package/generators/dart/math.js +160 -148
  212. package/generators/dart/text.js +83 -61
  213. package/generators/javascript/colour.js +37 -34
  214. package/generators/javascript/lists.js +50 -43
  215. package/generators/javascript/math.js +123 -139
  216. package/generators/javascript/text.js +67 -81
  217. package/generators/lua/colour.js +25 -23
  218. package/generators/lua/lists.js +97 -69
  219. package/generators/lua/logic.js +1 -2
  220. package/generators/lua/math.js +182 -144
  221. package/generators/lua/text.js +116 -99
  222. package/generators/php/colour.js +38 -32
  223. package/generators/php/lists.js +109 -89
  224. package/generators/php/math.js +90 -81
  225. package/generators/php/text.js +63 -61
  226. package/generators/python/colour.js +18 -18
  227. package/generators/python/lists.js +38 -30
  228. package/generators/python/loops.js +12 -8
  229. package/generators/python/math.js +104 -106
  230. package/generators/python/text.js +34 -30
  231. package/javascript_compressed.js +37 -39
  232. package/javascript_compressed.js.map +1 -1
  233. package/lua_compressed.js +39 -42
  234. package/lua_compressed.js.map +1 -1
  235. package/msg/az.js +2 -2
  236. package/msg/be.js +4 -4
  237. package/msg/cs.js +15 -15
  238. package/msg/de.js +1 -1
  239. package/msg/diq.js +1 -1
  240. package/msg/eo.js +1 -1
  241. package/msg/es.js +1 -1
  242. package/msg/fa.js +1 -1
  243. package/msg/fr.js +4 -4
  244. package/msg/he.js +1 -1
  245. package/msg/hr.js +2 -2
  246. package/msg/hy.js +2 -2
  247. package/msg/id.js +12 -12
  248. package/msg/inh.js +14 -14
  249. package/msg/ja.js +7 -7
  250. package/msg/lv.js +29 -29
  251. package/msg/pa.js +3 -3
  252. package/msg/smn.js +436 -0
  253. package/msg/te.js +1 -1
  254. package/msg/yue.js +1 -1
  255. package/msg/zh-hans.js +3 -3
  256. package/msg/zh-hant.js +3 -3
  257. package/package.json +7 -6
  258. package/php_compressed.js +38 -42
  259. package/php_compressed.js.map +1 -1
  260. package/python_compressed.js +26 -25
  261. package/python_compressed.js.map +1 -1
  262. package/blocks/all.js +0 -23
@@ -35,234 +35,235 @@ const {Svg} = goog.require('Blockly.utils.Svg');
35
35
  /**
36
36
  * Class for a drag surface for the currently dragged block. This is a separate
37
37
  * SVG that contains only the currently moving block, or nothing.
38
- * @param {!Element} container Containing element.
39
- * @constructor
40
38
  * @alias Blockly.BlockDragSurfaceSvg
41
39
  */
42
- const BlockDragSurfaceSvg = function(container) {
40
+ const BlockDragSurfaceSvg = class {
43
41
  /**
44
- * @type {!Element}
45
- * @private
42
+ * @param {!Element} container Containing element.
46
43
  */
47
- this.container_ = container;
48
- this.createDom();
49
- };
44
+ constructor(container) {
45
+ /**
46
+ * The SVG drag surface. Set once by BlockDragSurfaceSvg.createDom.
47
+ * @type {?SVGElement}
48
+ * @private
49
+ */
50
+ this.SVG_ = null;
50
51
 
51
- /**
52
- * The SVG drag surface. Set once by BlockDragSurfaceSvg.createDom.
53
- * @type {?SVGElement}
54
- * @private
55
- */
56
- BlockDragSurfaceSvg.prototype.SVG_ = null;
52
+ /**
53
+ * This is where blocks live while they are being dragged if the drag
54
+ * surface is enabled.
55
+ * @type {?SVGElement}
56
+ * @private
57
+ */
58
+ this.dragGroup_ = null;
57
59
 
58
- /**
59
- * This is where blocks live while they are being dragged if the drag surface
60
- * is enabled.
61
- * @type {?SVGElement}
62
- * @private
63
- */
64
- BlockDragSurfaceSvg.prototype.dragGroup_ = null;
60
+ /**
61
+ * Containing HTML element; parent of the workspace and the drag surface.
62
+ * @type {!Element}
63
+ * @private
64
+ */
65
+ this.container_ = container;
65
66
 
66
- /**
67
- * Containing HTML element; parent of the workspace and the drag surface.
68
- * @type {?Element}
69
- * @private
70
- */
71
- BlockDragSurfaceSvg.prototype.container_ = null;
72
-
73
- /**
74
- * Cached value for the scale of the drag surface.
75
- * Used to set/get the correct translation during and after a drag.
76
- * @type {number}
77
- * @private
78
- */
79
- BlockDragSurfaceSvg.prototype.scale_ = 1;
67
+ /**
68
+ * Cached value for the scale of the drag surface.
69
+ * Used to set/get the correct translation during and after a drag.
70
+ * @type {number}
71
+ * @private
72
+ */
73
+ this.scale_ = 1;
80
74
 
81
- /**
82
- * Cached value for the translation of the drag surface.
83
- * This translation is in pixel units, because the scale is applied to the
84
- * drag group rather than the top-level SVG.
85
- * @type {?Coordinate}
86
- * @private
87
- */
88
- BlockDragSurfaceSvg.prototype.surfaceXY_ = null;
75
+ /**
76
+ * Cached value for the translation of the drag surface.
77
+ * This translation is in pixel units, because the scale is applied to the
78
+ * drag group rather than the top-level SVG.
79
+ * @type {?Coordinate}
80
+ * @private
81
+ */
82
+ this.surfaceXY_ = null;
89
83
 
90
- /**
91
- * Cached value for the translation of the child drag surface in pixel units.
92
- * Since the child drag surface tracks the translation of the workspace this is
93
- * ultimately the translation of the workspace.
94
- * @type {!Coordinate}
95
- * @private
96
- */
97
- BlockDragSurfaceSvg.prototype.childSurfaceXY_ = new Coordinate(0, 0);
84
+ /**
85
+ * Cached value for the translation of the child drag surface in pixel
86
+ * units. Since the child drag surface tracks the translation of the
87
+ * workspace this is ultimately the translation of the workspace.
88
+ * @type {!Coordinate}
89
+ * @private
90
+ */
91
+ this.childSurfaceXY_ = new Coordinate(0, 0);
98
92
 
99
- /**
100
- * Create the drag surface and inject it into the container.
101
- */
102
- BlockDragSurfaceSvg.prototype.createDom = function() {
103
- if (this.SVG_) {
104
- return; // Already created.
93
+ this.createDom();
105
94
  }
106
- this.SVG_ = dom.createSvgElement(
107
- Svg.SVG, {
108
- 'xmlns': dom.SVG_NS,
109
- 'xmlns:html': dom.HTML_NS,
110
- 'xmlns:xlink': dom.XLINK_NS,
111
- 'version': '1.1',
112
- 'class': 'blocklyBlockDragSurface',
113
- },
114
- this.container_);
115
- this.dragGroup_ = dom.createSvgElement(Svg.G, {}, this.SVG_);
116
- };
117
95
 
118
- /**
119
- * Set the SVG blocks on the drag surface's group and show the surface.
120
- * Only one block group should be on the drag surface at a time.
121
- * @param {!SVGElement} blocks Block or group of blocks to place on the drag
122
- * surface.
123
- */
124
- BlockDragSurfaceSvg.prototype.setBlocksAndShow = function(blocks) {
125
- if (this.dragGroup_.childNodes.length) {
126
- throw Error('Already dragging a block.');
96
+ /**
97
+ * Create the drag surface and inject it into the container.
98
+ */
99
+ createDom() {
100
+ if (this.SVG_) {
101
+ return; // Already created.
102
+ }
103
+ this.SVG_ = dom.createSvgElement(
104
+ Svg.SVG, {
105
+ 'xmlns': dom.SVG_NS,
106
+ 'xmlns:html': dom.HTML_NS,
107
+ 'xmlns:xlink': dom.XLINK_NS,
108
+ 'version': '1.1',
109
+ 'class': 'blocklyBlockDragSurface',
110
+ },
111
+ this.container_);
112
+ this.dragGroup_ = dom.createSvgElement(Svg.G, {}, this.SVG_);
127
113
  }
128
- // appendChild removes the blocks from the previous parent
129
- this.dragGroup_.appendChild(blocks);
130
- this.SVG_.style.display = 'block';
131
- this.surfaceXY_ = new Coordinate(0, 0);
132
- };
133
114
 
134
- /**
135
- * Translate and scale the entire drag surface group to the given position, to
136
- * keep in sync with the workspace.
137
- * @param {number} x X translation in pixel coordinates.
138
- * @param {number} y Y translation in pixel coordinates.
139
- * @param {number} scale Scale of the group.
140
- */
141
- BlockDragSurfaceSvg.prototype.translateAndScaleGroup = function(x, y, scale) {
142
- this.scale_ = scale;
143
- // This is a work-around to prevent a the blocks from rendering
144
- // fuzzy while they are being dragged on the drag surface.
145
- const fixedX = x.toFixed(0);
146
- const fixedY = y.toFixed(0);
115
+ /**
116
+ * Set the SVG blocks on the drag surface's group and show the surface.
117
+ * Only one block group should be on the drag surface at a time.
118
+ * @param {!SVGElement} blocks Block or group of blocks to place on the drag
119
+ * surface.
120
+ */
121
+ setBlocksAndShow(blocks) {
122
+ if (this.dragGroup_.childNodes.length) {
123
+ throw Error('Already dragging a block.');
124
+ }
125
+ // appendChild removes the blocks from the previous parent
126
+ this.dragGroup_.appendChild(blocks);
127
+ this.SVG_.style.display = 'block';
128
+ this.surfaceXY_ = new Coordinate(0, 0);
129
+ }
147
130
 
148
- this.childSurfaceXY_.x = parseInt(fixedX, 10);
149
- this.childSurfaceXY_.y = parseInt(fixedY, 10);
131
+ /**
132
+ * Translate and scale the entire drag surface group to the given position, to
133
+ * keep in sync with the workspace.
134
+ * @param {number} x X translation in pixel coordinates.
135
+ * @param {number} y Y translation in pixel coordinates.
136
+ * @param {number} scale Scale of the group.
137
+ */
138
+ translateAndScaleGroup(x, y, scale) {
139
+ this.scale_ = scale;
140
+ // This is a work-around to prevent a the blocks from rendering
141
+ // fuzzy while they are being dragged on the drag surface.
142
+ const fixedX = x.toFixed(0);
143
+ const fixedY = y.toFixed(0);
150
144
 
151
- this.dragGroup_.setAttribute(
152
- 'transform',
153
- 'translate(' + fixedX + ',' + fixedY + ') scale(' + scale + ')');
154
- };
145
+ this.childSurfaceXY_.x = parseInt(fixedX, 10);
146
+ this.childSurfaceXY_.y = parseInt(fixedY, 10);
155
147
 
156
- /**
157
- * Translate the drag surface's SVG based on its internal state.
158
- * @private
159
- */
160
- BlockDragSurfaceSvg.prototype.translateSurfaceInternal_ = function() {
161
- let x = this.surfaceXY_.x;
162
- let y = this.surfaceXY_.y;
163
- // This is a work-around to prevent a the blocks from rendering
164
- // fuzzy while they are being dragged on the drag surface.
165
- x = x.toFixed(0);
166
- y = y.toFixed(0);
167
- this.SVG_.style.display = 'block';
148
+ this.dragGroup_.setAttribute(
149
+ 'transform',
150
+ 'translate(' + fixedX + ',' + fixedY + ') scale(' + scale + ')');
151
+ }
168
152
 
169
- dom.setCssTransform(this.SVG_, 'translate3d(' + x + 'px, ' + y + 'px, 0)');
170
- };
153
+ /**
154
+ * Translate the drag surface's SVG based on its internal state.
155
+ * @private
156
+ */
157
+ translateSurfaceInternal_() {
158
+ let x = this.surfaceXY_.x;
159
+ let y = this.surfaceXY_.y;
160
+ // This is a work-around to prevent a the blocks from rendering
161
+ // fuzzy while they are being dragged on the drag surface.
162
+ x = x.toFixed(0);
163
+ y = y.toFixed(0);
164
+ this.SVG_.style.display = 'block';
171
165
 
172
- /**
173
- * Translates the entire surface by a relative offset.
174
- * @param {number} deltaX Horizontal offset in pixel units.
175
- * @param {number} deltaY Vertical offset in pixel units.
176
- */
177
- BlockDragSurfaceSvg.prototype.translateBy = function(deltaX, deltaY) {
178
- const x = this.surfaceXY_.x + deltaX;
179
- const y = this.surfaceXY_.y + deltaY;
180
- this.surfaceXY_ = new Coordinate(x, y);
181
- this.translateSurfaceInternal_();
182
- };
166
+ dom.setCssTransform(this.SVG_, 'translate3d(' + x + 'px, ' + y + 'px, 0)');
167
+ }
183
168
 
184
- /**
185
- * Translate the entire drag surface during a drag.
186
- * We translate the drag surface instead of the blocks inside the surface
187
- * so that the browser avoids repainting the SVG.
188
- * Because of this, the drag coordinates must be adjusted by scale.
189
- * @param {number} x X translation for the entire surface.
190
- * @param {number} y Y translation for the entire surface.
191
- */
192
- BlockDragSurfaceSvg.prototype.translateSurface = function(x, y) {
193
- this.surfaceXY_ = new Coordinate(x * this.scale_, y * this.scale_);
194
- this.translateSurfaceInternal_();
195
- };
169
+ /**
170
+ * Translates the entire surface by a relative offset.
171
+ * @param {number} deltaX Horizontal offset in pixel units.
172
+ * @param {number} deltaY Vertical offset in pixel units.
173
+ */
174
+ translateBy(deltaX, deltaY) {
175
+ const x = this.surfaceXY_.x + deltaX;
176
+ const y = this.surfaceXY_.y + deltaY;
177
+ this.surfaceXY_ = new Coordinate(x, y);
178
+ this.translateSurfaceInternal_();
179
+ }
196
180
 
197
- /**
198
- * Reports the surface translation in scaled workspace coordinates.
199
- * Use this when finishing a drag to return blocks to the correct position.
200
- * @return {!Coordinate} Current translation of the surface.
201
- */
202
- BlockDragSurfaceSvg.prototype.getSurfaceTranslation = function() {
203
- const xy = svgMath.getRelativeXY(/** @type {!SVGElement} */ (this.SVG_));
204
- return new Coordinate(xy.x / this.scale_, xy.y / this.scale_);
205
- };
181
+ /**
182
+ * Translate the entire drag surface during a drag.
183
+ * We translate the drag surface instead of the blocks inside the surface
184
+ * so that the browser avoids repainting the SVG.
185
+ * Because of this, the drag coordinates must be adjusted by scale.
186
+ * @param {number} x X translation for the entire surface.
187
+ * @param {number} y Y translation for the entire surface.
188
+ */
189
+ translateSurface(x, y) {
190
+ this.surfaceXY_ = new Coordinate(x * this.scale_, y * this.scale_);
191
+ this.translateSurfaceInternal_();
192
+ }
206
193
 
207
- /**
208
- * Provide a reference to the drag group (primarily for
209
- * BlockSvg.getRelativeToSurfaceXY).
210
- * @return {?SVGElement} Drag surface group element.
211
- */
212
- BlockDragSurfaceSvg.prototype.getGroup = function() {
213
- return this.dragGroup_;
214
- };
194
+ /**
195
+ * Reports the surface translation in scaled workspace coordinates.
196
+ * Use this when finishing a drag to return blocks to the correct position.
197
+ * @return {!Coordinate} Current translation of the surface.
198
+ */
199
+ getSurfaceTranslation() {
200
+ const xy = svgMath.getRelativeXY(/** @type {!SVGElement} */ (this.SVG_));
201
+ return new Coordinate(xy.x / this.scale_, xy.y / this.scale_);
202
+ }
215
203
 
216
- /**
217
- * Returns the SVG drag surface.
218
- * @returns {?SVGElement} The SVG drag surface.
219
- */
220
- BlockDragSurfaceSvg.prototype.getSvgRoot = function() {
221
- return this.SVG_;
222
- };
204
+ /**
205
+ * Provide a reference to the drag group (primarily for
206
+ * BlockSvg.getRelativeToSurfaceXY).
207
+ * @return {?SVGElement} Drag surface group element.
208
+ */
209
+ getGroup() {
210
+ return this.dragGroup_;
211
+ }
223
212
 
224
- /**
225
- * Get the current blocks on the drag surface, if any (primarily
226
- * for BlockSvg.getRelativeToSurfaceXY).
227
- * @return {?Element} Drag surface block DOM element, or null if no blocks
228
- * exist.
229
- */
230
- BlockDragSurfaceSvg.prototype.getCurrentBlock = function() {
231
- return /** @type {Element} */ (this.dragGroup_.firstChild);
232
- };
213
+ /**
214
+ * Returns the SVG drag surface.
215
+ * @returns {?SVGElement} The SVG drag surface.
216
+ */
217
+ getSvgRoot() {
218
+ return this.SVG_;
219
+ }
233
220
 
234
- /**
235
- * Gets the translation of the child block surface
236
- * This surface is in charge of keeping track of how much the workspace has
237
- * moved.
238
- * @return {!Coordinate} The amount the workspace has been moved.
239
- */
240
- BlockDragSurfaceSvg.prototype.getWsTranslation = function() {
241
- // Returning a copy so the coordinate can not be changed outside this class.
242
- return this.childSurfaceXY_.clone();
243
- };
221
+ /**
222
+ * Get the current blocks on the drag surface, if any (primarily
223
+ * for BlockSvg.getRelativeToSurfaceXY).
224
+ * @return {?Element} Drag surface block DOM element, or null if no blocks
225
+ * exist.
226
+ */
227
+ getCurrentBlock() {
228
+ return /** @type {Element} */ (this.dragGroup_.firstChild);
229
+ }
244
230
 
245
- /**
246
- * Clear the group and hide the surface; move the blocks off onto the provided
247
- * element.
248
- * If the block is being deleted it doesn't need to go back to the original
249
- * surface, since it would be removed immediately during dispose.
250
- * @param {Element=} opt_newSurface Surface the dragging blocks should be moved
251
- * to, or null if the blocks should be removed from this surface without
252
- * being moved to a different surface.
253
- */
254
- BlockDragSurfaceSvg.prototype.clearAndHide = function(opt_newSurface) {
255
- if (opt_newSurface) {
256
- // appendChild removes the node from this.dragGroup_
257
- opt_newSurface.appendChild(this.getCurrentBlock());
258
- } else {
259
- this.dragGroup_.removeChild(this.getCurrentBlock());
231
+ /**
232
+ * Gets the translation of the child block surface
233
+ * This surface is in charge of keeping track of how much the workspace has
234
+ * moved.
235
+ * @return {!Coordinate} The amount the workspace has been moved.
236
+ */
237
+ getWsTranslation() {
238
+ // Returning a copy so the coordinate can not be changed outside this class.
239
+ return this.childSurfaceXY_.clone();
260
240
  }
261
- this.SVG_.style.display = 'none';
262
- if (this.dragGroup_.childNodes.length) {
263
- throw Error('Drag group was not cleared.');
241
+
242
+ /**
243
+ * Clear the group and hide the surface; move the blocks off onto the provided
244
+ * element.
245
+ * If the block is being deleted it doesn't need to go back to the original
246
+ * surface, since it would be removed immediately during dispose.
247
+ * @param {Element=} opt_newSurface Surface the dragging blocks should be
248
+ * moved to, or null if the blocks should be removed from this surface
249
+ * without being moved to a different surface.
250
+ */
251
+ clearAndHide(opt_newSurface) {
252
+ const currentBlockElement = this.getCurrentBlock();
253
+ if (currentBlockElement) {
254
+ if (opt_newSurface) {
255
+ // appendChild removes the node from this.dragGroup_
256
+ opt_newSurface.appendChild(currentBlockElement);
257
+ } else {
258
+ this.dragGroup_.removeChild(currentBlockElement);
259
+ }
260
+ }
261
+ this.SVG_.style.display = 'none';
262
+ if (this.dragGroup_.childNodes.length) {
263
+ throw Error('Drag group was not cleared.');
264
+ }
265
+ this.surfaceXY_ = null;
264
266
  }
265
- this.surfaceXY_ = null;
266
267
  };
267
268
 
268
269
  exports.BlockDragSurfaceSvg = BlockDragSurfaceSvg;