blockly 9.0.0-beta.0 → 9.0.0-beta.2

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 (736) hide show
  1. package/blockly.min.js +830 -810
  2. package/blockly_compressed.js +821 -801
  3. package/blockly_compressed.js.map +1 -1
  4. package/blocks.d.ts +0 -5
  5. package/blocks_compressed.js +9 -9
  6. package/blocks_compressed.js.map +1 -1
  7. package/closure/goog/base.d.ts +1 -0
  8. package/closure/goog/base_minimal.d.ts +1 -0
  9. package/closure/goog/goog.d.ts +1 -0
  10. package/core/any_aliases.d.ts +1 -0
  11. package/core/block.d.ts +156 -53
  12. package/core/block_animations.d.ts +5 -0
  13. package/core/block_drag_surface.d.ts +18 -5
  14. package/core/block_dragger.d.ts +20 -5
  15. package/core/block_svg.d.ts +92 -24
  16. package/core/blockly.d.ts +31 -10
  17. package/core/blockly_options.d.ts +2 -0
  18. package/core/blocks.d.ts +2 -0
  19. package/core/browser_events.d.ts +16 -7
  20. package/core/bubble.d.ts +42 -12
  21. package/core/bubble_dragger.d.ts +9 -2
  22. package/core/bump_objects.d.ts +6 -2
  23. package/core/clipboard.d.ts +6 -2
  24. package/core/comment.d.ts +13 -3
  25. package/core/common.d.ts +35 -9
  26. package/core/component_manager.d.ts +16 -6
  27. package/core/config.d.ts +1 -0
  28. package/core/connection.d.ts +48 -18
  29. package/core/connection_checker.d.ts +16 -7
  30. package/core/connection_db.d.ts +17 -6
  31. package/core/connection_type.d.ts +2 -0
  32. package/core/constants.d.ts +3 -0
  33. package/core/contextmenu.d.ts +15 -5
  34. package/core/contextmenu_items.d.ts +15 -0
  35. package/core/contextmenu_registry.d.ts +12 -7
  36. package/core/css.d.ts +3 -0
  37. package/core/delete_area.d.ts +5 -1
  38. package/core/dialog.d.ts +14 -7
  39. package/core/drag_target.d.ts +10 -2
  40. package/core/dropdowndiv.d.ts +42 -10
  41. package/core/events/events.d.ts +51 -24
  42. package/core/events/events_abstract.d.ts +18 -7
  43. package/core/events/events_block_base.d.ts +13 -7
  44. package/core/events/events_block_change.d.ts +24 -11
  45. package/core/events/events_block_create.d.ts +18 -7
  46. package/core/events/events_block_delete.d.ts +20 -8
  47. package/core/events/events_block_drag.d.ts +14 -4
  48. package/core/events/events_block_move.d.ts +25 -12
  49. package/core/events/events_bubble_open.d.ts +21 -6
  50. package/core/events/events_click.d.ts +20 -6
  51. package/core/events/events_comment_base.d.ts +13 -6
  52. package/core/events/events_comment_change.d.ts +17 -7
  53. package/core/events/events_comment_create.d.ts +13 -5
  54. package/core/events/events_comment_delete.d.ts +4 -11
  55. package/core/events/events_comment_move.d.ts +19 -8
  56. package/core/events/events_marker_move.d.ts +16 -5
  57. package/core/events/events_selected.d.ts +14 -5
  58. package/core/events/events_theme_change.d.ts +11 -3
  59. package/core/events/events_toolbox_item_select.d.ts +14 -5
  60. package/core/events/events_trashcan_open.d.ts +11 -3
  61. package/core/events/events_ui.d.ts +5 -1
  62. package/core/events/events_ui_base.d.ts +2 -0
  63. package/core/events/events_var_base.d.ts +13 -7
  64. package/core/events/events_var_create.d.ts +15 -6
  65. package/core/events/events_var_delete.d.ts +15 -6
  66. package/core/events/events_var_rename.d.ts +15 -6
  67. package/core/events/events_viewport.d.ts +14 -3
  68. package/core/events/utils.d.ts +50 -7
  69. package/core/events/workspace_events.d.ts +11 -6
  70. package/core/extensions.d.ts +14 -4
  71. package/core/field.d.ts +93 -36
  72. package/core/field_angle.d.ts +14 -3
  73. package/core/field_checkbox.d.ts +20 -7
  74. package/core/field_colour.d.ts +22 -6
  75. package/core/field_dropdown.d.ts +28 -8
  76. package/core/field_image.d.ts +15 -4
  77. package/core/field_label.d.ts +8 -2
  78. package/core/field_label_serializable.d.ts +4 -1
  79. package/core/field_multilineinput.d.ts +21 -6
  80. package/core/field_number.d.ts +22 -6
  81. package/core/field_registry.d.ts +8 -2
  82. package/core/field_textinput.d.ts +28 -8
  83. package/core/field_variable.d.ts +36 -13
  84. package/core/flyout_base.d.ts +70 -24
  85. package/core/flyout_button.d.ts +12 -5
  86. package/core/flyout_horizontal.d.ts +14 -6
  87. package/core/flyout_metrics_manager.d.ts +6 -3
  88. package/core/flyout_vertical.d.ts +14 -6
  89. package/core/generator.d.ts +39 -20
  90. package/core/gesture.d.ts +56 -22
  91. package/core/grid.d.ts +20 -16
  92. package/core/icon.d.ts +18 -5
  93. package/core/inject.d.ts +3 -1
  94. package/core/input.d.ts +25 -10
  95. package/core/input_types.d.ts +2 -0
  96. package/core/insertion_marker_manager.d.ts +27 -9
  97. package/core/interfaces/i_ast_node_location.d.ts +2 -0
  98. package/core/interfaces/i_ast_node_location_svg.d.ts +4 -0
  99. package/core/interfaces/i_ast_node_location_with_block.d.ts +4 -1
  100. package/core/interfaces/i_autohideable.d.ts +3 -0
  101. package/core/interfaces/i_block_dragger.d.ts +7 -1
  102. package/core/interfaces/i_bounded_element.d.ts +5 -1
  103. package/core/interfaces/i_bubble.d.ts +11 -2
  104. package/core/interfaces/i_collapsible_toolbox_item.d.ts +6 -2
  105. package/core/interfaces/i_component.d.ts +3 -1
  106. package/core/interfaces/i_connection_checker.d.ts +14 -6
  107. package/core/interfaces/i_contextmenu.d.ts +2 -0
  108. package/core/interfaces/i_copyable.d.ts +3 -1
  109. package/core/interfaces/i_deletable.d.ts +4 -1
  110. package/core/interfaces/i_delete_area.d.ts +4 -1
  111. package/core/interfaces/i_drag_target.d.ts +10 -2
  112. package/core/interfaces/i_draggable.d.ts +2 -0
  113. package/core/interfaces/i_flyout.d.ts +27 -11
  114. package/core/interfaces/i_keyboard_accessible.d.ts +4 -1
  115. package/core/interfaces/i_metrics_manager.d.ts +24 -12
  116. package/core/interfaces/i_movable.d.ts +4 -1
  117. package/core/interfaces/i_positionable.d.ts +5 -1
  118. package/core/interfaces/i_registrable.d.ts +2 -0
  119. package/core/interfaces/i_registrable_field.d.ts +2 -0
  120. package/core/interfaces/i_selectable.d.ts +2 -0
  121. package/core/interfaces/i_selectable_toolbox_item.d.ts +10 -3
  122. package/core/interfaces/i_serializer.d.ts +6 -1
  123. package/core/interfaces/i_styleable.d.ts +4 -0
  124. package/core/interfaces/i_toolbox.d.ts +17 -6
  125. package/core/interfaces/i_toolbox_item.d.ts +17 -7
  126. package/core/internal_constants.d.ts +6 -0
  127. package/core/keyboard_nav/ast_node.d.ts +55 -28
  128. package/core/keyboard_nav/basic_cursor.d.ts +20 -9
  129. package/core/keyboard_nav/cursor.d.ts +11 -5
  130. package/core/keyboard_nav/marker.d.ts +9 -2
  131. package/core/keyboard_nav/tab_navigate_cursor.d.ts +4 -1
  132. package/core/main.d.ts +1 -0
  133. package/core/marker_manager.d.ts +13 -2
  134. package/core/menu.d.ts +25 -6
  135. package/core/menuitem.d.ts +22 -7
  136. package/core/metrics_manager.d.ts +30 -15
  137. package/core/msg.d.ts +15 -0
  138. package/core/mutator.d.ts +20 -8
  139. package/core/names.d.ts +20 -8
  140. package/core/options.d.ts +12 -6
  141. package/core/positionable_helpers.d.ts +11 -3
  142. package/core/procedures.d.ts +27 -10
  143. package/core/registry.d.ts +19 -8
  144. package/core/rendered_connection.d.ts +29 -7
  145. package/core/renderers/common/block_rendering.d.ts +9 -2
  146. package/core/renderers/common/constants.d.ts +57 -18
  147. package/core/renderers/common/debug.d.ts +5 -1
  148. package/core/renderers/common/debugger.d.ts +12 -1
  149. package/core/renderers/common/drawer.d.ts +16 -3
  150. package/core/renderers/common/i_path_object.d.ts +37 -16
  151. package/core/renderers/common/info.d.ts +28 -11
  152. package/core/renderers/common/marker_svg.d.ts +42 -11
  153. package/core/renderers/common/path_object.d.ts +23 -3
  154. package/core/renderers/common/renderer.d.ts +33 -12
  155. package/core/renderers/geras/constants.d.ts +6 -2
  156. package/core/renderers/geras/drawer.d.ts +4 -1
  157. package/core/renderers/geras/geras.d.ts +3 -2
  158. package/core/renderers/geras/highlight_constants.d.ts +9 -6
  159. package/core/renderers/geras/highlighter.d.ts +12 -1
  160. package/core/renderers/geras/info.d.ts +4 -1
  161. package/core/renderers/geras/measurables/inline_input.d.ts +2 -0
  162. package/core/renderers/geras/measurables/statement_input.d.ts +2 -0
  163. package/core/renderers/geras/path_object.d.ts +4 -1
  164. package/core/renderers/geras/renderer.d.ts +16 -6
  165. package/core/renderers/measurables/base.d.ts +2 -0
  166. package/core/renderers/measurables/bottom_row.d.ts +9 -3
  167. package/core/renderers/measurables/connection.d.ts +2 -0
  168. package/core/renderers/measurables/external_value_input.d.ts +2 -1
  169. package/core/renderers/measurables/field.d.ts +2 -1
  170. package/core/renderers/measurables/hat.d.ts +2 -1
  171. package/core/renderers/measurables/icon.d.ts +4 -1
  172. package/core/renderers/measurables/in_row_spacer.d.ts +2 -1
  173. package/core/renderers/measurables/inline_input.d.ts +2 -1
  174. package/core/renderers/measurables/input_connection.d.ts +2 -0
  175. package/core/renderers/measurables/input_row.d.ts +4 -1
  176. package/core/renderers/measurables/jagged_edge.d.ts +2 -1
  177. package/core/renderers/measurables/next_connection.d.ts +2 -1
  178. package/core/renderers/measurables/output_connection.d.ts +2 -1
  179. package/core/renderers/measurables/previous_connection.d.ts +2 -1
  180. package/core/renderers/measurables/round_corner.d.ts +2 -1
  181. package/core/renderers/measurables/row.d.ts +30 -8
  182. package/core/renderers/measurables/spacer_row.d.ts +2 -1
  183. package/core/renderers/measurables/square_corner.d.ts +2 -1
  184. package/core/renderers/measurables/statement_input.d.ts +2 -1
  185. package/core/renderers/measurables/top_row.d.ts +7 -4
  186. package/core/renderers/measurables/types.d.ts +54 -25
  187. package/core/renderers/minimalist/constants.d.ts +2 -0
  188. package/core/renderers/minimalist/drawer.d.ts +2 -0
  189. package/core/renderers/minimalist/info.d.ts +5 -1
  190. package/core/renderers/minimalist/minimalist.d.ts +2 -1
  191. package/core/renderers/minimalist/renderer.d.ts +8 -3
  192. package/core/renderers/thrasos/info.d.ts +5 -4
  193. package/core/renderers/thrasos/renderer.d.ts +4 -1
  194. package/core/renderers/thrasos/thrasos.d.ts +2 -1
  195. package/core/renderers/zelos/constants.d.ts +31 -44
  196. package/core/renderers/zelos/drawer.d.ts +3 -0
  197. package/core/renderers/zelos/info.d.ts +10 -5
  198. package/core/renderers/zelos/marker_svg.d.ts +5 -0
  199. package/core/renderers/zelos/measurables/bottom_row.d.ts +2 -0
  200. package/core/renderers/zelos/measurables/inputs.d.ts +2 -1
  201. package/core/renderers/zelos/measurables/row_elements.d.ts +2 -0
  202. package/core/renderers/zelos/measurables/top_row.d.ts +2 -0
  203. package/core/renderers/zelos/path_object.d.ts +9 -2
  204. package/core/renderers/zelos/renderer.d.ts +14 -6
  205. package/core/renderers/zelos/zelos.d.ts +3 -2
  206. package/core/scrollbar.d.ts +41 -9
  207. package/core/scrollbar_pair.d.ts +20 -6
  208. package/core/serialization/blocks.d.ts +10 -4
  209. package/core/serialization/exceptions.d.ts +5 -0
  210. package/core/serialization/priorities.d.ts +3 -0
  211. package/core/serialization/registry.d.ts +3 -0
  212. package/core/serialization/variables.d.ts +2 -0
  213. package/core/serialization/workspaces.d.ts +4 -1
  214. package/core/shortcut_items.d.ts +10 -0
  215. package/core/shortcut_registry.d.ts +25 -9
  216. package/core/sprites.d.ts +2 -4
  217. package/core/theme/classic.d.ts +2 -0
  218. package/core/theme/themes.d.ts +1 -0
  219. package/core/theme/zelos.d.ts +2 -0
  220. package/core/theme.d.ts +41 -30
  221. package/core/theme_manager.d.ts +10 -1
  222. package/core/toolbox/category.d.ts +60 -32
  223. package/core/toolbox/collapsible_category.d.ts +10 -3
  224. package/core/toolbox/separator.d.ts +4 -1
  225. package/core/toolbox/toolbox.d.ts +71 -23
  226. package/core/toolbox/toolbox_item.d.ts +17 -7
  227. package/core/tooltip.d.ts +22 -1
  228. package/core/touch.d.ts +18 -6
  229. package/core/touch_gesture.d.ts +19 -4
  230. package/core/trashcan.d.ts +27 -6
  231. package/core/utils/aria.d.ts +4 -0
  232. package/core/utils/array.d.ts +4 -2
  233. package/core/utils/colour.d.ts +24 -13
  234. package/core/utils/coordinate.d.ts +19 -9
  235. package/core/utils/deprecation.d.ts +6 -4
  236. package/core/utils/dom.d.ts +37 -18
  237. package/core/utils/idgenerator.d.ts +14 -4
  238. package/core/utils/keycodes.d.ts +1 -0
  239. package/core/utils/math.d.ts +7 -3
  240. package/core/utils/metrics.d.ts +1 -0
  241. package/core/utils/object.d.ts +7 -2
  242. package/core/utils/parsing.d.ts +9 -4
  243. package/core/utils/rect.d.ts +5 -3
  244. package/core/utils/sentinel.d.ts +2 -0
  245. package/core/utils/size.d.ts +4 -2
  246. package/core/utils/string.d.ts +13 -6
  247. package/core/utils/style.d.ts +14 -33
  248. package/core/utils/svg.d.ts +5 -2
  249. package/core/utils/svg_math.d.ts +15 -7
  250. package/core/utils/svg_paths.d.ts +20 -10
  251. package/core/utils/toolbox.d.ts +26 -5
  252. package/core/utils/useragent.d.ts +1 -12
  253. package/core/utils/xml.d.ts +13 -5
  254. package/core/utils.d.ts +43 -21
  255. package/core/variable_map.d.ts +26 -9
  256. package/core/variable_model.d.ts +5 -2
  257. package/core/variables.d.ts +33 -18
  258. package/core/variables_dynamic.d.ts +25 -5
  259. package/core/warning.d.ts +8 -3
  260. package/core/widgetdiv.d.ts +15 -6
  261. package/core/workspace.d.ts +80 -30
  262. package/core/workspace_audio.d.ts +6 -0
  263. package/core/workspace_comment.d.ts +33 -11
  264. package/core/workspace_comment_svg.d.ts +52 -9
  265. package/core/workspace_drag_surface_svg.d.ts +20 -14
  266. package/core/workspace_dragger.d.ts +6 -0
  267. package/core/workspace_svg.d.ts +174 -62
  268. package/core/xml.d.ts +26 -11
  269. package/core/zoom_controls.d.ts +17 -7
  270. package/core-browser.js +0 -6
  271. package/core.d.ts +0 -5
  272. package/core.js +0 -6
  273. package/dart.d.ts +1 -7
  274. package/dart_compressed.js.map +1 -1
  275. package/index.d.ts +2 -6
  276. package/javascript.d.ts +1 -7
  277. package/javascript_compressed.js.map +1 -1
  278. package/lua.d.ts +1 -7
  279. package/lua_compressed.js.map +1 -1
  280. package/msg/ab.d.ts +8 -0
  281. package/msg/ace.d.ts +8 -0
  282. package/msg/af.d.ts +8 -0
  283. package/msg/am.d.ts +8 -0
  284. package/msg/ar.d.ts +8 -0
  285. package/msg/ast.d.ts +8 -0
  286. package/msg/az.d.ts +8 -0
  287. package/msg/ba.d.ts +8 -0
  288. package/msg/bcc.d.ts +8 -0
  289. package/msg/be-tarask.d.ts +8 -0
  290. package/msg/be.d.ts +8 -0
  291. package/msg/bg.d.ts +8 -0
  292. package/msg/bn.d.ts +8 -0
  293. package/msg/br.d.ts +8 -0
  294. package/msg/bs.d.ts +8 -0
  295. package/msg/ca.d.ts +8 -0
  296. package/msg/cdo.d.ts +8 -0
  297. package/msg/constants.d.ts +16 -0
  298. package/msg/cs.d.ts +8 -0
  299. package/msg/da.d.ts +8 -0
  300. package/msg/de.d.ts +8 -0
  301. package/msg/diq.d.ts +8 -0
  302. package/msg/dty.d.ts +8 -0
  303. package/msg/ee.d.ts +8 -0
  304. package/msg/el.d.ts +8 -0
  305. package/msg/en-gb.d.ts +8 -0
  306. package/msg/en.d.ts +8 -0
  307. package/msg/eo.d.ts +8 -0
  308. package/msg/es.d.ts +8 -0
  309. package/msg/et.d.ts +8 -0
  310. package/msg/eu.d.ts +8 -0
  311. package/msg/fa.d.ts +8 -0
  312. package/msg/fi.d.ts +8 -0
  313. package/msg/fo.d.ts +8 -0
  314. package/msg/fr.d.ts +8 -0
  315. package/msg/frr.d.ts +8 -0
  316. package/msg/gl.d.ts +8 -0
  317. package/msg/gn.d.ts +8 -0
  318. package/msg/gor.d.ts +8 -0
  319. package/msg/ha.d.ts +8 -0
  320. package/msg/hak.d.ts +8 -0
  321. package/msg/he.d.ts +8 -0
  322. package/msg/hi.d.ts +8 -0
  323. package/msg/hr.d.ts +8 -0
  324. package/msg/hrx.d.ts +8 -0
  325. package/msg/hu.d.ts +8 -0
  326. package/msg/hy.d.ts +8 -0
  327. package/msg/ia.d.ts +8 -0
  328. package/msg/id.d.ts +8 -0
  329. package/msg/ig.d.ts +8 -0
  330. package/msg/inh.d.ts +8 -0
  331. package/msg/is.d.ts +8 -0
  332. package/msg/it.d.ts +8 -0
  333. package/msg/ja.d.ts +8 -0
  334. package/msg/ka.d.ts +8 -0
  335. package/msg/kab.d.ts +8 -0
  336. package/msg/kbd-cyrl.d.ts +8 -0
  337. package/msg/km.d.ts +8 -0
  338. package/msg/kn.d.ts +8 -0
  339. package/msg/ko.d.ts +8 -0
  340. package/msg/ksh.d.ts +8 -0
  341. package/msg/ku-latn.d.ts +8 -0
  342. package/msg/ky.d.ts +8 -0
  343. package/msg/la.d.ts +8 -0
  344. package/msg/lb.d.ts +8 -0
  345. package/msg/lki.d.ts +8 -0
  346. package/msg/lo.d.ts +8 -0
  347. package/msg/lrc.d.ts +8 -0
  348. package/msg/lt.d.ts +8 -0
  349. package/msg/lv.d.ts +8 -0
  350. package/msg/mg.d.ts +8 -0
  351. package/msg/mk.d.ts +8 -0
  352. package/msg/ml.d.ts +8 -0
  353. package/msg/mnw.d.ts +8 -0
  354. package/msg/ms.d.ts +8 -0
  355. package/msg/msg.d.ts +429 -432
  356. package/msg/my.d.ts +8 -0
  357. package/msg/mzn.d.ts +8 -0
  358. package/msg/nb.d.ts +8 -0
  359. package/msg/ne.d.ts +8 -0
  360. package/msg/nl.d.ts +8 -0
  361. package/msg/oc.d.ts +8 -0
  362. package/msg/olo.d.ts +8 -0
  363. package/msg/pa.d.ts +8 -0
  364. package/msg/pl.d.ts +8 -0
  365. package/msg/pms.d.ts +8 -0
  366. package/msg/ps.d.ts +8 -0
  367. package/msg/pt-br.d.ts +8 -0
  368. package/msg/pt.d.ts +8 -0
  369. package/msg/qqq.d.ts +16 -0
  370. package/msg/ro.d.ts +8 -0
  371. package/msg/ru.d.ts +8 -0
  372. package/msg/sc.d.ts +8 -0
  373. package/msg/sco.d.ts +8 -0
  374. package/msg/sd.d.ts +8 -0
  375. package/msg/shn.d.ts +8 -0
  376. package/msg/si.d.ts +8 -0
  377. package/msg/sk.d.ts +8 -0
  378. package/msg/skr-arab.d.ts +8 -0
  379. package/msg/sl.d.ts +8 -0
  380. package/msg/smn.d.ts +8 -0
  381. package/msg/sq.d.ts +8 -0
  382. package/msg/sr-latn.d.ts +8 -0
  383. package/msg/sr.d.ts +8 -0
  384. package/msg/sv.d.ts +8 -0
  385. package/msg/sw.d.ts +8 -0
  386. package/msg/synonyms.d.ts +16 -0
  387. package/msg/ta.d.ts +8 -0
  388. package/msg/tcy.d.ts +8 -0
  389. package/msg/te.d.ts +8 -0
  390. package/msg/th.d.ts +8 -0
  391. package/msg/ti.d.ts +8 -0
  392. package/msg/tl.d.ts +8 -0
  393. package/msg/tlh.d.ts +8 -0
  394. package/msg/tr.d.ts +8 -0
  395. package/msg/ug-arab.d.ts +8 -0
  396. package/msg/uk.d.ts +8 -0
  397. package/msg/ur.d.ts +8 -0
  398. package/msg/uz.d.ts +8 -0
  399. package/msg/vi.d.ts +8 -0
  400. package/msg/xmf.d.ts +8 -0
  401. package/msg/yo.d.ts +8 -0
  402. package/msg/yue.d.ts +8 -0
  403. package/msg/zgh.d.ts +8 -0
  404. package/msg/zh-hans.d.ts +8 -0
  405. package/msg/zh-hant.d.ts +8 -0
  406. package/package.json +6 -3
  407. package/php.d.ts +1 -7
  408. package/php_compressed.js.map +1 -1
  409. package/python.d.ts +1 -7
  410. package/python_compressed.js.map +1 -1
  411. package/blocks/blocks.js +0 -48
  412. package/blocks/colour.js +0 -121
  413. package/blocks/lists.js +0 -996
  414. package/blocks/logic.js +0 -665
  415. package/blocks/loops.js +0 -375
  416. package/blocks/math.js +0 -594
  417. package/blocks/procedures.js +0 -1196
  418. package/blocks/text.js +0 -1000
  419. package/blocks/variables.js +0 -176
  420. package/blocks/variables_dynamic.js +0 -192
  421. package/core/any_aliases.ts +0 -1
  422. package/core/block.ts +0 -2102
  423. package/core/block_animations.ts +0 -202
  424. package/core/block_drag_surface.ts +0 -237
  425. package/core/block_dragger.ts +0 -447
  426. package/core/block_svg.ts +0 -1758
  427. package/core/blockly.js +0 -890
  428. package/core/blockly.ts +0 -749
  429. package/core/blockly_options.ts +0 -81
  430. package/core/blocks.ts +0 -29
  431. package/core/browser_events.ts +0 -289
  432. package/core/bubble.ts +0 -892
  433. package/core/bubble_dragger.ts +0 -229
  434. package/core/bump_objects.ts +0 -182
  435. package/core/clipboard.ts +0 -91
  436. package/core/comment.ts +0 -398
  437. package/core/common.ts +0 -288
  438. package/core/component_manager.ts +0 -211
  439. package/core/config.ts +0 -80
  440. package/core/connection.ts +0 -692
  441. package/core/connection_checker.ts +0 -301
  442. package/core/connection_db.ts +0 -289
  443. package/core/connection_type.ts +0 -32
  444. package/core/constants.ts +0 -29
  445. package/core/contextmenu.ts +0 -363
  446. package/core/contextmenu_items.ts +0 -576
  447. package/core/contextmenu_registry.ts +0 -179
  448. package/core/css.ts +0 -560
  449. package/core/delete_area.ts +0 -82
  450. package/core/dialog.ts +0 -127
  451. package/core/drag_target.ts +0 -94
  452. package/core/dropdowndiv.ts +0 -683
  453. package/core/events/events.ts +0 -123
  454. package/core/events/events_abstract.ts +0 -112
  455. package/core/events/events_block_base.ts +0 -65
  456. package/core/events/events_block_change.ts +0 -176
  457. package/core/events/events_block_create.ts +0 -114
  458. package/core/events/events_block_delete.ts +0 -126
  459. package/core/events/events_block_drag.ts +0 -82
  460. package/core/events/events_block_move.ts +0 -206
  461. package/core/events/events_bubble_open.ts +0 -82
  462. package/core/events/events_click.ts +0 -84
  463. package/core/events/events_comment_base.ts +0 -107
  464. package/core/events/events_comment_change.ts +0 -108
  465. package/core/events/events_comment_create.ts +0 -82
  466. package/core/events/events_comment_delete.ts +0 -77
  467. package/core/events/events_comment_move.ts +0 -154
  468. package/core/events/events_marker_move.ts +0 -99
  469. package/core/events/events_selected.ts +0 -78
  470. package/core/events/events_theme_change.ts +0 -67
  471. package/core/events/events_toolbox_item_select.ts +0 -79
  472. package/core/events/events_trashcan_open.ts +0 -68
  473. package/core/events/events_ui.ts +0 -89
  474. package/core/events/events_ui_base.ts +0 -54
  475. package/core/events/events_var_base.ts +0 -65
  476. package/core/events/events_var_create.ts +0 -88
  477. package/core/events/events_var_delete.ts +0 -88
  478. package/core/events/events_var_rename.ts +0 -89
  479. package/core/events/events_viewport.ts +0 -100
  480. package/core/events/utils.ts +0 -529
  481. package/core/events/workspace_events.ts +0 -86
  482. package/core/extensions.ts +0 -504
  483. package/core/field.ts +0 -1206
  484. package/core/field_angle.ts +0 -563
  485. package/core/field_checkbox.ts +0 -243
  486. package/core/field_colour.ts +0 -632
  487. package/core/field_dropdown.ts +0 -773
  488. package/core/field_image.ts +0 -282
  489. package/core/field_label.ts +0 -152
  490. package/core/field_label_serializable.ts +0 -76
  491. package/core/field_multilineinput.ts +0 -466
  492. package/core/field_number.ts +0 -327
  493. package/core/field_registry.ts +0 -87
  494. package/core/field_textinput.ts +0 -591
  495. package/core/field_variable.ts +0 -545
  496. package/core/flyout_base.ts +0 -1165
  497. package/core/flyout_button.ts +0 -292
  498. package/core/flyout_horizontal.ts +0 -381
  499. package/core/flyout_metrics_manager.ts +0 -94
  500. package/core/flyout_vertical.ts +0 -384
  501. package/core/generator.ts +0 -539
  502. package/core/gesture.ts +0 -946
  503. package/core/grid.ts +0 -192
  504. package/core/icon.ts +0 -189
  505. package/core/inject.ts +0 -390
  506. package/core/input.ts +0 -309
  507. package/core/input_types.ts +0 -32
  508. package/core/insertion_marker_manager.ts +0 -788
  509. package/core/interfaces/i_ast_node_location.ts +0 -23
  510. package/core/interfaces/i_ast_node_location_svg.ts +0 -37
  511. package/core/interfaces/i_ast_node_location_with_block.ts +0 -38
  512. package/core/interfaces/i_autohideable.ts +0 -34
  513. package/core/interfaces/i_block_dragger.ts +0 -67
  514. package/core/interfaces/i_bounded_element.ts +0 -42
  515. package/core/interfaces/i_bubble.ts +0 -88
  516. package/core/interfaces/i_collapsible_toolbox_item.ts +0 -47
  517. package/core/interfaces/i_component.ts +0 -32
  518. package/core/interfaces/i_connection_checker.ts +0 -102
  519. package/core/interfaces/i_contextmenu.ts +0 -26
  520. package/core/interfaces/i_copyable.ts +0 -40
  521. package/core/interfaces/i_deletable.ts +0 -29
  522. package/core/interfaces/i_delete_area.ts +0 -46
  523. package/core/interfaces/i_drag_target.ts +0 -84
  524. package/core/interfaces/i_draggable.ts +0 -25
  525. package/core/interfaces/i_flyout.ts +0 -186
  526. package/core/interfaces/i_keyboard_accessible.ts +0 -35
  527. package/core/interfaces/i_metrics_manager.ts +0 -151
  528. package/core/interfaces/i_movable.ts +0 -29
  529. package/core/interfaces/i_positionable.ts +0 -50
  530. package/core/interfaces/i_registrable.ts +0 -25
  531. package/core/interfaces/i_registrable_field.ts +0 -31
  532. package/core/interfaces/i_selectable.ts +0 -34
  533. package/core/interfaces/i_selectable_toolbox_item.ts +0 -64
  534. package/core/interfaces/i_serializer.ts +0 -65
  535. package/core/interfaces/i_styleable.ts +0 -35
  536. package/core/interfaces/i_toolbox.ts +0 -127
  537. package/core/interfaces/i_toolbox_item.ts +0 -84
  538. package/core/internal_constants.ts +0 -67
  539. package/core/keyboard_nav/ast_node.ts +0 -717
  540. package/core/keyboard_nav/basic_cursor.ts +0 -214
  541. package/core/keyboard_nav/cursor.ts +0 -134
  542. package/core/keyboard_nav/marker.ts +0 -115
  543. package/core/keyboard_nav/tab_navigate_cursor.ts +0 -48
  544. package/core/main.js +0 -303
  545. package/core/marker_manager.ts +0 -181
  546. package/core/menu.ts +0 -449
  547. package/core/menuitem.ts +0 -240
  548. package/core/metrics_manager.ts +0 -456
  549. package/core/msg.ts +0 -20
  550. package/core/mutator.ts +0 -560
  551. package/core/names.ts +0 -267
  552. package/core/options.ts +0 -365
  553. package/core/positionable_helpers.ts +0 -181
  554. package/core/procedures.ts +0 -443
  555. package/core/registry.ts +0 -339
  556. package/core/rendered_connection.ts +0 -568
  557. package/core/renderers/common/block_rendering.ts +0 -164
  558. package/core/renderers/common/constants.ts +0 -1124
  559. package/core/renderers/common/debug.ts +0 -61
  560. package/core/renderers/common/debugger.ts +0 -433
  561. package/core/renderers/common/drawer.ts +0 -450
  562. package/core/renderers/common/i_path_object.ts +0 -161
  563. package/core/renderers/common/info.ts +0 -718
  564. package/core/renderers/common/marker_svg.ts +0 -680
  565. package/core/renderers/common/path_object.ts +0 -272
  566. package/core/renderers/common/renderer.ts +0 -271
  567. package/core/renderers/geras/constants.ts +0 -61
  568. package/core/renderers/geras/drawer.ts +0 -176
  569. package/core/renderers/geras/geras.ts +0 -37
  570. package/core/renderers/geras/highlight_constants.ts +0 -337
  571. package/core/renderers/geras/highlighter.ts +0 -306
  572. package/core/renderers/geras/info.ts +0 -450
  573. package/core/renderers/geras/measurables/inline_input.ts +0 -51
  574. package/core/renderers/geras/measurables/statement_input.ts +0 -50
  575. package/core/renderers/geras/path_object.ts +0 -138
  576. package/core/renderers/geras/renderer.ts +0 -126
  577. package/core/renderers/measurables/base.ts +0 -53
  578. package/core/renderers/measurables/bottom_row.ts +0 -120
  579. package/core/renderers/measurables/connection.ts +0 -52
  580. package/core/renderers/measurables/external_value_input.ts +0 -65
  581. package/core/renderers/measurables/field.ts +0 -63
  582. package/core/renderers/measurables/hat.ts +0 -48
  583. package/core/renderers/measurables/icon.ts +0 -54
  584. package/core/renderers/measurables/in_row_spacer.ts +0 -44
  585. package/core/renderers/measurables/inline_input.ts +0 -76
  586. package/core/renderers/measurables/input_connection.ts +0 -66
  587. package/core/renderers/measurables/input_row.ts +0 -82
  588. package/core/renderers/measurables/jagged_edge.ts +0 -43
  589. package/core/renderers/measurables/next_connection.ts +0 -47
  590. package/core/renderers/measurables/output_connection.ts +0 -56
  591. package/core/renderers/measurables/previous_connection.ts +0 -47
  592. package/core/renderers/measurables/round_corner.ts +0 -49
  593. package/core/renderers/measurables/row.ts +0 -225
  594. package/core/renderers/measurables/spacer_row.ts +0 -55
  595. package/core/renderers/measurables/square_corner.ts +0 -47
  596. package/core/renderers/measurables/statement_input.ts +0 -55
  597. package/core/renderers/measurables/top_row.ts +0 -122
  598. package/core/renderers/measurables/types.ts +0 -332
  599. package/core/renderers/minimalist/constants.ts +0 -32
  600. package/core/renderers/minimalist/drawer.ts +0 -38
  601. package/core/renderers/minimalist/info.ts +0 -52
  602. package/core/renderers/minimalist/minimalist.ts +0 -22
  603. package/core/renderers/minimalist/renderer.ts +0 -71
  604. package/core/renderers/thrasos/info.ts +0 -338
  605. package/core/renderers/thrasos/renderer.ts +0 -48
  606. package/core/renderers/thrasos/thrasos.ts +0 -20
  607. package/core/renderers/zelos/constants.ts +0 -858
  608. package/core/renderers/zelos/drawer.ts +0 -228
  609. package/core/renderers/zelos/info.ts +0 -593
  610. package/core/renderers/zelos/marker_svg.ts +0 -151
  611. package/core/renderers/zelos/measurables/bottom_row.ts +0 -53
  612. package/core/renderers/zelos/measurables/inputs.ts +0 -56
  613. package/core/renderers/zelos/measurables/row_elements.ts +0 -45
  614. package/core/renderers/zelos/measurables/top_row.ts +0 -58
  615. package/core/renderers/zelos/path_object.ts +0 -215
  616. package/core/renderers/zelos/renderer.ts +0 -142
  617. package/core/renderers/zelos/zelos.ts +0 -39
  618. package/core/scrollbar.ts +0 -870
  619. package/core/scrollbar_pair.ts +0 -321
  620. package/core/serialization/blocks.ts +0 -706
  621. package/core/serialization/exceptions.ts +0 -98
  622. package/core/serialization/priorities.ts +0 -32
  623. package/core/serialization/registry.ts +0 -43
  624. package/core/serialization/variables.ts +0 -96
  625. package/core/serialization/workspaces.ts +0 -106
  626. package/core/shortcut_items.ts +0 -266
  627. package/core/shortcut_registry.ts +0 -355
  628. package/core/sprites.ts +0 -29
  629. package/core/theme/classic.ts +0 -54
  630. package/core/theme/themes.ts +0 -22
  631. package/core/theme/zelos.ts +0 -91
  632. package/core/theme.ts +0 -221
  633. package/core/theme_manager.ts +0 -186
  634. package/core/toolbox/category.ts +0 -679
  635. package/core/toolbox/collapsible_category.ts +0 -273
  636. package/core/toolbox/separator.ts +0 -105
  637. package/core/toolbox/toolbox.ts +0 -1044
  638. package/core/toolbox/toolbox_item.ts +0 -147
  639. package/core/tooltip.ts +0 -463
  640. package/core/touch.ts +0 -306
  641. package/core/touch_gesture.ts +0 -295
  642. package/core/trashcan.ts +0 -671
  643. package/core/utils/aria.ts +0 -160
  644. package/core/utils/array.ts +0 -32
  645. package/core/utils/colour.ts +0 -276
  646. package/core/utils/coordinate.ts +0 -124
  647. package/core/utils/deprecation.ts +0 -41
  648. package/core/utils/dom.ts +0 -408
  649. package/core/utils/idgenerator.ts +0 -80
  650. package/core/utils/keycodes.ts +0 -169
  651. package/core/utils/math.ts +0 -61
  652. package/core/utils/metrics.ts +0 -97
  653. package/core/utils/object.ts +0 -95
  654. package/core/utils/parsing.ts +0 -261
  655. package/core/utils/rect.ts +0 -62
  656. package/core/utils/sentinel.ts +0 -23
  657. package/core/utils/size.ts +0 -51
  658. package/core/utils/string.ts +0 -308
  659. package/core/utils/style.ts +0 -306
  660. package/core/utils/svg.ts +0 -88
  661. package/core/utils/svg_math.ts +0 -269
  662. package/core/utils/svg_paths.ts +0 -140
  663. package/core/utils/toolbox.ts +0 -433
  664. package/core/utils/useragent.ts +0 -135
  665. package/core/utils/xml.ts +0 -97
  666. package/core/utils.ts +0 -428
  667. package/core/variable_map.ts +0 -392
  668. package/core/variable_model.ts +0 -82
  669. package/core/variables.ts +0 -596
  670. package/core/variables_dynamic.ts +0 -133
  671. package/core/warning.ts +0 -161
  672. package/core/widgetdiv.ts +0 -257
  673. package/core/workspace.ts +0 -801
  674. package/core/workspace_audio.ts +0 -156
  675. package/core/workspace_comment.ts +0 -398
  676. package/core/workspace_comment_svg.ts +0 -1127
  677. package/core/workspace_drag_surface_svg.ts +0 -187
  678. package/core/workspace_dragger.ts +0 -104
  679. package/core/workspace_svg.ts +0 -2655
  680. package/core/xml.ts +0 -1023
  681. package/core/zoom_controls.ts +0 -441
  682. package/generators/dart/all.js +0 -27
  683. package/generators/dart/colour.js +0 -105
  684. package/generators/dart/lists.js +0 -431
  685. package/generators/dart/logic.js +0 -123
  686. package/generators/dart/loops.js +0 -161
  687. package/generators/dart/math.js +0 -446
  688. package/generators/dart/procedures.js +0 -105
  689. package/generators/dart/text.js +0 -338
  690. package/generators/dart/variables.js +0 -32
  691. package/generators/dart/variables_dynamic.js +0 -21
  692. package/generators/dart.js +0 -303
  693. package/generators/javascript/all.js +0 -27
  694. package/generators/javascript/colour.js +0 -85
  695. package/generators/javascript/lists.js +0 -405
  696. package/generators/javascript/logic.js +0 -127
  697. package/generators/javascript/loops.js +0 -180
  698. package/generators/javascript/math.js +0 -401
  699. package/generators/javascript/procedures.js +0 -110
  700. package/generators/javascript/text.js +0 -371
  701. package/generators/javascript/variables.js +0 -32
  702. package/generators/javascript/variables_dynamic.js +0 -21
  703. package/generators/javascript.js +0 -322
  704. package/generators/lua/all.js +0 -27
  705. package/generators/lua/colour.js +0 -71
  706. package/generators/lua/lists.js +0 -348
  707. package/generators/lua/logic.js +0 -112
  708. package/generators/lua/loops.js +0 -168
  709. package/generators/lua/math.js +0 -406
  710. package/generators/lua/procedures.js +0 -106
  711. package/generators/lua/text.js +0 -327
  712. package/generators/lua/variables.js +0 -31
  713. package/generators/lua/variables_dynamic.js +0 -21
  714. package/generators/lua.js +0 -206
  715. package/generators/php/all.js +0 -27
  716. package/generators/php/colour.js +0 -81
  717. package/generators/php/lists.js +0 -481
  718. package/generators/php/logic.js +0 -119
  719. package/generators/php/loops.js +0 -161
  720. package/generators/php/math.js +0 -349
  721. package/generators/php/procedures.js +0 -125
  722. package/generators/php/text.js +0 -255
  723. package/generators/php/variables.js +0 -32
  724. package/generators/php/variables_dynamic.js +0 -21
  725. package/generators/php.js +0 -303
  726. package/generators/python/all.js +0 -27
  727. package/generators/python/colour.js +0 -67
  728. package/generators/python/lists.js +0 -346
  729. package/generators/python/logic.js +0 -120
  730. package/generators/python/loops.js +0 -206
  731. package/generators/python/math.js +0 -373
  732. package/generators/python/procedures.js +0 -129
  733. package/generators/python/text.js +0 -291
  734. package/generators/python/variables.js +0 -32
  735. package/generators/python/variables_dynamic.js +0 -21
  736. package/generators/python.js +0 -333
