blockly 7.20211209.2 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -17,15 +17,18 @@
17
17
  */
18
18
  goog.module('Blockly.thrasos.RenderInfo');
19
19
 
20
- const object = goog.require('Blockly.utils.object');
21
20
  /* eslint-disable-next-line no-unused-vars */
22
21
  const {BlockSvg} = goog.requireType('Blockly.BlockSvg');
23
22
  /* eslint-disable-next-line no-unused-vars */
23
+ const {BottomRow} = goog.requireType('Blockly.blockRendering.BottomRow');
24
+ /* eslint-disable-next-line no-unused-vars */
24
25
  const {Field} = goog.requireType('Blockly.blockRendering.Field');
25
26
  const {InRowSpacer} = goog.require('Blockly.blockRendering.InRowSpacer');
26
27
  const {RenderInfo: BaseRenderInfo} = goog.require('Blockly.blockRendering.RenderInfo');
27
28
  /* eslint-disable-next-line no-unused-vars */
28
29
  const {Renderer} = goog.requireType('Blockly.thrasos.Renderer');
30
+ /* eslint-disable-next-line no-unused-vars */
31
+ const {TopRow} = goog.requireType('Blockly.blockRendering.TopRow');
29
32
  const {Types} = goog.require('Blockly.blockRendering.Types');
30
33
 
31
34
 
@@ -35,295 +38,302 @@ const {Types} = goog.require('Blockly.blockRendering.Types');
35
38
  * This measure pass does not propagate changes to the block (although fields
36
39
  * may choose to rerender when getSize() is called). However, calling it
37
40
  * repeatedly may be expensive.
38
- *
39
- * @param {!Renderer} renderer The renderer in use.
40
- * @param {!BlockSvg} block The block to measure.
41
- * @constructor
42
- * @package
43
41
  * @extends {BaseRenderInfo}
44
42
  * @alias Blockly.thrasos.RenderInfo
45
43
  */
46
- const RenderInfo = function(renderer, block) {
47
- RenderInfo.superClass_.constructor.call(this, renderer, block);
48
- };
49
- object.inherits(RenderInfo, BaseRenderInfo);
50
-
51
- /**
52
- * Get the block renderer in use.
53
- * @return {!Renderer} The block renderer in use.
54
- * @package
55
- */
56
- RenderInfo.prototype.getRenderer = function() {
57
- return /** @type {!Renderer} */ (this.renderer_);
58
- };
44
+ class RenderInfo extends BaseRenderInfo {
45
+ /**
46
+ * @param {!Renderer} renderer The renderer in use.
47
+ * @param {!BlockSvg} block The block to measure.
48
+ * @package
49
+ */
50
+ constructor(renderer, block) {
51
+ super(renderer, block);
52
+ }
59
53
 
60
- /**
61
- * @override
62
- */
63
- RenderInfo.prototype.addElemSpacing_ = function() {
64
- let hasExternalInputs = false;
65
- for (let i = 0; i < this.rows.length; i++) {
66
- const row = this.rows[i];
67
- if (row.hasExternalInput) {
68
- hasExternalInputs = true;
69
- break;
70
- }
54
+ /**
55
+ * Get the block renderer in use.
56
+ * @return {!Renderer} The block renderer in use.
57
+ * @package
58
+ */
59
+ getRenderer() {
60
+ return /** @type {!Renderer} */ (this.renderer_);
71
61
  }
72
- for (let i = 0; i < this.rows.length; i++) {
73
- const row = this.rows[i];
74
- const oldElems = row.elements;
75
- row.elements = [];
76
- // No spacing needed before the corner on the top row or the bottom row.
77
- if (row.startsWithElemSpacer()) {
78
- // There's a spacer before the first element in the row.
79
- row.elements.push(new InRowSpacer(
80
- this.constants_, this.getInRowSpacing_(null, oldElems[0])));
81
- }
82
- for (let e = 0; e < oldElems.length - 1; e++) {
83
- row.elements.push(oldElems[e]);
84
- const spacing = this.getInRowSpacing_(oldElems[e], oldElems[e + 1]);
85
- row.elements.push(new InRowSpacer(this.constants_, spacing));
62
+
63
+ /**
64
+ * @override
65
+ */
66
+ addElemSpacing_() {
67
+ let hasExternalInputs = false;
68
+ for (let i = 0; i < this.rows.length; i++) {
69
+ const row = this.rows[i];
70
+ if (row.hasExternalInput) {
71
+ hasExternalInputs = true;
72
+ break;
73
+ }
86
74
  }
87
- row.elements.push(oldElems[oldElems.length - 1]);
88
- if (row.endsWithElemSpacer()) {
89
- let spacing = this.getInRowSpacing_(oldElems[oldElems.length - 1], null);
90
- if (hasExternalInputs && row.hasDummyInput) {
91
- spacing += this.constants_.TAB_WIDTH;
75
+ for (let i = 0; i < this.rows.length; i++) {
76
+ const row = this.rows[i];
77
+ const oldElems = row.elements;
78
+ row.elements = [];
79
+ // No spacing needed before the corner on the top row or the bottom row.
80
+ if (row.startsWithElemSpacer()) {
81
+ // There's a spacer before the first element in the row.
82
+ row.elements.push(new InRowSpacer(
83
+ this.constants_, this.getInRowSpacing_(null, oldElems[0])));
84
+ }
85
+ for (let e = 0; e < oldElems.length - 1; e++) {
86
+ row.elements.push(oldElems[e]);
87
+ const spacing = this.getInRowSpacing_(oldElems[e], oldElems[e + 1]);
88
+ row.elements.push(new InRowSpacer(this.constants_, spacing));
89
+ }
90
+ row.elements.push(oldElems[oldElems.length - 1]);
91
+ if (row.endsWithElemSpacer()) {
92
+ let spacing =
93
+ this.getInRowSpacing_(oldElems[oldElems.length - 1], null);
94
+ if (hasExternalInputs && row.hasDummyInput) {
95
+ spacing += this.constants_.TAB_WIDTH;
96
+ }
97
+ // There's a spacer after the last element in the row.
98
+ row.elements.push(new InRowSpacer(this.constants_, spacing));
92
99
  }
93
- // There's a spacer after the last element in the row.
94
- row.elements.push(new InRowSpacer(this.constants_, spacing));
95
100
  }
96
101
  }
97
- };
98
102
 
99
- /**
100
- * @override
101
- */
102
- RenderInfo.prototype.getInRowSpacing_ = function(prev, next) {
103
- if (!prev) {
104
- // Between an editable field and the beginning of the row.
105
- if (next && Types.isField(next) &&
106
- (/** @type {Field} */ (next)).isEditable) {
107
- return this.constants_.MEDIUM_PADDING;
108
- }
109
- // Inline input at the beginning of the row.
110
- if (next && Types.isInlineInput(next)) {
111
- return this.constants_.MEDIUM_LARGE_PADDING;
112
- }
113
- if (next && Types.isStatementInput(next)) {
114
- return this.constants_.STATEMENT_INPUT_PADDING_LEFT;
103
+ /**
104
+ * @override
105
+ */
106
+ getInRowSpacing_(prev, next) {
107
+ if (!prev) {
108
+ // Between an editable field and the beginning of the row.
109
+ if (next && Types.isField(next) &&
110
+ (/** @type {Field} */ (next)).isEditable) {
111
+ return this.constants_.MEDIUM_PADDING;
112
+ }
113
+ // Inline input at the beginning of the row.
114
+ if (next && Types.isInlineInput(next)) {
115
+ return this.constants_.MEDIUM_LARGE_PADDING;
116
+ }
117
+ if (next && Types.isStatementInput(next)) {
118
+ return this.constants_.STATEMENT_INPUT_PADDING_LEFT;
119
+ }
120
+ // Anything else at the beginning of the row.
121
+ return this.constants_.LARGE_PADDING;
115
122
  }
116
- // Anything else at the beginning of the row.
117
- return this.constants_.LARGE_PADDING;
118
- }
119
123
 
120
- // Spacing between a non-input and the end of the row.
121
- if (!Types.isInput(prev) && !next) {
122
- // Between an editable field and the end of the row.
123
- if (Types.isField(prev) && (/** @type {Field} */ (prev)).isEditable) {
124
- return this.constants_.MEDIUM_PADDING;
125
- }
126
- // Padding at the end of an icon-only row to make the block shape clearer.
127
- if (Types.isIcon(prev)) {
128
- return (this.constants_.LARGE_PADDING * 2) + 1;
129
- }
130
- if (Types.isHat(prev)) {
131
- return this.constants_.NO_PADDING;
132
- }
133
- // Establish a minimum width for a block with a previous or next connection.
134
- if (Types.isPreviousOrNextConnection(prev)) {
124
+ // Spacing between a non-input and the end of the row.
125
+ if (!Types.isInput(prev) && !next) {
126
+ // Between an editable field and the end of the row.
127
+ if (Types.isField(prev) && (/** @type {Field} */ (prev)).isEditable) {
128
+ return this.constants_.MEDIUM_PADDING;
129
+ }
130
+ // Padding at the end of an icon-only row to make the block shape clearer.
131
+ if (Types.isIcon(prev)) {
132
+ return (this.constants_.LARGE_PADDING * 2) + 1;
133
+ }
134
+ if (Types.isHat(prev)) {
135
+ return this.constants_.NO_PADDING;
136
+ }
137
+ // Establish a minimum width for a block with a previous or next
138
+ // connection.
139
+ if (Types.isPreviousOrNextConnection(prev)) {
140
+ return this.constants_.LARGE_PADDING;
141
+ }
142
+ // Between rounded corner and the end of the row.
143
+ if (Types.isLeftRoundedCorner(prev)) {
144
+ return this.constants_.MIN_BLOCK_WIDTH;
145
+ }
146
+ // Between a jagged edge and the end of the row.
147
+ if (Types.isJaggedEdge(prev)) {
148
+ return this.constants_.NO_PADDING;
149
+ }
150
+ // Between noneditable fields and icons and the end of the row.
135
151
  return this.constants_.LARGE_PADDING;
136
152
  }
137
- // Between rounded corner and the end of the row.
138
- if (Types.isLeftRoundedCorner(prev)) {
139
- return this.constants_.MIN_BLOCK_WIDTH;
153
+
154
+ // Between inputs and the end of the row.
155
+ if (Types.isInput(prev) && !next) {
156
+ if (Types.isExternalInput(prev)) {
157
+ return this.constants_.NO_PADDING;
158
+ } else if (Types.isInlineInput(prev)) {
159
+ return this.constants_.LARGE_PADDING;
160
+ } else if (Types.isStatementInput(prev)) {
161
+ return this.constants_.NO_PADDING;
162
+ }
140
163
  }
141
- // Between a jagged edge and the end of the row.
142
- if (Types.isJaggedEdge(prev)) {
143
- return this.constants_.NO_PADDING;
164
+
165
+ // Spacing between a non-input and an input.
166
+ if (!Types.isInput(prev) && next && Types.isInput(next)) {
167
+ // Between an editable field and an input.
168
+ if (Types.isField(prev) && (/** @type {Field} */ (prev)).isEditable) {
169
+ if (Types.isInlineInput(next)) {
170
+ return this.constants_.SMALL_PADDING;
171
+ } else if (Types.isExternalInput(next)) {
172
+ return this.constants_.SMALL_PADDING;
173
+ }
174
+ } else {
175
+ if (Types.isInlineInput(next)) {
176
+ return this.constants_.MEDIUM_LARGE_PADDING;
177
+ } else if (Types.isExternalInput(next)) {
178
+ return this.constants_.MEDIUM_LARGE_PADDING;
179
+ } else if (Types.isStatementInput(next)) {
180
+ return this.constants_.LARGE_PADDING;
181
+ }
182
+ }
183
+ return this.constants_.LARGE_PADDING - 1;
144
184
  }
145
- // Between noneditable fields and icons and the end of the row.
146
- return this.constants_.LARGE_PADDING;
147
- }
148
185
 
149
- // Between inputs and the end of the row.
150
- if (Types.isInput(prev) && !next) {
151
- if (Types.isExternalInput(prev)) {
152
- return this.constants_.NO_PADDING;
153
- } else if (Types.isInlineInput(prev)) {
186
+ // Spacing between an icon and an icon or field.
187
+ if (Types.isIcon(prev) && next && !Types.isInput(next)) {
154
188
  return this.constants_.LARGE_PADDING;
155
- } else if (Types.isStatementInput(prev)) {
156
- return this.constants_.NO_PADDING;
157
189
  }
158
- }
159
190
 
160
- // Spacing between a non-input and an input.
161
- if (!Types.isInput(prev) && next && Types.isInput(next)) {
162
- // Between an editable field and an input.
163
- if (Types.isField(prev) && (/** @type {Field} */ (prev)).isEditable) {
164
- if (Types.isInlineInput(next)) {
165
- return this.constants_.SMALL_PADDING;
166
- } else if (Types.isExternalInput(next)) {
167
- return this.constants_.SMALL_PADDING;
168
- }
169
- } else {
170
- if (Types.isInlineInput(next)) {
171
- return this.constants_.MEDIUM_LARGE_PADDING;
172
- } else if (Types.isExternalInput(next)) {
173
- return this.constants_.MEDIUM_LARGE_PADDING;
174
- } else if (Types.isStatementInput(next)) {
191
+ // Spacing between an inline input and a field.
192
+ if (Types.isInlineInput(prev) && next && Types.isField(next)) {
193
+ // Editable field after inline input.
194
+ if ((/** @type {Field} */ (next)).isEditable) {
195
+ return this.constants_.MEDIUM_PADDING;
196
+ } else {
197
+ // Noneditable field after inline input.
175
198
  return this.constants_.LARGE_PADDING;
176
199
  }
177
200
  }
178
- return this.constants_.LARGE_PADDING - 1;
179
- }
180
201
 
181
- // Spacing between an icon and an icon or field.
182
- if (Types.isIcon(prev) && next && !Types.isInput(next)) {
183
- return this.constants_.LARGE_PADDING;
184
- }
185
-
186
- // Spacing between an inline input and a field.
187
- if (Types.isInlineInput(prev) && next && Types.isField(next)) {
188
- // Editable field after inline input.
189
- if ((/** @type {Field} */ (next)).isEditable) {
190
- return this.constants_.MEDIUM_PADDING;
191
- } else {
192
- // Noneditable field after inline input.
193
- return this.constants_.LARGE_PADDING;
202
+ if (Types.isLeftSquareCorner(prev) && next) {
203
+ // Spacing between a hat and a corner
204
+ if (Types.isHat(next)) {
205
+ return this.constants_.NO_PADDING;
206
+ }
207
+ // Spacing between a square corner and a previous or next connection
208
+ if (Types.isPreviousConnection(next) || Types.isNextConnection(next)) {
209
+ return next.notchOffset;
210
+ }
194
211
  }
195
- }
196
212
 
197
- if (Types.isLeftSquareCorner(prev) && next) {
198
- // Spacing between a hat and a corner
199
- if (Types.isHat(next)) {
200
- return this.constants_.NO_PADDING;
201
- }
202
- // Spacing between a square corner and a previous or next connection
203
- if (Types.isPreviousConnection(next) || Types.isNextConnection(next)) {
204
- return next.notchOffset;
213
+ // Spacing between a rounded corner and a previous or next connection.
214
+ if (Types.isLeftRoundedCorner(prev) && next) {
215
+ return next.notchOffset - this.constants_.CORNER_RADIUS;
205
216
  }
206
- }
207
217
 
208
- // Spacing between a rounded corner and a previous or next connection.
209
- if (Types.isLeftRoundedCorner(prev) && next) {
210
- return next.notchOffset - this.constants_.CORNER_RADIUS;
211
- }
218
+ // Spacing between two fields of the same editability.
219
+ if (Types.isField(prev) && next && Types.isField(next) &&
220
+ ((/** @type {Field} */ (prev)).isEditable ===
221
+ (/** @type {Field} */ (next)).isEditable)) {
222
+ return this.constants_.LARGE_PADDING;
223
+ }
212
224
 
213
- // Spacing between two fields of the same editability.
214
- if (Types.isField(prev) && next && Types.isField(next) &&
215
- ((/** @type {Field} */ (prev)).isEditable ===
216
- (/** @type {Field} */ (next)).isEditable)) {
217
- return this.constants_.LARGE_PADDING;
218
- }
225
+ // Spacing between anything and a jagged edge.
226
+ if (next && Types.isJaggedEdge(next)) {
227
+ return this.constants_.LARGE_PADDING;
228
+ }
219
229
 
220
- // Spacing between anything and a jagged edge.
221
- if (next && Types.isJaggedEdge(next)) {
222
- return this.constants_.LARGE_PADDING;
230
+ return this.constants_.MEDIUM_PADDING;
223
231
  }
224
232
 
225
- return this.constants_.MEDIUM_PADDING;
226
- };
227
-
228
- /**
229
- * @override
230
- */
231
- RenderInfo.prototype.getSpacerRowHeight_ = function(prev, next) {
232
- // If we have an empty block add a spacer to increase the height.
233
- if (Types.isTopRow(prev) && Types.isBottomRow(next)) {
234
- return this.constants_.EMPTY_BLOCK_SPACER_HEIGHT;
235
- }
236
- // Top and bottom rows act as a spacer so we don't need any extra padding.
237
- if (Types.isTopRow(prev) || Types.isBottomRow(next)) {
238
- return this.constants_.NO_PADDING;
239
- }
240
- if (prev.hasExternalInput && next.hasExternalInput) {
241
- return this.constants_.LARGE_PADDING;
242
- }
243
- if (!prev.hasStatement && next.hasStatement) {
244
- return this.constants_.BETWEEN_STATEMENT_PADDING_Y;
245
- }
246
- if (prev.hasStatement && next.hasStatement) {
247
- return this.constants_.LARGE_PADDING;
248
- }
249
- if (prev.hasDummyInput || next.hasDummyInput) {
250
- return this.constants_.LARGE_PADDING;
233
+ /**
234
+ * @override
235
+ */
236
+ getSpacerRowHeight_(prev, next) {
237
+ // If we have an empty block add a spacer to increase the height.
238
+ if (Types.isTopRow(prev) && Types.isBottomRow(next)) {
239
+ return this.constants_.EMPTY_BLOCK_SPACER_HEIGHT;
240
+ }
241
+ // Top and bottom rows act as a spacer so we don't need any extra padding.
242
+ if (Types.isTopRow(prev) || Types.isBottomRow(next)) {
243
+ return this.constants_.NO_PADDING;
244
+ }
245
+ if (prev.hasExternalInput && next.hasExternalInput) {
246
+ return this.constants_.LARGE_PADDING;
247
+ }
248
+ if (!prev.hasStatement && next.hasStatement) {
249
+ return this.constants_.BETWEEN_STATEMENT_PADDING_Y;
250
+ }
251
+ if (prev.hasStatement && next.hasStatement) {
252
+ return this.constants_.LARGE_PADDING;
253
+ }
254
+ if (prev.hasDummyInput || next.hasDummyInput) {
255
+ return this.constants_.LARGE_PADDING;
256
+ }
257
+ return this.constants_.MEDIUM_PADDING;
251
258
  }
252
- return this.constants_.MEDIUM_PADDING;
253
- };
254
259
 
255
- /**
256
- * @override
257
- */
258
- RenderInfo.prototype.getElemCenterline_ = function(row, elem) {
259
- if (Types.isSpacer(elem)) {
260
- return row.yPos + elem.height / 2;
261
- }
262
- if (Types.isBottomRow(row)) {
263
- const baseline = row.yPos + row.height - row.descenderHeight;
264
- if (Types.isNextConnection(elem)) {
265
- return baseline + elem.height / 2;
260
+ /**
261
+ * @override
262
+ */
263
+ getElemCenterline_(row, elem) {
264
+ if (Types.isSpacer(elem)) {
265
+ return row.yPos + elem.height / 2;
266
266
  }
267
- return baseline - elem.height / 2;
268
- }
269
- if (Types.isTopRow(row)) {
270
- if (Types.isHat(elem)) {
271
- return row.capline - elem.height / 2;
267
+ if (Types.isBottomRow(row)) {
268
+ const bottomRow = /** @type {!BottomRow} */ (row);
269
+ const baseline =
270
+ bottomRow.yPos + bottomRow.height - bottomRow.descenderHeight;
271
+ if (Types.isNextConnection(elem)) {
272
+ return baseline + elem.height / 2;
273
+ }
274
+ return baseline - elem.height / 2;
275
+ }
276
+ if (Types.isTopRow(row)) {
277
+ const topRow = /** @type {!TopRow} */ (row);
278
+ if (Types.isHat(elem)) {
279
+ return topRow.capline - elem.height / 2;
280
+ }
281
+ return topRow.capline + elem.height / 2;
272
282
  }
273
- return row.capline + elem.height / 2;
274
- }
275
283
 
276
- let result = row.yPos;
277
- if (Types.isField(elem) && row.hasStatement) {
278
- const offset = this.constants_.TALL_INPUT_FIELD_OFFSET_Y + elem.height / 2;
279
- result += offset;
280
- } else {
281
- result += (row.height / 2);
284
+ let result = row.yPos;
285
+ if (Types.isField(elem) && row.hasStatement) {
286
+ const offset =
287
+ this.constants_.TALL_INPUT_FIELD_OFFSET_Y + elem.height / 2;
288
+ result += offset;
289
+ } else {
290
+ result += (row.height / 2);
291
+ }
292
+ return result;
282
293
  }
283
- return result;
284
- };
285
294
 
286
- /**
287
- * @override
288
- */
289
- RenderInfo.prototype.finalize_ = function() {
290
- // Performance note: this could be combined with the draw pass, if the time
291
- // that this takes is excessive. But it shouldn't be, because it only
292
- // accesses and sets properties that already exist on the objects.
293
- let widestRowWithConnectedBlocks = 0;
294
- let yCursor = 0;
295
- for (let i = 0; i < this.rows.length; i++) {
296
- const row = this.rows[i];
297
- row.yPos = yCursor;
298
- row.xPos = this.startX;
299
- yCursor += row.height;
295
+ /**
296
+ * @override
297
+ */
298
+ finalize_() {
299
+ // Performance note: this could be combined with the draw pass, if the time
300
+ // that this takes is excessive. But it shouldn't be, because it only
301
+ // accesses and sets properties that already exist on the objects.
302
+ let widestRowWithConnectedBlocks = 0;
303
+ let yCursor = 0;
304
+ for (let i = 0; i < this.rows.length; i++) {
305
+ const row = this.rows[i];
306
+ row.yPos = yCursor;
307
+ row.xPos = this.startX;
308
+ yCursor += row.height;
300
309
 
301
- widestRowWithConnectedBlocks =
302
- Math.max(widestRowWithConnectedBlocks, row.widthWithConnectedBlocks);
303
- // Add padding to the bottom row if block height is less than minimum
304
- const heightWithoutHat = yCursor - this.topRow.ascenderHeight;
305
- if (row === this.bottomRow &&
306
- heightWithoutHat < this.constants_.MIN_BLOCK_HEIGHT) {
307
- // But the hat height shouldn't be part of this.
308
- const diff = this.constants_.MIN_BLOCK_HEIGHT - heightWithoutHat;
309
- this.bottomRow.height += diff;
310
- yCursor += diff;
310
+ widestRowWithConnectedBlocks =
311
+ Math.max(widestRowWithConnectedBlocks, row.widthWithConnectedBlocks);
312
+ // Add padding to the bottom row if block height is less than minimum
313
+ const heightWithoutHat = yCursor - this.topRow.ascenderHeight;
314
+ if (row === this.bottomRow &&
315
+ heightWithoutHat < this.constants_.MIN_BLOCK_HEIGHT) {
316
+ // But the hat height shouldn't be part of this.
317
+ const diff = this.constants_.MIN_BLOCK_HEIGHT - heightWithoutHat;
318
+ this.bottomRow.height += diff;
319
+ yCursor += diff;
320
+ }
321
+ this.recordElemPositions_(row);
322
+ }
323
+ if (this.outputConnection && this.block_.nextConnection &&
324
+ this.block_.nextConnection.isConnected()) {
325
+ // Include width of connected block in value to stack width measurement.
326
+ widestRowWithConnectedBlocks = Math.max(
327
+ widestRowWithConnectedBlocks,
328
+ this.block_.nextConnection.targetBlock().getHeightWidth().width);
311
329
  }
312
- this.recordElemPositions_(row);
313
- }
314
- if (this.outputConnection && this.block_.nextConnection &&
315
- this.block_.nextConnection.isConnected()) {
316
- // Include width of connected block in value to stack width measurement.
317
- widestRowWithConnectedBlocks = Math.max(
318
- widestRowWithConnectedBlocks,
319
- this.block_.nextConnection.targetBlock().getHeightWidth().width);
320
- }
321
330
 
322
- this.bottomRow.baseline = yCursor - this.bottomRow.descenderHeight;
323
- this.widthWithChildren = widestRowWithConnectedBlocks + this.startX;
331
+ this.bottomRow.baseline = yCursor - this.bottomRow.descenderHeight;
332
+ this.widthWithChildren = widestRowWithConnectedBlocks + this.startX;
324
333
 
325
- this.height = yCursor;
326
- this.startY = this.topRow.capline;
327
- };
334
+ this.height = yCursor;
335
+ this.startY = this.topRow.capline;
336
+ }
337
+ }
328
338
 
329
339
  exports.RenderInfo = RenderInfo;
@@ -16,7 +16,6 @@
16
16
  goog.module('Blockly.thrasos.Renderer');
17
17
 
18
18
  const blockRendering = goog.require('Blockly.blockRendering');
19
- const object = goog.require('Blockly.utils.object');
20
19
  /* eslint-disable-next-line no-unused-vars */
21
20
  const {BlockSvg} = goog.requireType('Blockly.BlockSvg');
22
21
  const {RenderInfo} = goog.require('Blockly.thrasos.RenderInfo');
@@ -25,28 +24,29 @@ const {Renderer: BaseRenderer} = goog.require('Blockly.blockRendering.Renderer')
25
24
 
26
25
  /**
27
26
  * The thrasos renderer.
28
- * @param {string} name The renderer name.
29
- * @package
30
- * @constructor
31
27
  * @extends {BaseRenderer}
32
28
  * @alias Blockly.thrasos.Renderer
33
29
  */
34
- const Renderer = function(name) {
35
- Renderer.superClass_.constructor.call(this, name);
36
- };
37
- object.inherits(Renderer, BaseRenderer);
38
-
39
- /**
40
- * Create a new instance of the renderer's render info object.
41
- * @param {!BlockSvg} block The block to measure.
42
- * @return {!RenderInfo} The render info object.
43
- * @protected
44
- * @override
45
- */
46
- Renderer.prototype.makeRenderInfo_ = function(block) {
47
- return new RenderInfo(this, block);
48
- };
49
-
30
+ class Renderer extends BaseRenderer {
31
+ /**
32
+ * @param {string} name The renderer name.
33
+ * @package
34
+ */
35
+ constructor(name) {
36
+ super(name);
37
+ }
38
+
39
+ /**
40
+ * Create a new instance of the renderer's render info object.
41
+ * @param {!BlockSvg} block The block to measure.
42
+ * @return {!RenderInfo} The render info object.
43
+ * @protected
44
+ * @override
45
+ */
46
+ makeRenderInfo_(block) {
47
+ return new RenderInfo(this, block);
48
+ }
49
+ }
50
50
 
51
51
  blockRendering.register('thrasos', Renderer);
52
52