@@ -1,1165 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2011 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- /**
8
- * @fileoverview Flyout tray containing blocks which may be created.
9
- */
10
-
11
- /**
12
- * Flyout tray containing blocks which may be created.
13
- * @class
14
- */
15
- import * as goog from '../closure/goog/goog.js';
16
- goog.declareModuleId('Blockly.Flyout');
17
-
18
- import type {Block} from './block.js';
19
- import type {BlockSvg} from './block_svg.js';
20
- import * as browserEvents from './browser_events.js';
21
- import * as common from './common.js';
22
- import {ComponentManager} from './component_manager.js';
23
- import {DeleteArea} from './delete_area.js';
24
- import * as BlockCreate from './events/events_block_create.js';
25
- import * as VarCreate from './events/events_var_create.js';
26
- import * as eventUtils from './events/utils.js';
27
- import {FlyoutButton} from './flyout_button.js';
28
- import {FlyoutMetricsManager} from './flyout_metrics_manager.js';
29
- import * as Gesture from './gesture.js';
30
- import type {IFlyout} from './interfaces/i_flyout.js';
31
- import type {Options} from './options.js';
32
- import * as blockRendering from './renderers/common/block_rendering.js';
33
- import {ScrollbarPair} from './scrollbar_pair.js';
34
- import * as blocks from './serialization/blocks.js';
35
- import * as Tooltip from './tooltip.js';
36
- import * as Touch from './touch.js';
37
- import {Coordinate} from './utils/coordinate.js';
38
- import * as dom from './utils/dom.js';
39
- import * as idGenerator from './utils/idgenerator.js';
40
- import type {Rect} from './utils/rect.js';
41
- import {Svg} from './utils/svg.js';
42
- import * as toolbox from './utils/toolbox.js';
43
- import * as Variables from './variables.js';
44
- import {WorkspaceSvg} from './workspace_svg.js';
45
- import * as Xml from './xml.js';
46
-
47
-
48
- enum FlyoutItemType {
49
- BLOCK = 'block',
50
- BUTTON = 'button',
51
- }
52
-
53
- /**
54
- * Class for a flyout.
55
- * @alias Blockly.Flyout
56
- */
57
- export abstract class Flyout extends DeleteArea implements IFlyout {
58
- /**
59
- * Position the flyout.
60
- */
61
- abstract position(): void;
62
-
63
- /**
64
- * Determine if a drag delta is toward the workspace, based on the position
65
- * and orientation of the flyout. This is used in determineDragIntention_ to
66
- * determine if a new block should be created or if the flyout should scroll.
67
- * @param currentDragDeltaXY How far the pointer has
68
- * moved from the position at mouse down, in pixel units.
69
- * @return True if the drag is toward the workspace.
70
- */
71
- abstract isDragTowardWorkspace(currentDragDeltaXY: Coordinate): boolean;
72
-
73
- /**
74
- * Sets the translation of the flyout to match the scrollbars.
75
- * @param xyRatio Contains a y property which is a float
76
- * between 0 and 1 specifying the degree of scrolling and a
77
- * similar x property.
78
- */
79
- protected abstract setMetrics_(xyRatio: {x: number, y: number}): void;
80
-
81
- /**
82
- * Lay out the blocks in the flyout.
83
- * @param contents The blocks and buttons to lay
84
- * out.
85
- * @param gaps The visible gaps between blocks.
86
- */
87
- protected abstract layout_(contents: FlyoutItem[], gaps: number[]): void;
88
-
89
- /**
90
- * Scroll the flyout.
91
- * @param e Mouse wheel scroll event.
92
- */
93
- protected abstract wheel_(e: WheelEvent): void;
94
-
95
- /**
96
- * Compute height of flyout. Position mat under each block.
97
- * For RTL: Lay out the blocks right-aligned.
98
- */
99
- protected abstract reflowInternal_(): void;
100
-
101
- /**
102
- * Calculates the x coordinate for the flyout position.
103
- * @return X coordinate.
104
- */
105
- abstract getX(): number;
106
-
107
- /**
108
- * Calculates the y coordinate for the flyout position.
109
- * @return Y coordinate.
110
- */
111
- abstract getY(): number;
112
-
113
- /**
114
- * Scroll the flyout to the beginning of its contents.
115
- */
116
- abstract scrollToStart(): void;
117
-
118
- /**
119
- * The type of a flyout content item.
120
- */
121
- static FlyoutItemType = FlyoutItemType;
122
-
123
- protected workspace_: WorkspaceSvg;
124
- RTL: boolean;
125
- /**
126
- * Whether the flyout should be laid out horizontally or not.
127
- * @internal
128
- */
129
- horizontalLayout: boolean = false;
130
- protected toolboxPosition_: number;
131
-
132
- /**
133
- * Opaque data that can be passed to Blockly.unbindEvent_.
134
- */
135
- private eventWrappers_: browserEvents.Data = [];
136
-
137
- /**
138
- * Function that will be registered as a change listener on the workspace
139
- * to reflow when blocks in the flyout workspace change.
140
- */
141
- private reflowWrapper_: Function|null = null;
142
-
143
- /**
144
- * Function that disables blocks in the flyout based on max block counts
145
- * allowed in the target workspace. Registered as a change listener on the
146
- * target workspace.
147
- */
148
- private filterWrapper_: Function|null = null;
149
-
150
- /**
151
- * List of background mats that lurk behind each block to catch clicks
152
- * landing in the blocks' lakes and bays.
153
- */
154
- private mats_: SVGElement[] = [];
155
- /**
156
- * List of visible buttons.
157
- */
158
- protected buttons_: FlyoutButton[] = [];
159
- /**
160
- * List of event listeners.
161
- */
162
- private listeners_: AnyDuringMigration[][] = [];
163
-
164
- /**
165
- * List of blocks that should always be disabled.
166
- */
167
- private permanentlyDisabled_: Block[] = [];
168
- protected readonly tabWidth_: number;
169
-
170
- /**
171
- * The target workspace.
172
- * @internal
173
- */
174
- targetWorkspace!: WorkspaceSvg;
175
- /**
176
- * A list of blocks that can be reused.
177
- */
178
- private recycledBlocks_: BlockSvg[] = [];
179
- /**
180
- * Does the flyout automatically close when a block is created?
181
- */
182
- autoClose: boolean = true;
183
-
184
- /**
185
- * Whether the flyout is visible.
186
- */
187
- private isVisible_: boolean = false;
188
-
189
- /**
190
- * Whether the workspace containing this flyout is visible.
191
- */
192
- private containerVisible_: boolean = true;
193
- protected rectMap_: WeakMap<BlockSvg, SVGElement>;
194
-
195
- /**
196
- * Corner radius of the flyout background.
197
- */
198
- readonly CORNER_RADIUS: number = 8;
199
- readonly MARGIN: number;
200
- readonly GAP_X: number;
201
- readonly GAP_Y: number;
202
-
203
- /**
204
- * Top/bottom padding between scrollbar and edge of flyout background.
205
- */
206
- readonly SCROLLBAR_MARGIN: number = 2.5;
207
-
208
- /**
209
- * Width of flyout.
210
- */
211
- protected width_: number = 0;
212
-
213
- /**
214
- * Height of flyout.
215
- */
216
- protected height_: number = 0;
217
- // clang-format off
218
- /**
219
- * Range of a drag angle from a flyout considered "dragging toward
220
- * workspace". Drags that are within the bounds of this many degrees from
221
- * the orthogonal line to the flyout edge are considered to be "drags toward
222
- * the workspace".
223
- * Example:
224
- * Flyout Edge Workspace
225
- * [block] / <-within this angle, drags "toward workspace" |
226
- * [block] ---- orthogonal to flyout boundary ---- |
227
- * [block] \ |
228
- * The angle is given in degrees from the orthogonal.
229
- *
230
- * This is used to know when to create a new block and when to scroll the
231
- * flyout. Setting it to 360 means that all drags create a new block.
232
- */
233
- // clang-format on
234
- protected dragAngleRange_: number = 70;
235
-
236
- /**
237
- * The path around the background of the flyout, which will be filled with a
238
- * background colour.
239
- */
240
- protected svgBackground_: SVGPathElement|null = null;
241
-
242
- /**
243
- * The root SVG group for the button or label.
244
- */
245
- protected svgGroup_: SVGGElement|null = null;
246
- /**
247
- * @param workspaceOptions Dictionary of options for the
248
- * workspace.
249
- */
250
- constructor(workspaceOptions: Options) {
251
- super();
252
- workspaceOptions.setMetrics = this.setMetrics_.bind(this);
253
-
254
- this.workspace_ = new WorkspaceSvg(workspaceOptions);
255
- this.workspace_.setMetricsManager(
256
- new FlyoutMetricsManager(this.workspace_, this));
257
-
258
- this.workspace_.internalIsFlyout = true;
259
- // Keep the workspace visibility consistent with the flyout's visibility.
260
- this.workspace_.setVisible(this.isVisible_);
261
-
262
- /**
263
- * The unique id for this component that is used to register with the
264
- * ComponentManager.
265
- */
266
- this.id = idGenerator.genUid();
267
-
268
- /**
269
- * Is RTL vs LTR.
270
- */
271
- this.RTL = !!workspaceOptions.RTL;
272
-
273
- /**
274
- * Position of the toolbox and flyout relative to the workspace.
275
- */
276
- this.toolboxPosition_ = workspaceOptions.toolboxPosition;
277
-
278
- /**
279
- * Width of output tab.
280
- */
281
- this.tabWidth_ = this.workspace_.getRenderer().getConstants().TAB_WIDTH;
282
-
283
- /**
284
- * A map from blocks to the rects which are beneath them to act as input
285
- * targets.
286
- * @internal
287
- */
288
- this.rectMap_ = new WeakMap();
289
-
290
- /**
291
- * Margin around the edges of the blocks in the flyout.
292
- */
293
- this.MARGIN = this.CORNER_RADIUS;
294
-
295
- // TODO: Move GAP_X and GAP_Y to their appropriate files.
296
- /**
297
- * Gap between items in horizontal flyouts. Can be overridden with the "sep"
298
- * element.
299
- */
300
- this.GAP_X = this.MARGIN * 3;
301
-
302
- /**
303
- * Gap between items in vertical flyouts. Can be overridden with the "sep"
304
- * element.
305
- */
306
- this.GAP_Y = this.MARGIN * 3;
307
- }
308
-
309
- /**
310
- * Creates the flyout's DOM. Only needs to be called once. The flyout can
311
- * either exist as its own SVG element or be a g element nested inside a
312
- * separate SVG element.
313
- * @param tagName The type of tag to
314
- * put the flyout in. This should be <svg> or <g>.
315
- * @return The flyout's SVG group.
316
- */
317
- createDom(tagName: string|Svg<SVGSVGElement>|Svg<SVGGElement>): SVGElement {
318
- /*
319
- <svg | g>
320
- <path class="blocklyFlyoutBackground"/>
321
- <g class="blocklyFlyout"></g>
322
- </ svg | g>
323
- */
324
- // Setting style to display:none to start. The toolbox and flyout
325
- // hide/show code will set up proper visibility and size later.
326
- this.svgGroup_ = dom.createSvgElement(
327
- tagName, {'class': 'blocklyFlyout', 'style': 'display: none'});
328
- this.svgBackground_ = dom.createSvgElement(
329
- Svg.PATH, {'class': 'blocklyFlyoutBackground'}, this.svgGroup_);
330
- this.svgGroup_.appendChild(this.workspace_.createDom());
331
- this.workspace_.getThemeManager().subscribe(
332
- this.svgBackground_, 'flyoutBackgroundColour', 'fill');
333
- this.workspace_.getThemeManager().subscribe(
334
- this.svgBackground_, 'flyoutOpacity', 'fill-opacity');
335
- return this.svgGroup_;
336
- }
337
-
338
- /**
339
- * Initializes the flyout.
340
- * @param targetWorkspace The workspace in which to
341
- * create new blocks.
342
- */
343
- init(targetWorkspace: WorkspaceSvg) {
344
- this.targetWorkspace = targetWorkspace;
345
- this.workspace_.targetWorkspace = targetWorkspace;
346
-
347
- this.workspace_.scrollbar = new ScrollbarPair(
348
- this.workspace_, this.horizontalLayout, !this.horizontalLayout,
349
- 'blocklyFlyoutScrollbar', this.SCROLLBAR_MARGIN);
350
-
351
- this.hide();
352
-
353
- Array.prototype.push.apply(
354
- this.eventWrappers_,
355
- browserEvents.conditionalBind(
356
- (this.svgGroup_ as SVGGElement), 'wheel', this, this.wheel_));
357
- if (!this.autoClose) {
358
- this.filterWrapper_ = this.filterForCapacity_.bind(this);
359
- this.targetWorkspace.addChangeListener(this.filterWrapper_);
360
- }
361
-
362
- // Dragging the flyout up and down.
363
- Array.prototype.push.apply(
364
- this.eventWrappers_,
365
- browserEvents.conditionalBind(
366
- (this.svgBackground_ as SVGPathElement), 'mousedown', this,
367
- this.onMouseDown_));
368
-
369
- // A flyout connected to a workspace doesn't have its own current gesture.
370
- this.workspace_.getGesture =
371
- this.targetWorkspace.getGesture.bind(this.targetWorkspace);
372
-
373
- // Get variables from the main workspace rather than the target workspace.
374
- this.workspace_.setVariableMap(this.targetWorkspace.getVariableMap());
375
-
376
- this.workspace_.createPotentialVariableMap();
377
-
378
- targetWorkspace.getComponentManager().addComponent({
379
- component: this,
380
- weight: 1,
381
- capabilities: [
382
- ComponentManager.Capability.DELETE_AREA,
383
- ComponentManager.Capability.DRAG_TARGET,
384
- ],
385
- });
386
- }
387
-
388
- /**
389
- * Dispose of this flyout.
390
- * Unlink from all DOM elements to prevent memory leaks.
391
- * @suppress {checkTypes}
392
- */
393
- dispose() {
394
- this.hide();
395
- this.workspace_.getComponentManager().removeComponent(this.id);
396
- browserEvents.unbind(this.eventWrappers_);
397
- if (this.filterWrapper_) {
398
- this.targetWorkspace.removeChangeListener(this.filterWrapper_);
399
- this.filterWrapper_ = null;
400
- }
401
- if (this.workspace_) {
402
- this.workspace_.getThemeManager().unsubscribe(this.svgBackground_!);
403
- this.workspace_.dispose();
404
- }
405
- if (this.svgGroup_) {
406
- dom.removeNode(this.svgGroup_);
407
- this.svgGroup_ = null;
408
- }
409
- this.svgBackground_ = null;
410
- }
411
-
412
- /**
413
- * Get the width of the flyout.
414
- * @return The width of the flyout.
415
- */
416
- getWidth(): number {
417
- return this.width_;
418
- }
419
-
420
- /**
421
- * Get the height of the flyout.
422
- * @return The width of the flyout.
423
- */
424
- getHeight(): number {
425
- return this.height_;
426
- }
427
-
428
- /**
429
- * Get the scale (zoom level) of the flyout. By default,
430
- * this matches the target workspace scale, but this can be overridden.
431
- * @return Flyout workspace scale.
432
- */
433
- getFlyoutScale(): number {
434
- return this.targetWorkspace.scale;
435
- }
436
-
437
- /**
438
- * Get the workspace inside the flyout.
439
- * @return The workspace inside the flyout.
440
- * @internal
441
- */
442
- getWorkspace(): WorkspaceSvg {
443
- return this.workspace_;
444
- }
445
-
446
- /**
447
- * Is the flyout visible?
448
- * @return True if visible.
449
- */
450
- isVisible(): boolean {
451
- return this.isVisible_;
452
- }
453
-
454
- /**
455
- * Set whether the flyout is visible. A value of true does not necessarily
456
- * mean that the flyout is shown. It could be hidden because its container is
457
- * hidden.
458
- * @param visible True if visible.
459
- */
460
- setVisible(visible: boolean) {
461
- const visibilityChanged = visible !== this.isVisible();
462
-
463
- this.isVisible_ = visible;
464
- if (visibilityChanged) {
465
- if (!this.autoClose) {
466
- // Auto-close flyouts are ignored as drag targets, so only non
467
- // auto-close flyouts need to have their drag target updated.
468
- this.workspace_.recordDragTargets();
469
- }
470
- this.updateDisplay_();
471
- }
472
- }
473
-
474
- /**
475
- * Set whether this flyout's container is visible.
476
- * @param visible Whether the container is visible.
477
- */
478
- setContainerVisible(visible: boolean) {
479
- const visibilityChanged = visible !== this.containerVisible_;
480
- this.containerVisible_ = visible;
481
- if (visibilityChanged) {
482
- this.updateDisplay_();
483
- }
484
- }
485
-
486
- /**
487
- * Update the display property of the flyout based whether it thinks it should
488
- * be visible and whether its containing workspace is visible.
489
- */
490
- private updateDisplay_() {
491
- let show = true;
492
- if (!this.containerVisible_) {
493
- show = false;
494
- } else {
495
- show = this.isVisible();
496
- }
497
- if (this.svgGroup_) {
498
- this.svgGroup_.style.display = show ? 'block' : 'none';
499
- }
500
- // Update the scrollbar's visibility too since it should mimic the
501
- // flyout's visibility.
502
- this.workspace_.scrollbar.setContainerVisible(show);
503
- }
504
-
505
- /**
506
- * Update the view based on coordinates calculated in position().
507
- * @param width The computed width of the flyout's SVG group
508
- * @param height The computed height of the flyout's SVG group.
509
- * @param x The computed x origin of the flyout's SVG group.
510
- * @param y The computed y origin of the flyout's SVG group.
511
- */
512
- protected positionAt_(width: number, height: number, x: number, y: number) {
513
- this.svgGroup_?.setAttribute('width', width.toString());
514
- this.svgGroup_?.setAttribute('height', height.toString());
515
- this.workspace_.setCachedParentSvgSize(width, height);
516
-
517
- if (this.svgGroup_?.tagName === 'svg') {
518
- const transform = 'translate(' + x + 'px,' + y + 'px)';
519
- dom.setCssTransform(this.svgGroup_, transform);
520
- } else {
521
- // IE and Edge don't support CSS transforms on SVG elements so
522
- // it's important to set the transform on the SVG element itself
523
- const transform = 'translate(' + x + ',' + y + ')';
524
- this.svgGroup_?.setAttribute('transform', transform);
525
- }
526
-
527
- // Update the scrollbar (if one exists).
528
- const scrollbar = this.workspace_.scrollbar;
529
- if (scrollbar) {
530
- // Set the scrollbars origin to be the top left of the flyout.
531
- scrollbar.setOrigin(x, y);
532
- scrollbar.resize();
533
- // If origin changed and metrics haven't changed enough to trigger
534
- // reposition in resize, we need to call setPosition. See issue #4692.
535
- if (scrollbar.hScroll) {
536
- scrollbar.hScroll.setPosition(
537
- scrollbar.hScroll.position.x, scrollbar.hScroll.position.y);
538
- }
539
- if (scrollbar.vScroll) {
540
- scrollbar.vScroll.setPosition(
541
- scrollbar.vScroll.position.x, scrollbar.vScroll.position.y);
542
- }
543
- }
544
- }
545
-
546
- /**
547
- * Hide and empty the flyout.
548
- */
549
- hide() {
550
- if (!this.isVisible()) {
551
- return;
552
- }
553
- this.setVisible(false);
554
- // Delete all the event listeners.
555
- for (let i = 0, listen; listen = this.listeners_[i]; i++) {
556
- browserEvents.unbind(listen);
557
- }
558
- this.listeners_.length = 0;
559
- if (this.reflowWrapper_) {
560
- this.workspace_.removeChangeListener(this.reflowWrapper_);
561
- this.reflowWrapper_ = null;
562
- }
563
- }
564
- // Do NOT delete the blocks here. Wait until Flyout.show.
565
- // https://neil.fraser.name/news/2014/08/09/
566
-
567
- /**
568
- * Show and populate the flyout.
569
- * @param flyoutDef Contents to display
570
- * in the flyout. This is either an array of Nodes, a NodeList, a
571
- * toolbox definition, or a string with the name of the dynamic category.
572
- */
573
- show(flyoutDef: toolbox.FlyoutDefinition|string) {
574
- this.workspace_.setResizesEnabled(false);
575
- this.hide();
576
- this.clearOldBlocks_();
577
-
578
- // Handle dynamic categories, represented by a name instead of a list.
579
- if (typeof flyoutDef === 'string') {
580
- flyoutDef = this.getDynamicCategoryContents_(flyoutDef);
581
- }
582
- this.setVisible(true);
583
-
584
- // Parse the Array, Node or NodeList into a a list of flyout items.
585
- const parsedContent = toolbox.convertFlyoutDefToJsonArray(flyoutDef);
586
- const flyoutInfo = this.createFlyoutInfo_(parsedContent);
587
-
588
- this.layout_(flyoutInfo.contents, flyoutInfo.gaps);
589
-
590
- // IE 11 is an incompetent browser that fails to fire mouseout events.
591
- // When the mouse is over the background, deselect all blocks.
592
- function deselectAll(this: Flyout) {
593
- const topBlocks = this.workspace_.getTopBlocks(false);
594
- for (let i = 0, block; block = topBlocks[i]; i++) {
595
- block.removeSelect();
596
- }
597
- }
598
-
599
- this.listeners_.push(browserEvents.conditionalBind(
600
- (this.svgBackground_ as SVGPathElement), 'mouseover', this,
601
- deselectAll));
602
-
603
- if (this.horizontalLayout) {
604
- this.height_ = 0;
605
- } else {
606
- this.width_ = 0;
607
- }
608
- this.workspace_.setResizesEnabled(true);
609
- this.reflow();
610
-
611
- this.filterForCapacity_();
612
-
613
- // Correctly position the flyout's scrollbar when it opens.
614
- this.position();
615
-
616
- this.reflowWrapper_ = this.reflow.bind(this);
617
- this.workspace_.addChangeListener(this.reflowWrapper_);
618
- this.emptyRecycledBlocks_();
619
- }
620
-
621
- /**
622
- * Create the contents array and gaps array necessary to create the layout for
623
- * the flyout.
624
- * @param parsedContent The array
625
- * of objects to show in the flyout.
626
- * @return The list of contents and gaps needed to lay out the flyout.
627
- */
628
- private createFlyoutInfo_(parsedContent: toolbox.FlyoutItemInfoArray):
629
- {contents: FlyoutItem[], gaps: number[]} {
630
- const contents: FlyoutItem[] = [];
631
- const gaps: number[] = [];
632
- this.permanentlyDisabled_.length = 0;
633
- const defaultGap = this.horizontalLayout ? this.GAP_X : this.GAP_Y;
634
- for (let i = 0, contentInfo; contentInfo = parsedContent[i]; i++) {
635
- if ('custom' in contentInfo) {
636
- const customInfo = (contentInfo as toolbox.DynamicCategoryInfo);
637
- const categoryName = customInfo['custom'];
638
- const flyoutDef = this.getDynamicCategoryContents_(categoryName);
639
- const parsedDynamicContent =
640
- toolbox.convertFlyoutDefToJsonArray(flyoutDef);
641
- // Replace the element at i with the dynamic content it represents.
642
- parsedContent.splice.apply(
643
- parsedContent, [i, 1, ...parsedDynamicContent]);
644
- contentInfo = parsedContent[i];
645
- }
646
-
647
- switch (contentInfo['kind'].toUpperCase()) {
648
- case 'BLOCK': {
649
- const blockInfo = (contentInfo as toolbox.BlockInfo);
650
- const block = this.createFlyoutBlock_(blockInfo);
651
- contents.push({type: FlyoutItemType.BLOCK, block: block});
652
- this.addBlockGap_(blockInfo, gaps, defaultGap);
653
- break;
654
- }
655
- case 'SEP': {
656
- const sepInfo = (contentInfo as toolbox.SeparatorInfo);
657
- this.addSeparatorGap_(sepInfo, gaps, defaultGap);
658
- break;
659
- }
660
- case 'LABEL': {
661
- const labelInfo = (contentInfo as toolbox.LabelInfo);
662
- // A label is a button with different styling.
663
- const label = this.createButton_(labelInfo, /** isLabel */ true);
664
- contents.push({type: FlyoutItemType.BUTTON, button: label});
665
- gaps.push(defaultGap);
666
- break;
667
- }
668
- case 'BUTTON': {
669
- const buttonInfo = (contentInfo as toolbox.ButtonInfo);
670
- const button = this.createButton_(buttonInfo, /** isLabel */ false);
671
- contents.push({type: FlyoutItemType.BUTTON, button: button});
672
- gaps.push(defaultGap);
673
- break;
674
- }
675
- }
676
- }
677
- return {contents: contents, gaps: gaps};
678
- }
679
-
680
- /**
681
- * Gets the flyout definition for the dynamic category.
682
- * @param categoryName The name of the dynamic category.
683
- * @return The definition of the
684
- * flyout in one of its many forms.
685
- */
686
- private getDynamicCategoryContents_(categoryName: string):
687
- toolbox.FlyoutDefinition {
688
- // Look up the correct category generation function and call that to get a
689
- // valid XML list.
690
- const fnToApply =
691
- this.workspace_.targetWorkspace.getToolboxCategoryCallback(
692
- categoryName);
693
- if (typeof fnToApply !== 'function') {
694
- throw TypeError(
695
- 'Couldn\'t find a callback function when opening' +
696
- ' a toolbox category.');
697
- }
698
- return fnToApply(this.workspace_.targetWorkspace);
699
- }
700
-
701
- /**
702
- * Creates a flyout button or a flyout label.
703
- * @param btnInfo The object holding information about a button or a label.
704
- * @param isLabel True if the button is a label, false otherwise.
705
- * @return The object used to display the button in the
706
- * flyout.
707
- */
708
- private createButton_(btnInfo: toolbox.ButtonOrLabelInfo, isLabel: boolean):
709
- FlyoutButton {
710
- const curButton = new FlyoutButton(
711
- this.workspace_, (this.targetWorkspace as WorkspaceSvg), btnInfo,
712
- isLabel);
713
- return curButton;
714
- }
715
-
716
- /**
717
- * Create a block from the xml and permanently disable any blocks that were
718
- * defined as disabled.
719
- * @param blockInfo The info of the block.
720
- * @return The block created from the blockInfo.
721
- */
722
- private createFlyoutBlock_(blockInfo: toolbox.BlockInfo): BlockSvg {
723
- let block;
724
- if (blockInfo['blockxml']) {
725
- const xml = (typeof blockInfo['blockxml'] === 'string' ?
726
- Xml.textToDom(blockInfo['blockxml']) :
727
- blockInfo['blockxml']) as Element;
728
- block = this.getRecycledBlock_(xml.getAttribute('type')!);
729
- if (!block) {
730
- block = Xml.domToBlock(xml, this.workspace_);
731
- }
732
- } else {
733
- block = this.getRecycledBlock_(blockInfo['type']!);
734
- if (!block) {
735
- if (blockInfo['enabled'] === undefined) {
736
- blockInfo['enabled'] = blockInfo['disabled'] !== 'true' &&
737
- blockInfo['disabled'] !== true;
738
- }
739
- block = blocks.append((blockInfo as blocks.State), this.workspace_);
740
- }
741
- }
742
-
743
- if (!block.isEnabled()) {
744
- // Record blocks that were initially disabled.
745
- // Do not enable these blocks as a result of capacity filtering.
746
- this.permanentlyDisabled_.push(block);
747
- }
748
- return (block as BlockSvg);
749
- }
750
-
751
- /**
752
- * Returns a block from the array of recycled blocks with the given type, or
753
- * undefined if one cannot be found.
754
- * @param blockType The type of the block to try to recycle.
755
- * @return The recycled block, or undefined if
756
- * one could not be recycled.
757
- */
758
- private getRecycledBlock_(blockType: string): BlockSvg|undefined {
759
- let index = -1;
760
- for (let i = 0; i < this.recycledBlocks_.length; i++) {
761
- if (this.recycledBlocks_[i].type === blockType) {
762
- index = i;
763
- break;
764
- }
765
- }
766
- return index === -1 ? undefined : this.recycledBlocks_.splice(index, 1)[0];
767
- }
768
-
769
- /**
770
- * Adds a gap in the flyout based on block info.
771
- * @param blockInfo Information about a block.
772
- * @param gaps The list of gaps between items in the flyout.
773
- * @param defaultGap The default gap between one element and the
774
- * next.
775
- */
776
- private addBlockGap_(
777
- blockInfo: toolbox.BlockInfo, gaps: number[], defaultGap: number) {
778
- let gap;
779
- if (blockInfo['gap']) {
780
- gap = parseInt(blockInfo['gap'].toString(), 10);
781
- } else if (blockInfo['blockxml']) {
782
- const xml = (typeof blockInfo['blockxml'] === 'string' ?
783
- Xml.textToDom(blockInfo['blockxml']) :
784
- blockInfo['blockxml']) as Element;
785
- gap = parseInt(xml.getAttribute('gap')!, 10);
786
- }
787
- gaps.push(!gap || isNaN(gap) ? defaultGap : gap);
788
- }
789
-
790
- /**
791
- * Add the necessary gap in the flyout for a separator.
792
- * @param sepInfo The object holding
793
- * information about a separator.
794
- * @param gaps The list gaps between items in the flyout.
795
- * @param defaultGap The default gap between the button and next
796
- * element.
797
- */
798
- private addSeparatorGap_(
799
- sepInfo: toolbox.SeparatorInfo, gaps: number[], defaultGap: number) {
800
- // Change the gap between two toolbox elements.
801
- // <sep gap="36"></sep>
802
- // The default gap is 24, can be set larger or smaller.
803
- // This overwrites the gap attribute on the previous element.
804
- const newGap = parseInt(sepInfo['gap']!.toString(), 10);
805
- // Ignore gaps before the first block.
806
- if (!isNaN(newGap) && gaps.length > 0) {
807
- gaps[gaps.length - 1] = newGap;
808
- } else {
809
- gaps.push(defaultGap);
810
- }
811
- }
812
-
813
- /**
814
- * Delete blocks, mats and buttons from a previous showing of the flyout.
815
- */
816
- private clearOldBlocks_() {
817
- // Delete any blocks from a previous showing.
818
- const oldBlocks = this.workspace_.getTopBlocks(false);
819
- for (let i = 0, block; block = oldBlocks[i]; i++) {
820
- if (this.blockIsRecyclable_(block)) {
821
- this.recycleBlock_(block);
822
- } else {
823
- block.dispose(false, false);
824
- }
825
- }
826
- // Delete any mats from a previous showing.
827
- for (let j = 0; j < this.mats_.length; j++) {
828
- const rect = this.mats_[j];
829
- if (rect) {
830
- Tooltip.unbindMouseEvents(rect);
831
- dom.removeNode(rect);
832
- }
833
- }
834
- this.mats_.length = 0;
835
- // Delete any buttons from a previous showing.
836
- for (let i = 0, button; button = this.buttons_[i]; i++) {
837
- button.dispose();
838
- }
839
- this.buttons_.length = 0;
840
-
841
- // Clear potential variables from the previous showing.
842
- this.workspace_.getPotentialVariableMap()?.clear();
843
- }
844
-
845
- /**
846
- * Empties all of the recycled blocks, properly disposing of them.
847
- */
848
- private emptyRecycledBlocks_() {
849
- for (let i = 0; i < this.recycledBlocks_.length; i++) {
850
- this.recycledBlocks_[i].dispose();
851
- }
852
- this.recycledBlocks_ = [];
853
- }
854
-
855
- /**
856
- * Returns whether the given block can be recycled or not.
857
- * @param _block The block to check for recyclability.
858
- * @return True if the block can be recycled. False otherwise.
859
- */
860
- protected blockIsRecyclable_(_block: BlockSvg): boolean {
861
- // By default, recycling is disabled.
862
- return false;
863
- }
864
-
865
- /**
866
- * Puts a previously created block into the recycle bin and moves it to the
867
- * top of the workspace. Used during large workspace swaps to limit the number
868
- * of new DOM elements we need to create.
869
- * @param block The block to recycle.
870
- */
871
- private recycleBlock_(block: BlockSvg) {
872
- const xy = block.getRelativeToSurfaceXY();
873
- block.moveBy(-xy.x, -xy.y);
874
- this.recycledBlocks_.push(block);
875
- }
876
-
877
- /**
878
- * Add listeners to a block that has been added to the flyout.
879
- * @param root The root node of the SVG group the block is in.
880
- * @param block The block to add listeners for.
881
- * @param rect The invisible rectangle under the block that acts
882
- * as a mat for that block.
883
- */
884
- protected addBlockListeners_(
885
- root: SVGElement, block: BlockSvg, rect: SVGElement) {
886
- this.listeners_.push(browserEvents.conditionalBind(
887
- root, 'mousedown', null, this.blockMouseDown_(block)));
888
- this.listeners_.push(browserEvents.conditionalBind(
889
- rect, 'mousedown', null, this.blockMouseDown_(block)));
890
- this.listeners_.push(
891
- browserEvents.bind(root, 'mouseenter', block, block.addSelect));
892
- this.listeners_.push(
893
- browserEvents.bind(root, 'mouseleave', block, block.removeSelect));
894
- this.listeners_.push(
895
- browserEvents.bind(rect, 'mouseenter', block, block.addSelect));
896
- this.listeners_.push(
897
- browserEvents.bind(rect, 'mouseleave', block, block.removeSelect));
898
- }
899
-
900
- /**
901
- * Handle a mouse-down on an SVG block in a non-closing flyout.
902
- * @param block The flyout block to copy.
903
- * @return Function to call when block is clicked.
904
- */
905
- private blockMouseDown_(block: BlockSvg): Function {
906
- const flyout = this;
907
- return (e: MouseEvent) => {
908
- const gesture = flyout.targetWorkspace.getGesture(e);
909
- if (gesture) {
910
- gesture.setStartBlock(block);
911
- gesture.handleFlyoutStart(e, flyout);
912
- }
913
- };
914
- }
915
-
916
- /**
917
- * Mouse down on the flyout background. Start a vertical scroll drag.
918
- * @param e Mouse down event.
919
- */
920
- private onMouseDown_(e: MouseEvent) {
921
- const gesture = this.targetWorkspace.getGesture(e);
922
- if (gesture) {
923
- gesture.handleFlyoutStart(e, this);
924
- }
925
- }
926
-
927
- /**
928
- * Does this flyout allow you to create a new instance of the given block?
929
- * Used for deciding if a block can be "dragged out of" the flyout.
930
- * @param block The block to copy from the flyout.
931
- * @return True if you can create a new instance of the block, false
932
- * otherwise.
933
- * @internal
934
- */
935
- isBlockCreatable(block: BlockSvg): boolean {
936
- return block.isEnabled();
937
- }
938
-
939
- /**
940
- * Create a copy of this block on the workspace.
941
- * @param originalBlock The block to copy from the flyout.
942
- * @return The newly created block.
943
- * @throws {Error} if something went wrong with deserialization.
944
- * @internal
945
- */
946
- createBlock(originalBlock: BlockSvg): BlockSvg {
947
- let newBlock = null;
948
- eventUtils.disable();
949
- const variablesBeforeCreation = this.targetWorkspace.getAllVariables();
950
- this.targetWorkspace.setResizesEnabled(false);
951
- try {
952
- newBlock = this.placeNewBlock_(originalBlock);
953
- } finally {
954
- eventUtils.enable();
955
- }
956
-
957
- // Close the flyout.
958
- this.targetWorkspace.hideChaff();
959
-
960
- const newVariables = Variables.getAddedVariables(
961
- this.targetWorkspace, variablesBeforeCreation);
962
-
963
- if (eventUtils.isEnabled()) {
964
- eventUtils.setGroup(true);
965
- // Fire a VarCreate event for each (if any) new variable created.
966
- for (let i = 0; i < newVariables.length; i++) {
967
- const thisVariable = newVariables[i];
968
- eventUtils.fire(new (eventUtils.get(eventUtils.VAR_CREATE))!
969
- (thisVariable));
970
- }
971
-
972
- // Block events come after var events, in case they refer to newly created
973
- // variables.
974
- eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CREATE))!(newBlock));
975
- }
976
- if (this.autoClose) {
977
- this.hide();
978
- } else {
979
- this.filterForCapacity_();
980
- }
981
- return newBlock;
982
- }
983
-
984
- /**
985
- * Initialize the given button: move it to the correct location,
986
- * add listeners, etc.
987
- * @param button The button to initialize and place.
988
- * @param x The x position of the cursor during this layout pass.
989
- * @param y The y position of the cursor during this layout pass.
990
- */
991
- protected initFlyoutButton_(button: FlyoutButton, x: number, y: number) {
992
- const buttonSvg = button.createDom();
993
- button.moveTo(x, y);
994
- button.show();
995
- // Clicking on a flyout button or label is a lot like clicking on the
996
- // flyout background.
997
- this.listeners_.push(browserEvents.conditionalBind(
998
- buttonSvg, 'mousedown', this, this.onMouseDown_));
999
-
1000
- this.buttons_.push(button);
1001
- }
1002
-
1003
- /**
1004
- * Create and place a rectangle corresponding to the given block.
1005
- * @param block The block to associate the rect to.
1006
- * @param x The x position of the cursor during this layout pass.
1007
- * @param y The y position of the cursor during this layout pass.
1008
- * @param blockHW The height and width of
1009
- * the block.
1010
- * @param index The index into the mats list where this rect should
1011
- * be placed.
1012
- * @return Newly created SVG element for the rectangle behind
1013
- * the block.
1014
- */
1015
- protected createRect_(
1016
- block: BlockSvg, x: number, y: number,
1017
- blockHW: {height: number, width: number}, index: number): SVGElement {
1018
- // Create an invisible rectangle under the block to act as a button. Just
1019
- // using the block as a button is poor, since blocks have holes in them.
1020
- const rect = dom.createSvgElement(Svg.RECT, {
1021
- 'fill-opacity': 0,
1022
- 'x': x,
1023
- 'y': y,
1024
- 'height': blockHW.height,
1025
- 'width': blockHW.width,
1026
- });
1027
- (rect as AnyDuringMigration).tooltip = block;
1028
- Tooltip.bindMouseEvents(rect);
1029
- // Add the rectangles under the blocks, so that the blocks' tooltips work.
1030
- this.workspace_.getCanvas().insertBefore(rect, block.getSvgRoot());
1031
-
1032
- this.rectMap_.set(block, rect);
1033
- this.mats_[index] = rect;
1034
- return rect;
1035
- }
1036
-
1037
- /**
1038
- * Move a rectangle to sit exactly behind a block, taking into account tabs,
1039
- * hats, and any other protrusions we invent.
1040
- * @param rect The rectangle to move directly behind the block.
1041
- * @param block The block the rectangle should be behind.
1042
- */
1043
- protected moveRectToBlock_(rect: SVGElement, block: BlockSvg) {
1044
- const blockHW = block.getHeightWidth();
1045
- rect.setAttribute('width', blockHW.width.toString());
1046
- rect.setAttribute('height', blockHW.height.toString());
1047
-
1048
- const blockXY = block.getRelativeToSurfaceXY();
1049
- rect.setAttribute('y', blockXY.y.toString());
1050
- rect.setAttribute(
1051
- 'x', (this.RTL ? blockXY.x - blockHW.width : blockXY.x).toString());
1052
- }
1053
-
1054
- /**
1055
- * Filter the blocks on the flyout to disable the ones that are above the
1056
- * capacity limit. For instance, if the user may only place two more blocks
1057
- * on the workspace, an "a + b" block that has two shadow blocks would be
1058
- * disabled.
1059
- */
1060
- private filterForCapacity_() {
1061
- const blocks = this.workspace_.getTopBlocks(false);
1062
- for (let i = 0, block; block = blocks[i]; i++) {
1063
- if (this.permanentlyDisabled_.indexOf(block) === -1) {
1064
- const enable = this.targetWorkspace.isCapacityAvailable(
1065
- common.getBlockTypeCounts(block));
1066
- while (block) {
1067
- block.setEnabled(enable);
1068
- block = block.getNextBlock();
1069
- }
1070
- }
1071
- }
1072
- }
1073
-
1074
- /**
1075
- * Reflow blocks and their mats.
1076
- */
1077
- reflow() {
1078
- if (this.reflowWrapper_) {
1079
- this.workspace_.removeChangeListener(this.reflowWrapper_);
1080
- }
1081
- this.reflowInternal_();
1082
- if (this.reflowWrapper_) {
1083
- this.workspace_.addChangeListener(this.reflowWrapper_);
1084
- }
1085
- }
1086
-
1087
- /**
1088
- * @return True if this flyout may be scrolled with a scrollbar or
1089
- * by dragging.
1090
- * @internal
1091
- */
1092
- isScrollable(): boolean {
1093
- return this.workspace_.scrollbar ? this.workspace_.scrollbar.isVisible() :
1094
- false;
1095
- }
1096
-
1097
- /**
1098
- * Copy a block from the flyout to the workspace and position it correctly.
1099
- * @param oldBlock The flyout block to copy.
1100
- * @return The new block in the main workspace.
1101
- */
1102
- private placeNewBlock_(oldBlock: BlockSvg): BlockSvg {
1103
- const targetWorkspace = this.targetWorkspace;
1104
- const svgRootOld = oldBlock.getSvgRoot();
1105
- if (!svgRootOld) {
1106
- throw Error('oldBlock is not rendered.');
1107
- }
1108
-
1109
- // Clone the block.
1110
- const json = (blocks.save(oldBlock) as blocks.State);
1111
- // Normallly this resizes leading to weird jumps. Save it for terminateDrag.
1112
- targetWorkspace.setResizesEnabled(false);
1113
- const block = (blocks.append(json, targetWorkspace) as BlockSvg);
1114
-
1115
- this.positionNewBlock_(oldBlock, block);
1116
-
1117
- return block;
1118
- }
1119
-
1120
- /**
1121
- * Positions a block on the target workspace.
1122
- * @param oldBlock The flyout block being copied.
1123
- * @param block The block to posiiton.
1124
- */
1125
- private positionNewBlock_(oldBlock: BlockSvg, block: BlockSvg) {
1126
- const targetWorkspace = this.targetWorkspace;
1127
-
1128
- // The offset in pixels between the main workspace's origin and the upper
1129
- // left corner of the injection div.
1130
- const mainOffsetPixels = targetWorkspace.getOriginOffsetInPixels();
1131
-
1132
- // The offset in pixels between the flyout workspace's origin and the upper
1133
- // left corner of the injection div.
1134
- const flyoutOffsetPixels = this.workspace_.getOriginOffsetInPixels();
1135
-
1136
- // The position of the old block in flyout workspace coordinates.
1137
- const oldBlockPos = oldBlock.getRelativeToSurfaceXY();
1138
- // The position of the old block in pixels relative to the flyout
1139
- // workspace's origin.
1140
- oldBlockPos.scale(this.workspace_.scale);
1141
-
1142
- // The position of the old block in pixels relative to the upper left corner
1143
- // of the injection div.
1144
- const oldBlockOffsetPixels =
1145
- Coordinate.sum(flyoutOffsetPixels, oldBlockPos);
1146
-
1147
- // The position of the old block in pixels relative to the origin of the
1148
- // main workspace.
1149
- const finalOffset =
1150
- Coordinate.difference(oldBlockOffsetPixels, mainOffsetPixels);
1151
- // The position of the old block in main workspace coordinates.
1152
- finalOffset.scale(1 / targetWorkspace.scale);
1153
-
1154
- block.moveTo(new Coordinate(finalOffset.x, finalOffset.y));
1155
- }
1156
- }
1157
-
1158
- /**
1159
- * A flyout content item.
1160
- */
1161
- export interface FlyoutItem {
1162
- type: FlyoutItemType;
1163
- button?: FlyoutButton|undefined;
1164
- block?: BlockSvg|undefined;
1165
- }