blockly 8.20220331.0-beta.1 → 9.0.0-beta.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.
- package/blockly.min.js +2004 -2269
- package/blockly_compressed.js +1499 -1994
- package/blockly_compressed.js.map +1 -1
- package/blocks/blocks.js +3 -2
- package/blocks/colour.js +3 -1
- package/blocks/lists.js +94 -22
- package/blocks/logic.js +14 -6
- package/blocks/loops.js +5 -3
- package/blocks/math.js +3 -1
- package/blocks/procedures.js +7 -6
- package/blocks/text.js +14 -6
- package/blocks/variables.js +3 -1
- package/blocks/variables_dynamic.js +3 -1
- package/blocks.d.ts +10 -3
- package/blocks_compressed.js +189 -171
- package/blocks_compressed.js.map +1 -1
- package/closure/goog/base.d.ts +1 -0
- package/closure/goog/base_minimal.d.ts +18 -0
- package/closure/goog/goog.d.ts +25 -0
- package/core/any_aliases.d.ts +1 -0
- package/core/any_aliases.ts +1 -0
- package/core/block.d.ts +779 -0
- package/core/{block.js → block.ts} +610 -720
- package/core/block_animations.d.ts +33 -0
- package/core/{block_animations.js → block_animations.ts} +75 -79
- package/core/block_drag_surface.d.ts +111 -0
- package/core/{block_drag_surface.js → block_drag_surface.ts} +85 -117
- package/core/block_dragger.d.ts +143 -0
- package/core/{block_dragger.js → block_dragger.ts} +139 -176
- package/core/block_svg.d.ts +588 -0
- package/core/{block_svg.js → block_svg.ts} +494 -630
- package/core/blockly.d.ts +562 -0
- package/core/blockly.js +1 -1
- package/core/blockly.ts +749 -0
- package/core/blockly_options.d.ts +69 -0
- package/core/blockly_options.ts +81 -0
- package/core/blocks.d.ts +17 -0
- package/core/{blocks.js → blocks.ts} +4 -8
- package/core/browser_events.d.ts +85 -0
- package/core/{browser_events.js → browser_events.ts} +98 -93
- package/core/bubble.d.ts +279 -0
- package/core/{bubble.js → bubble.ts} +277 -370
- package/core/bubble_dragger.d.ts +73 -0
- package/core/bubble_dragger.ts +229 -0
- package/core/bump_objects.d.ts +34 -0
- package/core/{bump_objects.js → bump_objects.ts} +54 -52
- package/core/clipboard.d.ts +42 -0
- package/core/clipboard.ts +91 -0
- package/core/comment.d.ts +113 -0
- package/core/{comment.js → comment.ts} +135 -185
- package/core/common.d.ts +129 -0
- package/core/{common.js → common.ts} +105 -82
- package/core/component_manager.d.ts +91 -0
- package/core/component_manager.ts +211 -0
- package/core/config.d.ts +23 -0
- package/core/{config.js → config.ts} +12 -19
- package/core/connection.d.ts +232 -0
- package/core/{connection.js → connection.ts} +187 -237
- package/core/connection_checker.d.ts +78 -0
- package/core/{connection_checker.js → connection_checker.ts} +66 -77
- package/core/connection_db.d.ts +91 -0
- package/core/{connection_db.js → connection_db.ts} +62 -87
- package/core/connection_type.d.ts +15 -0
- package/core/{connection_type.js → connection_type.ts} +8 -12
- package/core/constants.d.ts +15 -0
- package/core/{constants.js → constants.ts} +4 -8
- package/core/contextmenu.d.ts +80 -0
- package/core/{contextmenu.js → contextmenu.ts} +118 -153
- package/core/contextmenu_items.d.ts +77 -0
- package/core/contextmenu_items.ts +576 -0
- package/core/contextmenu_registry.d.ts +105 -0
- package/core/contextmenu_registry.ts +179 -0
- package/core/css.d.ts +24 -0
- package/core/{css.js → css.ts} +16 -24
- package/core/delete_area.d.ts +47 -0
- package/core/delete_area.ts +82 -0
- package/core/dialog.d.ts +61 -0
- package/core/dialog.ts +127 -0
- package/core/drag_target.d.ts +63 -0
- package/core/drag_target.ts +94 -0
- package/core/dropdowndiv.d.ts +155 -0
- package/core/{dropdowndiv.js → dropdowndiv.ts} +262 -333
- package/core/events/events.d.ts +102 -0
- package/core/events/events.ts +123 -0
- package/core/events/events_abstract.d.ts +51 -0
- package/core/events/events_abstract.ts +112 -0
- package/core/events/events_block_base.d.ts +31 -0
- package/core/events/events_block_base.ts +65 -0
- package/core/events/events_block_change.d.ts +55 -0
- package/core/events/{events_block_change.js → events_block_change.ts} +45 -48
- package/core/events/events_block_create.d.ts +35 -0
- package/core/events/{events_block_create.js → events_block_create.ts} +31 -44
- package/core/events/events_block_delete.d.ts +36 -0
- package/core/events/{events_block_delete.js → events_block_delete.ts} +35 -48
- package/core/events/events_block_drag.d.ts +36 -0
- package/core/events/events_block_drag.ts +82 -0
- package/core/events/events_block_move.d.ts +51 -0
- package/core/events/{events_block_move.js → events_block_move.ts} +54 -50
- package/core/events/events_bubble_open.d.ts +35 -0
- package/core/events/events_bubble_open.ts +82 -0
- package/core/events/events_click.d.ts +36 -0
- package/core/events/{events_click.js → events_click.ts} +27 -30
- package/core/events/events_comment_base.d.ts +39 -0
- package/core/events/events_comment_base.ts +107 -0
- package/core/events/events_comment_change.d.ts +43 -0
- package/core/events/{events_comment_change.js → events_comment_change.ts} +31 -28
- package/core/events/events_comment_create.d.ts +35 -0
- package/core/events/{events_comment_create.js → events_comment_create.ts} +24 -26
- package/core/events/events_comment_delete.d.ts +35 -0
- package/core/events/{events_comment_delete.js → events_comment_delete.ts} +20 -24
- package/core/events/events_comment_move.d.ts +55 -0
- package/core/events/{events_comment_move.js → events_comment_move.ts} +39 -42
- package/core/events/events_marker_move.d.ts +40 -0
- package/core/events/events_marker_move.ts +99 -0
- package/core/events/events_selected.d.ts +34 -0
- package/core/events/events_selected.ts +78 -0
- package/core/events/events_theme_change.d.ts +30 -0
- package/core/events/{events_theme_change.js → events_theme_change.ts} +19 -24
- package/core/events/events_toolbox_item_select.d.ts +34 -0
- package/core/events/events_toolbox_item_select.ts +79 -0
- package/core/events/events_trashcan_open.d.ts +31 -0
- package/core/events/events_trashcan_open.ts +68 -0
- package/core/events/events_ui.d.ts +37 -0
- package/core/events/{events_ui.js → events_ui.ts} +27 -26
- package/core/events/events_ui_base.d.ts +26 -0
- package/core/events/{events_ui_base.js → events_ui_base.ts} +17 -26
- package/core/events/events_var_base.d.ts +31 -0
- package/core/events/events_var_base.ts +65 -0
- package/core/events/events_var_create.d.ts +35 -0
- package/core/events/{events_var_create.js → events_var_create.ts} +24 -25
- package/core/events/events_var_delete.d.ts +35 -0
- package/core/events/{events_var_delete.js → events_var_delete.ts} +24 -25
- package/core/events/events_var_rename.d.ts +36 -0
- package/core/events/{events_var_rename.js → events_var_rename.ts} +25 -26
- package/core/events/events_viewport.d.ts +39 -0
- package/core/events/events_viewport.ts +100 -0
- package/core/events/utils.d.ts +272 -0
- package/core/events/{utils.js → utils.ts} +148 -219
- package/core/events/workspace_events.d.ts +36 -0
- package/core/events/workspace_events.ts +86 -0
- package/core/extensions.d.ts +107 -0
- package/core/{extensions.js → extensions.ts} +153 -172
- package/core/field.d.ts +534 -0
- package/core/{field.js → field.ts} +413 -489
- package/core/field_angle.d.ts +176 -0
- package/core/field_angle.ts +563 -0
- package/core/field_checkbox.d.ts +124 -0
- package/core/field_checkbox.ts +243 -0
- package/core/field_colour.d.ts +200 -0
- package/core/field_colour.ts +632 -0
- package/core/field_dropdown.d.ts +222 -0
- package/core/{field_dropdown.js → field_dropdown.ts} +277 -299
- package/core/field_image.d.ts +134 -0
- package/core/field_image.ts +282 -0
- package/core/field_label.d.ts +71 -0
- package/core/field_label.ts +152 -0
- package/core/field_label_serializable.d.ts +42 -0
- package/core/field_label_serializable.ts +76 -0
- package/core/field_multilineinput.d.ts +146 -0
- package/core/{field_multilineinput.js → field_multilineinput.ts} +166 -163
- package/core/field_number.d.ts +156 -0
- package/core/{field_number.js → field_number.ts} +110 -123
- package/core/field_registry.d.ts +45 -0
- package/core/{field_registry.js → field_registry.ts} +37 -30
- package/core/field_textinput.d.ts +219 -0
- package/core/field_textinput.ts +591 -0
- package/core/field_variable.d.ts +217 -0
- package/core/{field_variable.js → field_variable.ts} +174 -187
- package/core/flyout_base.d.ts +459 -0
- package/core/{flyout_base.js → flyout_base.ts} +429 -518
- package/core/flyout_button.d.ts +81 -0
- package/core/flyout_button.ts +292 -0
- package/core/flyout_horizontal.d.ts +82 -0
- package/core/{flyout_horizontal.js → flyout_horizontal.ts} +97 -107
- package/core/flyout_metrics_manager.d.ts +40 -0
- package/core/{flyout_metrics_manager.js → flyout_metrics_manager.ts} +22 -34
- package/core/flyout_vertical.d.ts +83 -0
- package/core/{flyout_vertical.js → flyout_vertical.ts} +106 -117
- package/core/generator.d.ts +205 -0
- package/core/{generator.js → generator.ts} +168 -193
- package/core/gesture.d.ts +357 -0
- package/core/{gesture.js → gesture.ts} +289 -369
- package/core/grid.d.ts +83 -0
- package/core/grid.ts +192 -0
- package/core/icon.d.ts +78 -0
- package/core/icon.ts +189 -0
- package/core/inject.d.ts +15 -0
- package/core/{inject.js → inject.ts} +101 -100
- package/core/input.d.ts +128 -0
- package/core/{input.js → input.ts} +96 -119
- package/core/input_types.d.ts +14 -0
- package/core/{input_types.js → input_types.ts} +8 -12
- package/core/insertion_marker_manager.d.ts +212 -0
- package/core/{insertion_marker_manager.js → insertion_marker_manager.ts} +234 -236
- package/core/interfaces/i_ast_node_location.d.ts +11 -0
- package/core/interfaces/{i_ast_node_location.js → i_ast_node_location.ts} +4 -7
- package/core/interfaces/i_ast_node_location_svg.d.ts +22 -0
- package/core/interfaces/i_ast_node_location_svg.ts +37 -0
- package/core/interfaces/i_ast_node_location_with_block.d.ts +18 -0
- package/core/interfaces/i_ast_node_location_with_block.ts +38 -0
- package/core/interfaces/i_autohideable.d.ts +18 -0
- package/core/interfaces/i_autohideable.ts +34 -0
- package/core/interfaces/i_block_dragger.d.ts +43 -0
- package/core/interfaces/i_block_dragger.ts +67 -0
- package/core/interfaces/i_bounded_element.d.ts +24 -0
- package/core/interfaces/i_bounded_element.ts +42 -0
- package/core/interfaces/i_bubble.d.ts +59 -0
- package/core/interfaces/i_bubble.ts +88 -0
- package/core/interfaces/i_collapsible_toolbox_item.d.ts +26 -0
- package/core/interfaces/i_collapsible_toolbox_item.ts +47 -0
- package/core/interfaces/i_component.d.ts +17 -0
- package/core/interfaces/{i_component.js → i_component.ts} +9 -14
- package/core/interfaces/i_connection_checker.d.ts +69 -0
- package/core/interfaces/i_connection_checker.ts +102 -0
- package/core/interfaces/i_contextmenu.d.ts +13 -0
- package/core/interfaces/i_contextmenu.ts +26 -0
- package/core/interfaces/i_copyable.d.ts +24 -0
- package/core/interfaces/i_copyable.ts +40 -0
- package/core/interfaces/i_deletable.d.ts +16 -0
- package/core/interfaces/{i_deletable.js → i_deletable.ts} +9 -13
- package/core/interfaces/i_delete_area.d.ts +25 -0
- package/core/interfaces/i_delete_area.ts +46 -0
- package/core/interfaces/i_drag_target.d.ts +53 -0
- package/core/interfaces/i_drag_target.ts +84 -0
- package/core/interfaces/i_draggable.d.ts +12 -0
- package/core/interfaces/{i_draggable.js → i_draggable.ts} +4 -10
- package/core/interfaces/i_flyout.d.ts +134 -0
- package/core/interfaces/i_flyout.ts +186 -0
- package/core/interfaces/i_keyboard_accessible.d.ts +18 -0
- package/core/interfaces/i_keyboard_accessible.ts +35 -0
- package/core/interfaces/i_metrics_manager.d.ts +117 -0
- package/core/interfaces/i_metrics_manager.ts +151 -0
- package/core/interfaces/i_movable.d.ts +16 -0
- package/core/interfaces/{i_movable.js → i_movable.ts} +9 -13
- package/core/interfaces/i_positionable.d.ts +27 -0
- package/core/interfaces/i_positionable.ts +50 -0
- package/core/interfaces/i_registrable.d.ts +11 -0
- package/core/interfaces/{i_registrable.js → i_registrable.ts} +3 -7
- package/core/interfaces/i_registrable_field.d.ts +17 -0
- package/core/interfaces/{i_registrable_field.js → i_registrable_field.ts} +8 -16
- package/core/interfaces/i_selectable.d.ts +18 -0
- package/core/interfaces/i_selectable.ts +34 -0
- package/core/interfaces/i_selectable_toolbox_item.d.ts +42 -0
- package/core/interfaces/i_selectable_toolbox_item.ts +64 -0
- package/core/interfaces/i_serializer.d.ts +42 -0
- package/core/interfaces/i_serializer.ts +65 -0
- package/core/interfaces/i_styleable.d.ts +21 -0
- package/core/interfaces/i_styleable.ts +35 -0
- package/core/interfaces/i_toolbox.d.ts +85 -0
- package/core/interfaces/i_toolbox.ts +127 -0
- package/core/interfaces/i_toolbox_item.d.ts +62 -0
- package/core/interfaces/i_toolbox_item.ts +84 -0
- package/core/internal_constants.d.ts +40 -0
- package/core/{internal_constants.js → internal_constants.ts} +13 -18
- package/core/keyboard_nav/ast_node.d.ts +239 -0
- package/core/keyboard_nav/{ast_node.js → ast_node.ts} +207 -231
- package/core/keyboard_nav/basic_cursor.d.ts +88 -0
- package/core/keyboard_nav/{basic_cursor.js → basic_cursor.ts} +55 -66
- package/core/keyboard_nav/cursor.d.ts +41 -0
- package/core/keyboard_nav/{cursor.js → cursor.ts} +25 -35
- package/core/keyboard_nav/marker.d.ts +58 -0
- package/core/keyboard_nav/{marker.js → marker.ts} +36 -55
- package/core/keyboard_nav/tab_navigate_cursor.d.ts +19 -0
- package/core/keyboard_nav/{tab_navigate_cursor.js → tab_navigate_cursor.ts} +11 -15
- package/core/main.d.ts +11 -0
- package/core/main.js +303 -0
- package/core/marker_manager.d.ts +85 -0
- package/core/marker_manager.ts +181 -0
- package/core/menu.d.ts +149 -0
- package/core/{menu.js → menu.ts} +141 -174
- package/core/menuitem.d.ts +118 -0
- package/core/menuitem.ts +240 -0
- package/core/metrics_manager.d.ts +201 -0
- package/core/{metrics_manager.js → metrics_manager.ts} +117 -156
- package/core/msg.d.ts +9 -0
- package/core/{msg.js → msg.ts} +4 -8
- package/core/mutator.d.ts +128 -0
- package/core/{mutator.js → mutator.ts} +196 -211
- package/core/names.d.ts +124 -0
- package/core/names.ts +267 -0
- package/core/options.d.ts +137 -0
- package/core/{options.js → options.ts} +147 -173
- package/core/positionable_helpers.d.ts +88 -0
- package/core/{positionable_helpers.js → positionable_helpers.ts} +63 -70
- package/core/procedures.d.ts +108 -0
- package/core/{procedures.js → procedures.ts} +143 -152
- package/core/registry.d.ts +137 -0
- package/core/registry.ts +339 -0
- package/core/rendered_connection.d.ts +191 -0
- package/core/{rendered_connection.js → rendered_connection.ts} +164 -184
- package/core/renderers/common/block_rendering.d.ts +114 -0
- package/core/renderers/common/block_rendering.ts +164 -0
- package/core/renderers/common/constants.d.ts +458 -0
- package/core/renderers/common/constants.ts +1124 -0
- package/core/renderers/common/debug.d.ts +28 -0
- package/core/renderers/common/{debug.js → debug.ts} +14 -20
- package/core/renderers/common/debugger.d.ts +120 -0
- package/core/renderers/common/{debugger.js → debugger.ts} +100 -124
- package/core/renderers/common/drawer.d.ts +132 -0
- package/core/renderers/common/{drawer.js → drawer.ts} +112 -137
- package/core/renderers/common/i_path_object.d.ts +117 -0
- package/core/renderers/common/i_path_object.ts +161 -0
- package/core/renderers/common/info.d.ts +194 -0
- package/core/renderers/common/{info.js → info.ts} +165 -222
- package/core/renderers/common/marker_svg.d.ts +220 -0
- package/core/renderers/common/marker_svg.ts +680 -0
- package/core/renderers/common/path_object.d.ts +146 -0
- package/core/renderers/common/path_object.ts +272 -0
- package/core/renderers/common/renderer.d.ts +157 -0
- package/core/renderers/common/renderer.ts +271 -0
- package/core/renderers/geras/constants.d.ts +23 -0
- package/core/renderers/geras/constants.ts +61 -0
- package/core/renderers/geras/drawer.d.ts +43 -0
- package/core/renderers/geras/{drawer.js → drawer.ts} +40 -84
- package/core/renderers/geras/geras.d.ts +11 -0
- package/core/renderers/geras/geras.ts +37 -0
- package/core/renderers/geras/highlight_constants.d.ts +108 -0
- package/core/renderers/geras/{highlight_constants.js → highlight_constants.ts} +107 -69
- package/core/renderers/geras/highlighter.d.ts +98 -0
- package/core/renderers/geras/{highlighter.js → highlighter.ts} +81 -86
- package/core/renderers/geras/info.d.ts +45 -0
- package/core/renderers/geras/{info.js → info.ts} +61 -99
- package/core/renderers/geras/measurables/inline_input.d.ts +23 -0
- package/core/renderers/geras/measurables/inline_input.ts +51 -0
- package/core/renderers/geras/measurables/statement_input.d.ts +23 -0
- package/core/renderers/geras/measurables/statement_input.ts +50 -0
- package/core/renderers/geras/path_object.d.ts +47 -0
- package/core/renderers/geras/{path_object.js → path_object.ts} +46 -74
- package/core/renderers/geras/renderer.d.ts +69 -0
- package/core/renderers/geras/renderer.ts +126 -0
- package/core/renderers/measurables/base.d.ts +27 -0
- package/core/renderers/measurables/base.ts +53 -0
- package/core/renderers/measurables/bottom_row.d.ts +61 -0
- package/core/renderers/measurables/bottom_row.ts +120 -0
- package/core/renderers/measurables/connection.d.ts +25 -0
- package/core/renderers/measurables/connection.ts +52 -0
- package/core/renderers/measurables/external_value_input.d.ts +27 -0
- package/core/renderers/measurables/external_value_input.ts +65 -0
- package/core/renderers/measurables/field.d.ts +30 -0
- package/core/renderers/measurables/field.ts +63 -0
- package/core/renderers/measurables/hat.d.ts +21 -0
- package/core/renderers/measurables/{hat.js → hat.ts} +12 -14
- package/core/renderers/measurables/icon.d.ts +26 -0
- package/core/renderers/measurables/{icon.js → icon.ts} +14 -18
- package/core/renderers/measurables/in_row_spacer.d.ts +21 -0
- package/core/renderers/measurables/in_row_spacer.ts +44 -0
- package/core/renderers/measurables/inline_input.d.ts +24 -0
- package/core/renderers/measurables/{inline_input.js → inline_input.ts} +22 -26
- package/core/renderers/measurables/input_connection.d.ts +29 -0
- package/core/renderers/measurables/input_connection.ts +66 -0
- package/core/renderers/measurables/input_row.d.ts +30 -0
- package/core/renderers/measurables/{input_row.js → input_row.ts} +24 -31
- package/core/renderers/measurables/jagged_edge.d.ts +20 -0
- package/core/renderers/measurables/{jagged_edge.js → jagged_edge.ts} +10 -13
- package/core/renderers/measurables/next_connection.d.ts +23 -0
- package/core/renderers/measurables/next_connection.ts +47 -0
- package/core/renderers/measurables/output_connection.d.ts +26 -0
- package/core/renderers/measurables/output_connection.ts +56 -0
- package/core/renderers/measurables/previous_connection.d.ts +23 -0
- package/core/renderers/measurables/previous_connection.ts +47 -0
- package/core/renderers/measurables/round_corner.d.ts +21 -0
- package/core/renderers/measurables/round_corner.ts +49 -0
- package/core/renderers/measurables/row.d.ts +141 -0
- package/core/renderers/measurables/row.ts +225 -0
- package/core/renderers/measurables/spacer_row.d.ts +29 -0
- package/core/renderers/measurables/spacer_row.ts +55 -0
- package/core/renderers/measurables/square_corner.d.ts +21 -0
- package/core/renderers/measurables/square_corner.ts +47 -0
- package/core/renderers/measurables/statement_input.d.ts +22 -0
- package/core/renderers/measurables/{statement_input.js → statement_input.ts} +14 -18
- package/core/renderers/measurables/top_row.d.ts +56 -0
- package/core/renderers/measurables/top_row.ts +122 -0
- package/core/renderers/measurables/types.d.ts +235 -0
- package/core/renderers/measurables/types.ts +332 -0
- package/core/renderers/minimalist/constants.d.ts +14 -0
- package/core/renderers/minimalist/{constants.js → constants.ts} +5 -10
- package/core/renderers/minimalist/drawer.d.ts +21 -0
- package/core/renderers/minimalist/drawer.ts +38 -0
- package/core/renderers/minimalist/info.d.ts +30 -0
- package/core/renderers/minimalist/info.ts +52 -0
- package/core/renderers/minimalist/minimalist.d.ts +6 -0
- package/core/renderers/minimalist/minimalist.ts +22 -0
- package/core/renderers/minimalist/renderer.d.ts +41 -0
- package/core/renderers/minimalist/renderer.ts +71 -0
- package/core/renderers/thrasos/info.d.ts +40 -0
- package/core/renderers/thrasos/{info.js → info.ts} +66 -67
- package/core/renderers/thrasos/renderer.d.ts +25 -0
- package/core/renderers/thrasos/renderer.ts +48 -0
- package/core/renderers/thrasos/thrasos.d.ts +4 -0
- package/core/renderers/thrasos/thrasos.ts +20 -0
- package/core/renderers/zelos/constants.d.ts +186 -0
- package/core/renderers/zelos/{constants.js → constants.ts} +294 -441
- package/core/renderers/zelos/drawer.d.ts +47 -0
- package/core/renderers/zelos/{drawer.js → drawer.ts} +73 -95
- package/core/renderers/zelos/info.d.ts +88 -0
- package/core/renderers/zelos/{info.js → info.ts} +111 -142
- package/core/renderers/zelos/marker_svg.d.ts +46 -0
- package/core/renderers/zelos/marker_svg.ts +151 -0
- package/core/renderers/zelos/measurables/bottom_row.d.ts +27 -0
- package/core/renderers/zelos/measurables/bottom_row.ts +53 -0
- package/core/renderers/zelos/measurables/inputs.d.ts +23 -0
- package/core/renderers/zelos/measurables/{inputs.js → inputs.ts} +14 -15
- package/core/renderers/zelos/measurables/row_elements.d.ts +21 -0
- package/core/renderers/zelos/measurables/row_elements.ts +45 -0
- package/core/renderers/zelos/measurables/top_row.d.ts +29 -0
- package/core/renderers/zelos/measurables/{top_row.js → top_row.ts} +14 -27
- package/core/renderers/zelos/path_object.d.ts +77 -0
- package/core/renderers/zelos/path_object.ts +215 -0
- package/core/renderers/zelos/renderer.d.ts +74 -0
- package/core/renderers/zelos/renderer.ts +142 -0
- package/core/renderers/zelos/zelos.d.ts +12 -0
- package/core/renderers/zelos/zelos.ts +39 -0
- package/core/scrollbar.d.ts +277 -0
- package/core/{scrollbar.js → scrollbar.ts} +307 -328
- package/core/scrollbar_pair.d.ts +105 -0
- package/core/{scrollbar_pair.js → scrollbar_pair.ts} +71 -79
- package/core/serialization/blocks.d.ts +98 -0
- package/core/serialization/{blocks.js → blocks.ts} +234 -227
- package/core/serialization/exceptions.d.ts +73 -0
- package/core/serialization/exceptions.ts +98 -0
- package/core/serialization/priorities.d.ts +15 -0
- package/core/serialization/{priorities.js → priorities.ts} +4 -10
- package/core/serialization/registry.d.ts +20 -0
- package/core/serialization/{registry.js → registry.ts} +11 -13
- package/core/serialization/variables.d.ts +14 -0
- package/core/serialization/{variables.js → variables.ts} +30 -32
- package/core/serialization/workspaces.d.ts +28 -0
- package/core/serialization/{workspaces.js → workspaces.ts} +30 -27
- package/core/shortcut_items.d.ts +61 -0
- package/core/{shortcut_items.js → shortcut_items.ts} +121 -157
- package/core/shortcut_registry.d.ts +151 -0
- package/core/shortcut_registry.ts +355 -0
- package/core/sprites.d.ts +19 -0
- package/core/{sprites.js → sprites.ts} +4 -6
- package/core/theme/classic.d.ts +12 -0
- package/core/theme/{classic.js → classic.ts} +5 -7
- package/core/theme/themes.d.ts +8 -0
- package/core/theme/themes.ts +22 -0
- package/core/theme/zelos.d.ts +11 -0
- package/core/theme/{zelos.js → zelos.ts} +4 -7
- package/core/theme.d.ts +142 -0
- package/core/theme.ts +221 -0
- package/core/theme_manager.d.ts +81 -0
- package/core/theme_manager.ts +186 -0
- package/core/toolbox/category.d.ts +239 -0
- package/core/toolbox/category.ts +679 -0
- package/core/toolbox/collapsible_category.d.ts +91 -0
- package/core/toolbox/collapsible_category.ts +273 -0
- package/core/toolbox/separator.d.ts +39 -0
- package/core/toolbox/separator.ts +105 -0
- package/core/toolbox/toolbox.d.ts +352 -0
- package/core/toolbox/{toolbox.js → toolbox.ts} +316 -432
- package/core/toolbox/toolbox_item.d.ts +85 -0
- package/core/toolbox/toolbox_item.ts +147 -0
- package/core/tooltip.d.ts +126 -0
- package/core/{tooltip.js → tooltip.ts} +136 -214
- package/core/touch.d.ts +121 -0
- package/core/touch.ts +306 -0
- package/core/touch_gesture.d.ts +115 -0
- package/core/{touch_gesture.js → touch_gesture.ts} +87 -125
- package/core/trashcan.d.ts +195 -0
- package/core/{trashcan.js → trashcan.ts} +226 -312
- package/core/utils/aria.d.ts +67 -0
- package/core/utils/{aria.js → aria.ts} +47 -61
- package/core/utils/array.d.ts +14 -0
- package/core/utils/{array.js → array.ts} +10 -12
- package/core/utils/colour.d.ts +103 -0
- package/core/utils/{colour.js → colour.ts} +60 -72
- package/core/utils/coordinate.d.ts +72 -0
- package/core/utils/coordinate.ts +124 -0
- package/core/utils/deprecation.d.ts +17 -0
- package/core/utils/{deprecation.js → deprecation.ts} +11 -11
- package/core/utils/dom.d.ts +165 -0
- package/core/utils/{dom.js → dom.ts} +125 -147
- package/core/utils/idgenerator.d.ts +25 -0
- package/core/utils/{idgenerator.js → idgenerator.ts} +15 -18
- package/core/utils/keycodes.d.ts +137 -0
- package/core/utils/keycodes.ts +169 -0
- package/core/utils/math.d.ts +30 -0
- package/core/utils/{math.js → math.ts} +17 -19
- package/core/utils/metrics.d.ts +64 -0
- package/core/utils/metrics.ts +97 -0
- package/core/utils/object.d.ts +35 -0
- package/core/utils/{object.js → object.ts} +30 -26
- package/core/utils/parsing.d.ts +50 -0
- package/core/utils/{parsing.js → parsing.ts} +50 -50
- package/core/utils/rect.d.ts +38 -0
- package/core/utils/{rect.js → rect.ts} +18 -31
- package/core/utils/sentinel.d.ts +11 -0
- package/core/utils/{sentinel.js → sentinel.ts} +3 -5
- package/core/utils/size.d.ts +27 -0
- package/core/utils/{size.js → size.ts} +12 -26
- package/core/utils/string.d.ts +55 -0
- package/core/utils/{string.js → string.ts} +64 -61
- package/core/utils/style.d.ts +127 -0
- package/core/utils/{style.js → style.ts} +102 -92
- package/core/utils/svg.d.ts +68 -0
- package/core/utils/svg.ts +88 -0
- package/core/utils/svg_math.d.ts +70 -0
- package/core/utils/{svg_math.js → svg_math.ts} +72 -71
- package/core/utils/svg_paths.d.ts +101 -0
- package/core/utils/{svg_paths.js → svg_paths.ts} +56 -65
- package/core/utils/toolbox.d.ts +193 -0
- package/core/utils/toolbox.ts +433 -0
- package/core/utils/useragent.d.ts +33 -0
- package/core/utils/useragent.ts +135 -0
- package/core/utils/xml.d.ts +52 -0
- package/core/utils/{xml.js → xml.ts} +26 -36
- package/core/utils.d.ts +217 -0
- package/core/utils.ts +428 -0
- package/core/variable_map.d.ts +141 -0
- package/core/{variable_map.js → variable_map.ts} +131 -149
- package/core/variable_model.d.ts +40 -0
- package/core/variable_model.ts +82 -0
- package/core/variables.d.ts +181 -0
- package/core/{variables.js → variables.ts} +206 -188
- package/core/variables_dynamic.d.ts +38 -0
- package/core/{variables_dynamic.js → variables_dynamic.ts} +47 -43
- package/core/warning.d.ts +50 -0
- package/core/{warning.js → warning.ts} +52 -66
- package/core/widgetdiv.d.ts +69 -0
- package/core/widgetdiv.ts +257 -0
- package/core/workspace.d.ts +386 -0
- package/core/workspace.ts +801 -0
- package/core/workspace_audio.d.ts +47 -0
- package/core/{workspace_audio.js → workspace_audio.ts} +47 -60
- package/core/workspace_comment.d.ts +170 -0
- package/core/workspace_comment.ts +398 -0
- package/core/workspace_comment_svg.d.ts +329 -0
- package/core/{workspace_comment_svg.js → workspace_comment_svg.ts} +347 -444
- package/core/workspace_drag_surface_svg.d.ts +68 -0
- package/core/{workspace_drag_surface_svg.js → workspace_drag_surface_svg.ts} +75 -82
- package/core/workspace_dragger.d.ts +48 -0
- package/core/workspace_dragger.ts +104 -0
- package/core/workspace_svg.d.ts +920 -0
- package/core/{workspace_svg.js → workspace_svg.ts} +855 -935
- package/core/xml.d.ts +117 -0
- package/core/{xml.js → xml.ts} +306 -326
- package/core/zoom_controls.d.ts +130 -0
- package/core/{zoom_controls.js → zoom_controls.ts} +185 -251
- package/core.d.ts +1 -4
- package/core.js +1 -2
- package/dart.d.ts +1 -4
- package/dart_compressed.js +387 -99
- package/dart_compressed.js.map +1 -1
- package/generators/dart/all.js +2 -0
- package/generators/dart/colour.js +1 -1
- package/generators/dart/lists.js +1 -1
- package/generators/dart/logic.js +1 -1
- package/generators/dart/loops.js +1 -1
- package/generators/dart/math.js +1 -1
- package/generators/dart/procedures.js +1 -1
- package/generators/dart/text.js +1 -1
- package/generators/dart/variables.js +1 -1
- package/generators/dart/variables_dynamic.js +1 -1
- package/generators/dart.js +1 -2
- package/generators/javascript/all.js +2 -0
- package/generators/javascript/colour.js +1 -1
- package/generators/javascript/lists.js +1 -1
- package/generators/javascript/logic.js +1 -1
- package/generators/javascript/loops.js +1 -1
- package/generators/javascript/math.js +4 -4
- package/generators/javascript/procedures.js +1 -1
- package/generators/javascript/text.js +2 -2
- package/generators/javascript/variables.js +1 -1
- package/generators/javascript/variables_dynamic.js +1 -1
- package/generators/javascript.js +1 -3
- package/generators/lua/all.js +2 -0
- package/generators/lua/colour.js +1 -1
- package/generators/lua/lists.js +1 -1
- package/generators/lua/logic.js +1 -1
- package/generators/lua/loops.js +1 -1
- package/generators/lua/math.js +1 -1
- package/generators/lua/procedures.js +1 -1
- package/generators/lua/text.js +1 -1
- package/generators/lua/variables.js +1 -1
- package/generators/lua/variables_dynamic.js +1 -1
- package/generators/lua.js +1 -2
- package/generators/php/all.js +2 -0
- package/generators/php/colour.js +1 -1
- package/generators/php/lists.js +1 -2
- package/generators/php/logic.js +1 -1
- package/generators/php/loops.js +1 -1
- package/generators/php/math.js +1 -1
- package/generators/php/procedures.js +1 -1
- package/generators/php/text.js +1 -1
- package/generators/php/variables.js +1 -1
- package/generators/php/variables_dynamic.js +1 -1
- package/generators/php.js +1 -2
- package/generators/python/all.js +2 -0
- package/generators/python/colour.js +3 -3
- package/generators/python/lists.js +1 -1
- package/generators/python/logic.js +1 -1
- package/generators/python/loops.js +4 -7
- package/generators/python/math.js +1 -1
- package/generators/python/procedures.js +1 -1
- package/generators/python/text.js +1 -1
- package/generators/python/variables.js +1 -1
- package/generators/python/variables_dynamic.js +1 -1
- package/generators/python.js +1 -2
- package/index.d.ts +3 -11
- package/javascript.d.ts +1 -4
- package/javascript_compressed.js +314 -104
- package/javascript_compressed.js.map +1 -1
- package/lua.d.ts +1 -4
- package/lua_compressed.js +399 -81
- package/lua_compressed.js.map +1 -1
- package/msg/ab.js +10 -6
- package/msg/ace.js +10 -6
- package/msg/af.js +10 -6
- package/msg/am.js +10 -6
- package/msg/ar.js +10 -6
- package/msg/ast.js +10 -6
- package/msg/az.js +12 -8
- package/msg/ba.js +10 -6
- package/msg/bcc.js +10 -6
- package/msg/be-tarask.js +10 -6
- package/msg/be.js +14 -10
- package/msg/bg.js +10 -6
- package/msg/bn.js +10 -6
- package/msg/br.js +10 -6
- package/msg/bs.js +10 -6
- package/msg/ca.js +10 -6
- package/msg/cdo.js +10 -6
- package/msg/cs.js +25 -21
- package/msg/da.js +10 -6
- package/msg/de.js +11 -7
- package/msg/diq.js +11 -7
- package/msg/dty.js +10 -6
- package/msg/ee.js +10 -6
- package/msg/el.js +10 -6
- package/msg/en-gb.js +10 -6
- package/msg/en.js +10 -6
- package/msg/eo.js +11 -7
- package/msg/es.js +11 -7
- package/msg/et.js +10 -6
- package/msg/eu.js +10 -6
- package/msg/fa.js +11 -7
- package/msg/fi.js +10 -6
- package/msg/fo.js +10 -6
- package/msg/fr.js +14 -10
- package/msg/frr.js +10 -6
- package/msg/gl.js +10 -6
- package/msg/gn.js +10 -6
- package/msg/gor.js +10 -6
- package/msg/ha.js +10 -6
- package/msg/hak.js +10 -6
- package/msg/he.js +11 -7
- package/msg/hi.js +10 -6
- package/msg/hr.js +12 -8
- package/msg/hrx.js +10 -6
- package/msg/hu.js +10 -6
- package/msg/hy.js +12 -8
- package/msg/ia.js +10 -6
- package/msg/id.js +22 -18
- package/msg/ig.js +10 -6
- package/msg/inh.js +24 -20
- package/msg/is.js +10 -6
- package/msg/it.js +10 -6
- package/msg/ja.js +17 -13
- package/msg/ka.js +10 -6
- package/msg/kab.js +10 -6
- package/msg/kbd-cyrl.js +10 -6
- package/msg/km.js +10 -6
- package/msg/kn.js +10 -6
- package/msg/ko.js +10 -6
- package/msg/ksh.js +10 -6
- package/msg/ku-latn.js +10 -6
- package/msg/ky.js +10 -6
- package/msg/la.js +10 -6
- package/msg/lb.js +10 -6
- package/msg/lki.js +10 -6
- package/msg/lo.js +10 -6
- package/msg/lrc.js +10 -6
- package/msg/lt.js +10 -6
- package/msg/lv.js +39 -35
- package/msg/mg.js +10 -6
- package/msg/mk.js +10 -6
- package/msg/ml.js +10 -6
- package/msg/mnw.js +10 -6
- package/msg/ms.js +10 -6
- package/msg/my.js +10 -6
- package/msg/mzn.js +10 -6
- package/msg/nb.js +10 -6
- package/msg/ne.js +10 -6
- package/msg/nl.js +10 -6
- package/msg/oc.js +10 -6
- package/msg/olo.js +10 -6
- package/msg/pa.js +13 -9
- package/msg/pl.js +10 -6
- package/msg/pms.js +10 -6
- package/msg/ps.js +10 -6
- package/msg/pt-br.js +10 -6
- package/msg/pt.js +10 -6
- package/msg/ro.js +10 -6
- package/msg/ru.js +10 -6
- package/msg/sc.js +10 -6
- package/msg/sco.js +10 -6
- package/msg/sd.js +10 -6
- package/msg/shn.js +10 -6
- package/msg/si.js +10 -6
- package/msg/sk.js +10 -6
- package/msg/skr-arab.js +10 -6
- package/msg/sl.js +10 -6
- package/msg/smn.js +440 -0
- package/msg/sq.js +10 -6
- package/msg/sr-latn.js +10 -6
- package/msg/sr.js +10 -6
- package/msg/sv.js +10 -6
- package/msg/sw.js +10 -6
- package/msg/ta.js +10 -6
- package/msg/tcy.js +10 -6
- package/msg/te.js +11 -7
- package/msg/th.js +10 -6
- package/msg/ti.js +10 -6
- package/msg/tl.js +10 -6
- package/msg/tlh.js +10 -6
- package/msg/tr.js +10 -6
- package/msg/ug-arab.js +10 -6
- package/msg/uk.js +10 -6
- package/msg/ur.js +10 -6
- package/msg/uz.js +10 -6
- package/msg/vi.js +10 -6
- package/msg/xmf.js +10 -6
- package/msg/yo.js +10 -6
- package/msg/yue.js +11 -7
- package/msg/zgh.js +10 -6
- package/msg/zh-hans.js +13 -9
- package/msg/zh-hant.js +13 -9
- package/package.json +5 -5
- package/php.d.ts +1 -4
- package/php_compressed.js +322 -93
- package/php_compressed.js.map +1 -1
- package/python.d.ts +1 -4
- package/python_compressed.js +237 -90
- package/python_compressed.js.map +1 -1
- package/blockly.d.ts +0 -25607
- package/core/blockly_options.js +0 -28
- package/core/bubble_dragger.js +0 -298
- package/core/clipboard.js +0 -80
- package/core/component_manager.js +0 -263
- package/core/contextmenu_items.js +0 -651
- package/core/contextmenu_registry.js +0 -178
- package/core/delete_area.js +0 -87
- package/core/dialog.js +0 -107
- package/core/drag_target.js +0 -98
- package/core/events/events.js +0 -147
- package/core/events/events_abstract.js +0 -133
- package/core/events/events_block_base.js +0 -70
- package/core/events/events_block_drag.js +0 -89
- package/core/events/events_bubble_open.js +0 -90
- package/core/events/events_comment_base.js +0 -121
- package/core/events/events_marker_move.js +0 -110
- package/core/events/events_selected.js +0 -83
- package/core/events/events_toolbox_item_select.js +0 -84
- package/core/events/events_trashcan_open.js +0 -73
- package/core/events/events_var_base.js +0 -70
- package/core/events/events_viewport.js +0 -107
- package/core/events/workspace_events.js +0 -93
- package/core/field_angle.js +0 -591
- package/core/field_checkbox.js +0 -255
- package/core/field_colour.js +0 -717
- package/core/field_image.js +0 -304
- package/core/field_label.js +0 -149
- package/core/field_label_serializable.js +0 -80
- package/core/field_textinput.js +0 -619
- package/core/flyout_button.js +0 -356
- package/core/grid.js +0 -226
- package/core/icon.js +0 -225
- package/core/interfaces/i_ast_node_location_svg.js +0 -45
- package/core/interfaces/i_ast_node_location_with_block.js +0 -41
- package/core/interfaces/i_autohideable.js +0 -40
- package/core/interfaces/i_block_dragger.js +0 -66
- package/core/interfaces/i_bounded_element.js +0 -45
- package/core/interfaces/i_bubble.js +0 -95
- package/core/interfaces/i_collapsible_toolbox_item.js +0 -53
- package/core/interfaces/i_connection_checker.js +0 -104
- package/core/interfaces/i_contextmenu.js +0 -32
- package/core/interfaces/i_copyable.js +0 -49
- package/core/interfaces/i_delete_area.js +0 -50
- package/core/interfaces/i_drag_target.js +0 -88
- package/core/interfaces/i_flyout.js +0 -201
- package/core/interfaces/i_keyboard_accessible.js +0 -38
- package/core/interfaces/i_metrics_manager.js +0 -154
- package/core/interfaces/i_positionable.js +0 -51
- package/core/interfaces/i_selectable.js +0 -51
- package/core/interfaces/i_selectable_toolbox_item.js +0 -73
- package/core/interfaces/i_serializer.js +0 -77
- package/core/interfaces/i_styleable.js +0 -39
- package/core/interfaces/i_toolbox.js +0 -142
- package/core/interfaces/i_toolbox_item.js +0 -85
- package/core/marker_manager.js +0 -213
- package/core/menuitem.js +0 -292
- package/core/names.js +0 -289
- package/core/registry.js +0 -384
- package/core/renderers/common/block_rendering.js +0 -170
- package/core/renderers/common/constants.js +0 -1250
- package/core/renderers/common/i_path_object.js +0 -162
- package/core/renderers/common/marker_svg.js +0 -721
- package/core/renderers/common/path_object.js +0 -283
- package/core/renderers/common/renderer.js +0 -305
- package/core/renderers/geras/constants.js +0 -73
- package/core/renderers/geras/geras.js +0 -36
- package/core/renderers/geras/measurables/inline_input.js +0 -58
- package/core/renderers/geras/measurables/statement_input.js +0 -57
- package/core/renderers/geras/renderer.js +0 -149
- package/core/renderers/measurables/base.js +0 -64
- package/core/renderers/measurables/bottom_row.js +0 -138
- package/core/renderers/measurables/connection.js +0 -56
- package/core/renderers/measurables/external_value_input.js +0 -70
- package/core/renderers/measurables/field.js +0 -71
- package/core/renderers/measurables/in_row_spacer.js +0 -47
- package/core/renderers/measurables/input_connection.js +0 -75
- package/core/renderers/measurables/next_connection.js +0 -50
- package/core/renderers/measurables/output_connection.js +0 -61
- package/core/renderers/measurables/previous_connection.js +0 -50
- package/core/renderers/measurables/round_corner.js +0 -52
- package/core/renderers/measurables/row.js +0 -247
- package/core/renderers/measurables/spacer_row.js +0 -69
- package/core/renderers/measurables/square_corner.js +0 -50
- package/core/renderers/measurables/top_row.js +0 -143
- package/core/renderers/measurables/types.js +0 -353
- package/core/renderers/minimalist/drawer.js +0 -42
- package/core/renderers/minimalist/info.js +0 -54
- package/core/renderers/minimalist/minimalist.js +0 -26
- package/core/renderers/minimalist/renderer.js +0 -80
- package/core/renderers/thrasos/renderer.js +0 -53
- package/core/renderers/thrasos/thrasos.js +0 -22
- package/core/renderers/zelos/marker_svg.js +0 -179
- package/core/renderers/zelos/measurables/bottom_row.js +0 -66
- package/core/renderers/zelos/measurables/row_elements.js +0 -46
- package/core/renderers/zelos/path_object.js +0 -247
- package/core/renderers/zelos/renderer.js +0 -147
- package/core/renderers/zelos/zelos.js +0 -38
- package/core/serialization/exceptions.js +0 -144
- package/core/shortcut_registry.js +0 -366
- package/core/theme/themes.js +0 -23
- package/core/theme.js +0 -228
- package/core/theme_manager.js +0 -211
- package/core/toolbox/category.js +0 -751
- package/core/toolbox/collapsible_category.js +0 -311
- package/core/toolbox/separator.js +0 -133
- package/core/toolbox/toolbox_item.js +0 -173
- package/core/touch.js +0 -285
- package/core/utils/coordinate.js +0 -138
- package/core/utils/global.js +0 -41
- package/core/utils/keycodes.js +0 -172
- package/core/utils/metrics.js +0 -154
- package/core/utils/svg.js +0 -186
- package/core/utils/toolbox.js +0 -459
- package/core/utils/useragent.js +0 -197
- package/core/utils.js +0 -383
- package/core/variable_model.js +0 -96
- package/core/widgetdiv.js +0 -290
- package/core/workspace.js +0 -836
- package/core/workspace_comment.js +0 -400
- package/core/workspace_dragger.js +0 -115
|
@@ -7,341 +7,270 @@
|
|
|
7
7
|
/**
|
|
8
8
|
* @fileoverview The class representing one block.
|
|
9
9
|
*/
|
|
10
|
-
'use strict';
|
|
11
10
|
|
|
12
11
|
/**
|
|
13
12
|
* The class representing one block.
|
|
14
13
|
* @class
|
|
15
14
|
*/
|
|
16
|
-
goog
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const {Workspace} = goog.requireType('Blockly.Workspace');
|
|
53
|
-
const {inputTypes} = goog.require('Blockly.inputTypes');
|
|
54
|
-
/** @suppress {extraRequire} */
|
|
55
|
-
goog.require('Blockly.Events.BlockChange');
|
|
56
|
-
/** @suppress {extraRequire} */
|
|
57
|
-
goog.require('Blockly.Events.BlockCreate');
|
|
58
|
-
/** @suppress {extraRequire} */
|
|
59
|
-
goog.require('Blockly.Events.BlockDelete');
|
|
60
|
-
/** @suppress {extraRequire} */
|
|
61
|
-
goog.require('Blockly.Events.BlockMove');
|
|
15
|
+
import * as goog from '../closure/goog/goog.js';
|
|
16
|
+
goog.declareModuleId('Blockly.Block');
|
|
17
|
+
|
|
18
|
+
// Unused import preserved for side-effects. Remove if unneeded.
|
|
19
|
+
import './events/events_block_change.js';
|
|
20
|
+
// Unused import preserved for side-effects. Remove if unneeded.
|
|
21
|
+
import './events/events_block_create.js';
|
|
22
|
+
// Unused import preserved for side-effects. Remove if unneeded.
|
|
23
|
+
import './events/events_block_delete.js';
|
|
24
|
+
|
|
25
|
+
import {Blocks} from './blocks.js';
|
|
26
|
+
import type {Comment} from './comment.js';
|
|
27
|
+
import * as common from './common.js';
|
|
28
|
+
import {Connection} from './connection.js';
|
|
29
|
+
import {ConnectionType} from './connection_type.js';
|
|
30
|
+
import * as constants from './constants.js';
|
|
31
|
+
import type {Abstract} from './events/events_abstract.js';
|
|
32
|
+
import type {BlockMove} from './events/events_block_move.js';
|
|
33
|
+
import * as eventUtils from './events/utils.js';
|
|
34
|
+
import * as Extensions from './extensions.js';
|
|
35
|
+
import type {Field} from './field.js';
|
|
36
|
+
import * as fieldRegistry from './field_registry.js';
|
|
37
|
+
import {Align, Input} from './input.js';
|
|
38
|
+
import {inputTypes} from './input_types.js';
|
|
39
|
+
import type {IASTNodeLocation} from './interfaces/i_ast_node_location.js';
|
|
40
|
+
import type {IDeletable} from './interfaces/i_deletable.js';
|
|
41
|
+
import {ASTNode} from './keyboard_nav/ast_node.js';
|
|
42
|
+
import type {Mutator} from './mutator.js';
|
|
43
|
+
import * as Tooltip from './tooltip.js';
|
|
44
|
+
import * as arrayUtils from './utils/array.js';
|
|
45
|
+
import {Coordinate} from './utils/coordinate.js';
|
|
46
|
+
import * as idGenerator from './utils/idgenerator.js';
|
|
47
|
+
import * as parsing from './utils/parsing.js';
|
|
48
|
+
import {Size} from './utils/size.js';
|
|
49
|
+
import type {VariableModel} from './variable_model.js';
|
|
50
|
+
import type {Workspace} from './workspace.js';
|
|
62
51
|
|
|
63
52
|
|
|
64
53
|
/**
|
|
65
54
|
* Class for one block.
|
|
66
55
|
* Not normally called directly, workspace.newBlock() is preferred.
|
|
67
|
-
* @implements {IASTNodeLocation}
|
|
68
|
-
* @implements {IDeletable}
|
|
69
56
|
* @unrestricted
|
|
70
57
|
* @alias Blockly.Block
|
|
71
58
|
*/
|
|
72
|
-
class Block {
|
|
59
|
+
export class Block implements IASTNodeLocation, IDeletable {
|
|
73
60
|
/**
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* @param {string=} opt_id Optional ID. Use this ID if provided, otherwise
|
|
78
|
-
* create a new ID.
|
|
79
|
-
* @throws When the prototypeName is not valid or not allowed.
|
|
61
|
+
* An optional callback method to use whenever the block's parent workspace
|
|
62
|
+
* changes. This is usually only called from the constructor, the block type
|
|
63
|
+
* initializer function, or an extension initializer function.
|
|
80
64
|
*/
|
|
81
|
-
|
|
82
|
-
const {Generator} = goog.module.get('Blockly.Generator');
|
|
83
|
-
if (Generator &&
|
|
84
|
-
typeof Generator.prototype[prototypeName] !== 'undefined') {
|
|
85
|
-
// Occluding Generator class members is not allowed.
|
|
86
|
-
throw Error(
|
|
87
|
-
'Block prototypeName "' + prototypeName +
|
|
88
|
-
'" conflicts with Blockly.Generator members.');
|
|
89
|
-
}
|
|
65
|
+
onchange?: ((p1: Abstract) => AnyDuringMigration)|null;
|
|
90
66
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
* Has no effect. May be used by 3rd parties for meta information.
|
|
94
|
-
* @type {?string}
|
|
95
|
-
*/
|
|
96
|
-
this.data = null;
|
|
67
|
+
/** The language-neutral ID given to the collapsed input. */
|
|
68
|
+
static readonly COLLAPSED_INPUT_NAME: string = constants.COLLAPSED_INPUT_NAME;
|
|
97
69
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
* @type {boolean}
|
|
101
|
-
* @package
|
|
102
|
-
*/
|
|
103
|
-
this.disposed = false;
|
|
70
|
+
/** The language-neutral ID given to the collapsed field. */
|
|
71
|
+
static readonly COLLAPSED_FIELD_NAME: string = constants.COLLAPSED_FIELD_NAME;
|
|
104
72
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
*/
|
|
111
|
-
this.hue_ = null;
|
|
73
|
+
/**
|
|
74
|
+
* Optional text data that round-trips between blocks and XML.
|
|
75
|
+
* Has no effect. May be used by 3rd parties for meta information.
|
|
76
|
+
*/
|
|
77
|
+
data: string|null = null;
|
|
112
78
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
this.colour_ = '#000000';
|
|
79
|
+
/**
|
|
80
|
+
* Has this block been disposed of?
|
|
81
|
+
* @internal
|
|
82
|
+
*/
|
|
83
|
+
disposed = false;
|
|
119
84
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
this.styleName_ = '';
|
|
85
|
+
/**
|
|
86
|
+
* Colour of the block as HSV hue value (0-360)
|
|
87
|
+
* This may be null if the block colour was not set via a hue number.
|
|
88
|
+
*/
|
|
89
|
+
private hue_: number|null = null;
|
|
126
90
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
* @type {undefined|?function()}
|
|
130
|
-
*/
|
|
131
|
-
this.init = undefined;
|
|
91
|
+
/** Colour of the block in '#RRGGBB' format. */
|
|
92
|
+
protected colour_ = '#000000';
|
|
132
93
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
* mutation state to XML. This must be coupled with defining
|
|
136
|
-
* `domToMutation`.
|
|
137
|
-
* @type {undefined|?function(...):!Element}
|
|
138
|
-
*/
|
|
139
|
-
this.mutationToDom = undefined;
|
|
94
|
+
/** Name of the block style. */
|
|
95
|
+
protected styleName_ = '';
|
|
140
96
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
* mutation state from XML. This must be coupled with defining
|
|
144
|
-
* `mutationToDom`.
|
|
145
|
-
* @type {undefined|?function(!Element)}
|
|
146
|
-
*/
|
|
147
|
-
this.domToMutation = undefined;
|
|
97
|
+
/** An optional method called during initialization. */
|
|
98
|
+
init?: (() => AnyDuringMigration)|null = undefined;
|
|
148
99
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
this.saveExtraState = undefined;
|
|
100
|
+
/**
|
|
101
|
+
* An optional serialization method for defining how to serialize the
|
|
102
|
+
* mutation state to XML. This must be coupled with defining
|
|
103
|
+
* `domToMutation`.
|
|
104
|
+
*/
|
|
105
|
+
mutationToDom?: ((...p1: AnyDuringMigration[]) => Element)|null = undefined;
|
|
156
106
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
this.loadExtraState = undefined;
|
|
107
|
+
/**
|
|
108
|
+
* An optional deserialization method for defining how to deserialize the
|
|
109
|
+
* mutation state from XML. This must be coupled with defining
|
|
110
|
+
* `mutationToDom`.
|
|
111
|
+
*/
|
|
112
|
+
domToMutation?: ((p1: Element) => AnyDuringMigration)|null = undefined;
|
|
164
113
|
|
|
114
|
+
/**
|
|
115
|
+
* An optional serialization method for defining how to serialize the
|
|
116
|
+
* block's extra state (eg mutation state) to something JSON compatible.
|
|
117
|
+
* This must be coupled with defining `loadExtraState`.
|
|
118
|
+
*/
|
|
119
|
+
saveExtraState?: (() => AnyDuringMigration)|null = undefined;
|
|
165
120
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
121
|
+
/**
|
|
122
|
+
* An optional serialization method for defining how to deserialize the
|
|
123
|
+
* block's extra state (eg mutation state) from something JSON compatible.
|
|
124
|
+
* This must be coupled with defining `saveExtraState`.
|
|
125
|
+
*/
|
|
126
|
+
loadExtraState?:
|
|
127
|
+
((p1: AnyDuringMigration) => AnyDuringMigration)|null = undefined;
|
|
172
128
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
* @type {undefined|?function():!Array<string>}
|
|
179
|
-
*/
|
|
180
|
-
this.getDeveloperVariables = undefined;
|
|
129
|
+
/**
|
|
130
|
+
* An optional property for suppressing adding STATEMENT_PREFIX and
|
|
131
|
+
* STATEMENT_SUFFIX to generated code.
|
|
132
|
+
*/
|
|
133
|
+
suppressPrefixSuffix: boolean|null = false;
|
|
181
134
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
/** @type {Connection} */
|
|
190
|
-
this.nextConnection = null;
|
|
191
|
-
/** @type {Connection} */
|
|
192
|
-
this.previousConnection = null;
|
|
193
|
-
/** @type {!Array<!Input>} */
|
|
194
|
-
this.inputList = [];
|
|
195
|
-
/** @type {boolean|undefined} */
|
|
196
|
-
this.inputsInline = undefined;
|
|
197
|
-
/**
|
|
198
|
-
* @type {boolean}
|
|
199
|
-
* @private
|
|
200
|
-
*/
|
|
201
|
-
this.disabled = false;
|
|
202
|
-
/** @type {!Tooltip.TipInfo} */
|
|
203
|
-
this.tooltip = '';
|
|
204
|
-
/** @type {boolean} */
|
|
205
|
-
this.contextMenu = true;
|
|
135
|
+
/**
|
|
136
|
+
* An optional property for declaring developer variables. Return a list of
|
|
137
|
+
* variable names for use by generators. Developer variables are never
|
|
138
|
+
* shown to the user, but are declared as global variables in the generated
|
|
139
|
+
* code.
|
|
140
|
+
*/
|
|
141
|
+
getDeveloperVariables?: (() => string[]) = undefined;
|
|
206
142
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
143
|
+
/**
|
|
144
|
+
* An optional function that reconfigures the block based on the contents of
|
|
145
|
+
* the mutator dialog.
|
|
146
|
+
*/
|
|
147
|
+
compose?: ((p1: Block) => void) = undefined;
|
|
212
148
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
149
|
+
/**
|
|
150
|
+
* An optional function that populates the mutator's dialog with
|
|
151
|
+
* this block's components.
|
|
152
|
+
*/
|
|
153
|
+
decompose?: ((p1: Workspace) => Block) = undefined;
|
|
154
|
+
id: string;
|
|
155
|
+
// AnyDuringMigration because: Type 'null' is not assignable to type
|
|
156
|
+
// 'Connection'.
|
|
157
|
+
outputConnection: Connection = null as AnyDuringMigration;
|
|
158
|
+
// AnyDuringMigration because: Type 'null' is not assignable to type
|
|
159
|
+
// 'Connection'.
|
|
160
|
+
nextConnection: Connection = null as AnyDuringMigration;
|
|
161
|
+
// AnyDuringMigration because: Type 'null' is not assignable to type
|
|
162
|
+
// 'Connection'.
|
|
163
|
+
previousConnection: Connection = null as AnyDuringMigration;
|
|
164
|
+
inputList: Input[] = [];
|
|
165
|
+
inputsInline?: boolean = undefined;
|
|
166
|
+
private disabled = false;
|
|
167
|
+
tooltip: Tooltip.TipInfo = '';
|
|
168
|
+
contextMenu = true;
|
|
218
169
|
|
|
219
|
-
|
|
220
|
-
* @type {boolean}
|
|
221
|
-
* @private
|
|
222
|
-
*/
|
|
223
|
-
this.deletable_ = true;
|
|
170
|
+
protected parentBlock_: this|null = null;
|
|
224
171
|
|
|
225
|
-
|
|
226
|
-
* @type {boolean}
|
|
227
|
-
* @private
|
|
228
|
-
*/
|
|
229
|
-
this.movable_ = true;
|
|
172
|
+
protected childBlocks_: this[] = [];
|
|
230
173
|
|
|
231
|
-
|
|
232
|
-
* @type {boolean}
|
|
233
|
-
* @private
|
|
234
|
-
*/
|
|
235
|
-
this.editable_ = true;
|
|
174
|
+
private deletable_ = true;
|
|
236
175
|
|
|
237
|
-
|
|
238
|
-
* @type {boolean}
|
|
239
|
-
* @private
|
|
240
|
-
*/
|
|
241
|
-
this.isShadow_ = false;
|
|
176
|
+
private movable_ = true;
|
|
242
177
|
|
|
243
|
-
|
|
244
|
-
* @type {boolean}
|
|
245
|
-
* @protected
|
|
246
|
-
*/
|
|
247
|
-
this.collapsed_ = false;
|
|
178
|
+
private editable_ = true;
|
|
248
179
|
|
|
249
|
-
|
|
250
|
-
* @type {?number}
|
|
251
|
-
* @protected
|
|
252
|
-
*/
|
|
253
|
-
this.outputShape_ = null;
|
|
180
|
+
private isShadow_ = false;
|
|
254
181
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
* @type {string|Comment}
|
|
258
|
-
* @deprecated August 2019. Use getCommentText instead.
|
|
259
|
-
*/
|
|
260
|
-
this.comment = null;
|
|
182
|
+
protected collapsed_ = false;
|
|
183
|
+
protected outputShape_: number|null = null;
|
|
261
184
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
185
|
+
/**
|
|
186
|
+
* A string representing the comment attached to this block.
|
|
187
|
+
* @deprecated August 2019. Use getCommentText instead.
|
|
188
|
+
*/
|
|
189
|
+
comment: string|Comment|null = null;
|
|
190
|
+
/** @internal */
|
|
191
|
+
commentModel: CommentModel;
|
|
192
|
+
private readonly xy_: Coordinate;
|
|
193
|
+
isInFlyout: boolean;
|
|
194
|
+
isInMutator: boolean;
|
|
195
|
+
RTL: boolean;
|
|
268
196
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
* origin; scale does not change this value.
|
|
272
|
-
* @type {!Coordinate}
|
|
273
|
-
* @private
|
|
274
|
-
*/
|
|
275
|
-
this.xy_ = new Coordinate(0, 0);
|
|
197
|
+
/** True if this block is an insertion marker. */
|
|
198
|
+
protected isInsertionMarker_ = false;
|
|
276
199
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
/** @type {boolean} */
|
|
280
|
-
this.isInFlyout = workspace.isFlyout;
|
|
281
|
-
/** @type {boolean} */
|
|
282
|
-
this.isInMutator = workspace.isMutator;
|
|
200
|
+
/** Name of the type of hat. */
|
|
201
|
+
hat?: string = undefined;
|
|
283
202
|
|
|
284
|
-
|
|
285
|
-
this.RTL = workspace.RTL;
|
|
203
|
+
rendered: boolean|null = null;
|
|
286
204
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
205
|
+
/**
|
|
206
|
+
* String for block help, or function that returns a URL. Null for no help.
|
|
207
|
+
*/
|
|
208
|
+
// AnyDuringMigration because: Type 'null' is not assignable to type 'string
|
|
209
|
+
// | Function'.
|
|
210
|
+
helpUrl: string|Function = null as AnyDuringMigration;
|
|
293
211
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
* @type {string|undefined}
|
|
297
|
-
*/
|
|
298
|
-
this.hat = undefined;
|
|
212
|
+
/** A bound callback function to use when the parent workspace changes. */
|
|
213
|
+
private onchangeWrapper_: ((p1: Abstract) => AnyDuringMigration)|null = null;
|
|
299
214
|
|
|
300
|
-
|
|
301
|
-
|
|
215
|
+
/**
|
|
216
|
+
* A count of statement inputs on the block.
|
|
217
|
+
* @internal
|
|
218
|
+
*/
|
|
219
|
+
statementInputCount = 0;
|
|
220
|
+
// TODO(b/109816955): remove '!', see go/strict-prop-init-fix.
|
|
221
|
+
type!: string;
|
|
222
|
+
// Record initial inline state.
|
|
223
|
+
inputsInlineDefault?: boolean;
|
|
224
|
+
workspace: Workspace;
|
|
302
225
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
226
|
+
/**
|
|
227
|
+
* @param workspace The block's workspace.
|
|
228
|
+
* @param prototypeName Name of the language object containing type-specific
|
|
229
|
+
* functions for this block.
|
|
230
|
+
* @param opt_id Optional ID. Use this ID if provided, otherwise create a new
|
|
231
|
+
* ID.
|
|
232
|
+
* @throws When the prototypeName is not valid or not allowed.
|
|
233
|
+
*/
|
|
234
|
+
constructor(workspace: Workspace, prototypeName: string, opt_id?: string) {
|
|
235
|
+
this.workspace = workspace;
|
|
308
236
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
this.
|
|
237
|
+
this.id = opt_id && !workspace.getBlockById(opt_id) ? opt_id :
|
|
238
|
+
idGenerator.genUid();
|
|
239
|
+
workspace.setBlockById(this.id, this);
|
|
240
|
+
|
|
241
|
+
/** A model of the comment attached to this block. */
|
|
242
|
+
this.commentModel = {text: null, pinned: false, size: new Size(160, 80)};
|
|
315
243
|
|
|
316
244
|
/**
|
|
317
|
-
*
|
|
318
|
-
*
|
|
319
|
-
* @package
|
|
245
|
+
* The block's position in workspace units. (0, 0) is at the workspace's
|
|
246
|
+
* origin; scale does not change this value.
|
|
320
247
|
*/
|
|
321
|
-
this.
|
|
248
|
+
this.xy_ = new Coordinate(0, 0);
|
|
249
|
+
this.isInFlyout = workspace.isFlyout;
|
|
250
|
+
this.isInMutator = workspace.isMutator;
|
|
251
|
+
|
|
252
|
+
this.RTL = workspace.RTL;
|
|
322
253
|
|
|
323
254
|
// Copy the type-specific functions and data from the prototype.
|
|
324
255
|
if (prototypeName) {
|
|
325
|
-
/** @type {string} */
|
|
326
256
|
this.type = prototypeName;
|
|
327
257
|
const prototype = Blocks[prototypeName];
|
|
328
258
|
if (!prototype || typeof prototype !== 'object') {
|
|
329
259
|
throw TypeError('Invalid block definition for type: ' + prototypeName);
|
|
330
260
|
}
|
|
331
|
-
|
|
261
|
+
Object.assign(this, prototype);
|
|
332
262
|
}
|
|
333
263
|
|
|
334
264
|
workspace.addTopBlock(this);
|
|
335
265
|
workspace.addTypedBlock(this);
|
|
336
266
|
|
|
337
|
-
if (new.target === Block)
|
|
267
|
+
if (new.target === Block) {
|
|
268
|
+
this.doInit_();
|
|
269
|
+
}
|
|
338
270
|
}
|
|
339
271
|
|
|
340
|
-
/**
|
|
341
|
-
|
|
342
|
-
* @protected
|
|
343
|
-
*/
|
|
344
|
-
doInit_() {
|
|
272
|
+
/** Calls the init() function and handles associated event firing, etc. */
|
|
273
|
+
protected doInit_() {
|
|
345
274
|
// All events fired should be part of the same group.
|
|
346
275
|
// Any events fired during init should not be undoable,
|
|
347
276
|
// so that block creation is atomic.
|
|
@@ -361,7 +290,7 @@ class Block {
|
|
|
361
290
|
|
|
362
291
|
// Fire a create event.
|
|
363
292
|
if (eventUtils.isEnabled()) {
|
|
364
|
-
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CREATE))(this));
|
|
293
|
+
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CREATE))!(this));
|
|
365
294
|
}
|
|
366
295
|
} finally {
|
|
367
296
|
if (!existingGroup) {
|
|
@@ -370,9 +299,6 @@ class Block {
|
|
|
370
299
|
// In case init threw, recordUndo flag should still be reset.
|
|
371
300
|
eventUtils.setRecordUndo(initialUndoFlag);
|
|
372
301
|
}
|
|
373
|
-
|
|
374
|
-
// Record initial inline state.
|
|
375
|
-
/** @type {boolean|undefined} */
|
|
376
302
|
this.inputsInlineDefault = this.inputsInline;
|
|
377
303
|
|
|
378
304
|
// Bind an onchange function, if it exists.
|
|
@@ -383,14 +309,13 @@ class Block {
|
|
|
383
309
|
|
|
384
310
|
/**
|
|
385
311
|
* Dispose of this block.
|
|
386
|
-
* @param
|
|
387
|
-
*
|
|
388
|
-
*
|
|
389
|
-
* @param {boolean=} _animate If true, show a disposal animation and sound.
|
|
312
|
+
* @param healStack If true, then try to heal any gap by connecting the next
|
|
313
|
+
* statement with the previous statement. Otherwise, dispose of all
|
|
314
|
+
* children of this block.
|
|
390
315
|
* @suppress {checkTypes}
|
|
391
316
|
*/
|
|
392
|
-
dispose(healStack
|
|
393
|
-
if (
|
|
317
|
+
dispose(healStack: boolean) {
|
|
318
|
+
if (this.disposed) {
|
|
394
319
|
// Already deleted.
|
|
395
320
|
return;
|
|
396
321
|
}
|
|
@@ -401,28 +326,17 @@ class Block {
|
|
|
401
326
|
|
|
402
327
|
this.unplug(healStack);
|
|
403
328
|
if (eventUtils.isEnabled()) {
|
|
404
|
-
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_DELETE))(this));
|
|
329
|
+
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_DELETE))!(this));
|
|
405
330
|
}
|
|
406
331
|
eventUtils.disable();
|
|
407
332
|
|
|
408
333
|
try {
|
|
409
334
|
// This block is now at the top of the workspace.
|
|
410
335
|
// Remove this block from the workspace's list of top-most blocks.
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
this.workspace.removeBlockById(this.id);
|
|
416
|
-
this.workspace = null;
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
// Just deleting this block from the DOM would result in a memory leak as
|
|
420
|
-
// well as corruption of the connection database. Therefore we must
|
|
421
|
-
// methodically step through the blocks and carefully disassemble them.
|
|
422
|
-
|
|
423
|
-
if (common.getSelected() === this) {
|
|
424
|
-
common.setSelected(null);
|
|
425
|
-
}
|
|
336
|
+
this.workspace.removeTopBlock(this);
|
|
337
|
+
this.workspace.removeTypedBlock(this);
|
|
338
|
+
// Remove from block database.
|
|
339
|
+
this.workspace.removeBlockById(this.id);
|
|
426
340
|
|
|
427
341
|
// First, dispose of all my children.
|
|
428
342
|
for (let i = this.childBlocks_.length - 1; i >= 0; i--) {
|
|
@@ -430,13 +344,13 @@ class Block {
|
|
|
430
344
|
}
|
|
431
345
|
// Then dispose of myself.
|
|
432
346
|
// Dispose of all inputs and their fields.
|
|
433
|
-
for (let i = 0, input;
|
|
347
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
434
348
|
input.dispose();
|
|
435
349
|
}
|
|
436
350
|
this.inputList.length = 0;
|
|
437
351
|
// Dispose of any remaining connections (next/previous/output).
|
|
438
352
|
const connections = this.getConnections_(true);
|
|
439
|
-
for (let i = 0, connection;
|
|
353
|
+
for (let i = 0, connection; connection = connections[i]; i++) {
|
|
440
354
|
connection.dispose();
|
|
441
355
|
}
|
|
442
356
|
} finally {
|
|
@@ -452,11 +366,10 @@ class Block {
|
|
|
452
366
|
* before the first interaction with it. Interactions include UI actions
|
|
453
367
|
* (e.g. clicking and dragging) and firing events (e.g. create, delete, and
|
|
454
368
|
* change).
|
|
455
|
-
* @public
|
|
456
369
|
*/
|
|
457
370
|
initModel() {
|
|
458
|
-
for (let i = 0, input;
|
|
459
|
-
for (let j = 0, field;
|
|
371
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
372
|
+
for (let j = 0, field; field = input.fieldRow[j]; j++) {
|
|
460
373
|
if (field.initModel) {
|
|
461
374
|
field.initModel();
|
|
462
375
|
}
|
|
@@ -467,10 +380,10 @@ class Block {
|
|
|
467
380
|
/**
|
|
468
381
|
* Unplug this block from its superior block. If this block is a statement,
|
|
469
382
|
* optionally reconnect the block underneath with the block on top.
|
|
470
|
-
* @param
|
|
471
|
-
*
|
|
383
|
+
* @param opt_healStack Disconnect child statement and reconnect stack.
|
|
384
|
+
* Defaults to false.
|
|
472
385
|
*/
|
|
473
|
-
unplug(opt_healStack) {
|
|
386
|
+
unplug(opt_healStack?: boolean) {
|
|
474
387
|
if (this.outputConnection) {
|
|
475
388
|
this.unplugFromRow_(opt_healStack);
|
|
476
389
|
}
|
|
@@ -482,11 +395,10 @@ class Block {
|
|
|
482
395
|
/**
|
|
483
396
|
* Unplug this block's output from an input on another block. Optionally
|
|
484
397
|
* reconnect the block's parent to the only child block, if possible.
|
|
485
|
-
* @param
|
|
486
|
-
*
|
|
487
|
-
* @private
|
|
398
|
+
* @param opt_healStack Disconnect right-side block and connect to left-side
|
|
399
|
+
* block. Defaults to false.
|
|
488
400
|
*/
|
|
489
|
-
unplugFromRow_(opt_healStack) {
|
|
401
|
+
private unplugFromRow_(opt_healStack?: boolean) {
|
|
490
402
|
let parentConnection = null;
|
|
491
403
|
if (this.outputConnection.isConnected()) {
|
|
492
404
|
parentConnection = this.outputConnection.targetConnection;
|
|
@@ -501,7 +413,7 @@ class Block {
|
|
|
501
413
|
|
|
502
414
|
const thisConnection = this.getOnlyValueConnection_();
|
|
503
415
|
if (!thisConnection || !thisConnection.isConnected() ||
|
|
504
|
-
thisConnection.targetBlock()
|
|
416
|
+
thisConnection.targetBlock()!.isShadow()) {
|
|
505
417
|
// Too many or too few possible connections on this block, or there's
|
|
506
418
|
// nothing on the other side of this connection.
|
|
507
419
|
return;
|
|
@@ -509,13 +421,13 @@ class Block {
|
|
|
509
421
|
|
|
510
422
|
const childConnection = thisConnection.targetConnection;
|
|
511
423
|
// Disconnect the child block.
|
|
512
|
-
childConnection
|
|
424
|
+
childConnection?.disconnect();
|
|
513
425
|
// Connect child to the parent if possible, otherwise bump away.
|
|
514
426
|
if (this.workspace.connectionChecker.canConnect(
|
|
515
427
|
childConnection, parentConnection, false)) {
|
|
516
|
-
parentConnection.connect(childConnection);
|
|
428
|
+
parentConnection.connect(childConnection!);
|
|
517
429
|
} else {
|
|
518
|
-
childConnection
|
|
430
|
+
childConnection?.onFailedConnect(parentConnection);
|
|
519
431
|
}
|
|
520
432
|
}
|
|
521
433
|
|
|
@@ -526,10 +438,9 @@ class Block {
|
|
|
526
438
|
* Since only one block can be displaced and attached to the insertion marker
|
|
527
439
|
* this should only ever return one connection.
|
|
528
440
|
*
|
|
529
|
-
* @return
|
|
530
|
-
* @private
|
|
441
|
+
* @return The connection on the value input, or null.
|
|
531
442
|
*/
|
|
532
|
-
getOnlyValueConnection_() {
|
|
443
|
+
private getOnlyValueConnection_(): Connection|null {
|
|
533
444
|
let connection = null;
|
|
534
445
|
for (let i = 0; i < this.inputList.length; i++) {
|
|
535
446
|
const thisConnection = this.inputList[i].connection;
|
|
@@ -548,11 +459,10 @@ class Block {
|
|
|
548
459
|
/**
|
|
549
460
|
* Unplug this statement block from its superior block. Optionally reconnect
|
|
550
461
|
* the block underneath with the block on top.
|
|
551
|
-
* @param
|
|
552
|
-
*
|
|
553
|
-
* @private
|
|
462
|
+
* @param opt_healStack Disconnect child statement and reconnect stack.
|
|
463
|
+
* Defaults to false.
|
|
554
464
|
*/
|
|
555
|
-
unplugFromStack_(opt_healStack) {
|
|
465
|
+
private unplugFromStack_(opt_healStack?: boolean) {
|
|
556
466
|
let previousTarget = null;
|
|
557
467
|
if (this.previousConnection.isConnected()) {
|
|
558
468
|
// Remember the connection that any next statements need to connect to.
|
|
@@ -564,23 +474,23 @@ class Block {
|
|
|
564
474
|
if (opt_healStack && nextBlock && !nextBlock.isShadow()) {
|
|
565
475
|
// Disconnect the next statement.
|
|
566
476
|
const nextTarget = this.nextConnection.targetConnection;
|
|
567
|
-
nextTarget
|
|
477
|
+
nextTarget?.disconnect();
|
|
568
478
|
if (previousTarget &&
|
|
569
479
|
this.workspace.connectionChecker.canConnect(
|
|
570
480
|
previousTarget, nextTarget, false)) {
|
|
571
481
|
// Attach the next statement to the previous statement.
|
|
572
|
-
previousTarget.connect(nextTarget);
|
|
482
|
+
previousTarget.connect(nextTarget!);
|
|
573
483
|
}
|
|
574
484
|
}
|
|
575
485
|
}
|
|
576
486
|
|
|
577
487
|
/**
|
|
578
488
|
* Returns all connections originating from this block.
|
|
579
|
-
* @param
|
|
580
|
-
* @return
|
|
581
|
-
* @
|
|
489
|
+
* @param _all If true, return all connections even hidden ones.
|
|
490
|
+
* @return Array of connections.
|
|
491
|
+
* @internal
|
|
582
492
|
*/
|
|
583
|
-
getConnections_(_all) {
|
|
493
|
+
getConnections_(_all: boolean): Connection[] {
|
|
584
494
|
const myConnections = [];
|
|
585
495
|
if (this.outputConnection) {
|
|
586
496
|
myConnections.push(this.outputConnection);
|
|
@@ -591,7 +501,7 @@ class Block {
|
|
|
591
501
|
if (this.nextConnection) {
|
|
592
502
|
myConnections.push(this.nextConnection);
|
|
593
503
|
}
|
|
594
|
-
for (let i = 0, input;
|
|
504
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
595
505
|
if (input.connection) {
|
|
596
506
|
myConnections.push(input.connection);
|
|
597
507
|
}
|
|
@@ -602,17 +512,17 @@ class Block {
|
|
|
602
512
|
/**
|
|
603
513
|
* Walks down a stack of blocks and finds the last next connection on the
|
|
604
514
|
* stack.
|
|
605
|
-
* @param
|
|
606
|
-
*
|
|
607
|
-
*
|
|
608
|
-
* @return
|
|
609
|
-
* @
|
|
515
|
+
* @param ignoreShadows If true,the last connection on a non-shadow block will
|
|
516
|
+
* be returned. If false, this will follow shadows to find the last
|
|
517
|
+
* connection.
|
|
518
|
+
* @return The last next connection on the stack, or null.
|
|
519
|
+
* @internal
|
|
610
520
|
*/
|
|
611
|
-
lastConnectionInStack(ignoreShadows) {
|
|
521
|
+
lastConnectionInStack(ignoreShadows: boolean): Connection|null {
|
|
612
522
|
let nextConnection = this.nextConnection;
|
|
613
523
|
while (nextConnection) {
|
|
614
524
|
const nextBlock = nextConnection.targetBlock();
|
|
615
|
-
if (!nextBlock ||
|
|
525
|
+
if (!nextBlock || ignoreShadows && nextBlock.isShadow()) {
|
|
616
526
|
return nextConnection;
|
|
617
527
|
}
|
|
618
528
|
nextConnection = nextBlock.nextConnection;
|
|
@@ -624,29 +534,27 @@ class Block {
|
|
|
624
534
|
* Bump unconnected blocks out of alignment. Two blocks which aren't actually
|
|
625
535
|
* connected should not coincidentally line up on screen.
|
|
626
536
|
*/
|
|
627
|
-
bumpNeighbours() {
|
|
628
|
-
|
|
629
|
-
}
|
|
537
|
+
bumpNeighbours() {}
|
|
538
|
+
// noop.
|
|
630
539
|
|
|
631
540
|
/**
|
|
632
541
|
* Return the parent block or null if this block is at the top level. The
|
|
633
542
|
* parent block is either the block connected to the previous connection (for
|
|
634
543
|
* a statement block) or the block connected to the output connection (for a
|
|
635
544
|
* value block).
|
|
636
|
-
* @return
|
|
545
|
+
* @return The block (if any) that holds the current block.
|
|
637
546
|
*/
|
|
638
|
-
getParent() {
|
|
547
|
+
getParent(): this|null {
|
|
639
548
|
return this.parentBlock_;
|
|
640
549
|
}
|
|
641
550
|
|
|
642
551
|
/**
|
|
643
552
|
* Return the input that connects to the specified block.
|
|
644
|
-
* @param
|
|
645
|
-
* @return
|
|
646
|
-
* block.
|
|
553
|
+
* @param block A block connected to an input on this block.
|
|
554
|
+
* @return The input (if any) that connects to the specified block.
|
|
647
555
|
*/
|
|
648
|
-
getInputWithBlock(block) {
|
|
649
|
-
for (let i = 0, input;
|
|
556
|
+
getInputWithBlock(block: Block): Input|null {
|
|
557
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
650
558
|
if (input.connection && input.connection.targetBlock() === block) {
|
|
651
559
|
return input;
|
|
652
560
|
}
|
|
@@ -659,14 +567,16 @@ class Block {
|
|
|
659
567
|
* block has no surrounding block. A parent block might just be the previous
|
|
660
568
|
* statement, whereas the surrounding block is an if statement, while loop,
|
|
661
569
|
* etc.
|
|
662
|
-
* @return
|
|
570
|
+
* @return The block (if any) that surrounds the current block.
|
|
663
571
|
*/
|
|
664
|
-
getSurroundParent() {
|
|
572
|
+
getSurroundParent(): this|null {
|
|
665
573
|
let block = this;
|
|
666
574
|
let prevBlock;
|
|
667
575
|
do {
|
|
668
576
|
prevBlock = block;
|
|
669
|
-
|
|
577
|
+
// AnyDuringMigration because: Type 'Block | null' is not assignable to
|
|
578
|
+
// type 'this'.
|
|
579
|
+
block = block.getParent() as AnyDuringMigration;
|
|
670
580
|
if (!block) {
|
|
671
581
|
// Ran off the top.
|
|
672
582
|
return null;
|
|
@@ -678,28 +588,28 @@ class Block {
|
|
|
678
588
|
|
|
679
589
|
/**
|
|
680
590
|
* Return the next statement block directly connected to this block.
|
|
681
|
-
* @return
|
|
591
|
+
* @return The next statement block or null.
|
|
682
592
|
*/
|
|
683
|
-
getNextBlock() {
|
|
593
|
+
getNextBlock(): Block|null {
|
|
684
594
|
return this.nextConnection && this.nextConnection.targetBlock();
|
|
685
595
|
}
|
|
686
596
|
|
|
687
597
|
/**
|
|
688
598
|
* Returns the block connected to the previous connection.
|
|
689
|
-
* @return
|
|
599
|
+
* @return The previous statement block or null.
|
|
690
600
|
*/
|
|
691
|
-
getPreviousBlock() {
|
|
601
|
+
getPreviousBlock(): Block|null {
|
|
692
602
|
return this.previousConnection && this.previousConnection.targetBlock();
|
|
693
603
|
}
|
|
694
604
|
|
|
695
605
|
/**
|
|
696
606
|
* Return the connection on the first statement input on this block, or null
|
|
697
607
|
* if there are none.
|
|
698
|
-
* @return
|
|
699
|
-
* @
|
|
608
|
+
* @return The first statement connection or null.
|
|
609
|
+
* @internal
|
|
700
610
|
*/
|
|
701
|
-
getFirstStatementConnection() {
|
|
702
|
-
for (let i = 0, input;
|
|
611
|
+
getFirstStatementConnection(): Connection|null {
|
|
612
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
703
613
|
if (input.connection &&
|
|
704
614
|
input.connection.type === ConnectionType.NEXT_STATEMENT) {
|
|
705
615
|
return input.connection;
|
|
@@ -711,11 +621,11 @@ class Block {
|
|
|
711
621
|
/**
|
|
712
622
|
* Return the top-most block in this block's tree.
|
|
713
623
|
* This will return itself if this block is at the top level.
|
|
714
|
-
* @return
|
|
624
|
+
* @return The root block.
|
|
715
625
|
*/
|
|
716
|
-
getRootBlock() {
|
|
717
|
-
let rootBlock;
|
|
718
|
-
let block = this;
|
|
626
|
+
getRootBlock(): this {
|
|
627
|
+
let rootBlock: this;
|
|
628
|
+
let block: this|null = this;
|
|
719
629
|
do {
|
|
720
630
|
rootBlock = block;
|
|
721
631
|
block = rootBlock.parentBlock_;
|
|
@@ -727,16 +637,18 @@ class Block {
|
|
|
727
637
|
* Walk up from the given block up through the stack of blocks to find
|
|
728
638
|
* the top block of the sub stack. If we are nested in a statement input only
|
|
729
639
|
* find the top-most nested block. Do not go all the way to the root block.
|
|
730
|
-
* @return
|
|
731
|
-
* @
|
|
640
|
+
* @return The top block in a stack.
|
|
641
|
+
* @internal
|
|
732
642
|
*/
|
|
733
|
-
getTopStackBlock() {
|
|
643
|
+
getTopStackBlock(): this {
|
|
734
644
|
let block = this;
|
|
735
645
|
let previous;
|
|
736
646
|
do {
|
|
737
647
|
previous = block.getPreviousBlock();
|
|
648
|
+
// AnyDuringMigration because: Type 'Block' is not assignable to type
|
|
649
|
+
// 'this'.
|
|
738
650
|
} while (previous && previous.getNextBlock() === block &&
|
|
739
|
-
(block = previous));
|
|
651
|
+
(block = previous as AnyDuringMigration));
|
|
740
652
|
return block;
|
|
741
653
|
}
|
|
742
654
|
|
|
@@ -745,15 +657,15 @@ class Block {
|
|
|
745
657
|
* Includes value and statement inputs, as well as any following statement.
|
|
746
658
|
* Excludes any connection on an output tab or any preceding statement.
|
|
747
659
|
* Blocks are optionally sorted by position; top to bottom.
|
|
748
|
-
* @param
|
|
749
|
-
* @return
|
|
660
|
+
* @param ordered Sort the list if true.
|
|
661
|
+
* @return Array of blocks.
|
|
750
662
|
*/
|
|
751
|
-
getChildren(ordered) {
|
|
663
|
+
getChildren(ordered: boolean): Block[] {
|
|
752
664
|
if (!ordered) {
|
|
753
665
|
return this.childBlocks_;
|
|
754
666
|
}
|
|
755
667
|
const blocks = [];
|
|
756
|
-
for (let i = 0, input;
|
|
668
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
757
669
|
if (input.connection) {
|
|
758
670
|
const child = input.connection.targetBlock();
|
|
759
671
|
if (child) {
|
|
@@ -770,10 +682,10 @@ class Block {
|
|
|
770
682
|
|
|
771
683
|
/**
|
|
772
684
|
* Set parent of this block to be a new block or null.
|
|
773
|
-
* @param
|
|
774
|
-
* @
|
|
685
|
+
* @param newParent New parent block.
|
|
686
|
+
* @internal
|
|
775
687
|
*/
|
|
776
|
-
setParent(newParent) {
|
|
688
|
+
setParent(newParent: this|null) {
|
|
777
689
|
if (newParent === this.parentBlock_) {
|
|
778
690
|
return;
|
|
779
691
|
}
|
|
@@ -781,8 +693,8 @@ class Block {
|
|
|
781
693
|
// Check that block is connected to new parent if new parent is not null and
|
|
782
694
|
// that block is not connected to superior one if new parent is null.
|
|
783
695
|
const targetBlock =
|
|
784
|
-
|
|
785
|
-
|
|
696
|
+
this.previousConnection && this.previousConnection.targetBlock() ||
|
|
697
|
+
this.outputConnection && this.outputConnection.targetBlock();
|
|
786
698
|
const isConnected = !!targetBlock;
|
|
787
699
|
|
|
788
700
|
if (isConnected && newParent && targetBlock !== newParent) {
|
|
@@ -795,13 +707,12 @@ class Block {
|
|
|
795
707
|
' superior block.');
|
|
796
708
|
}
|
|
797
709
|
|
|
710
|
+
// This block hasn't actually moved on-screen, so there's no need to
|
|
711
|
+
// update
|
|
712
|
+
// its connection locations.
|
|
798
713
|
if (this.parentBlock_) {
|
|
799
714
|
// Remove this block from the old parent's child list.
|
|
800
715
|
arrayUtils.removeElem(this.parentBlock_.childBlocks_, this);
|
|
801
|
-
|
|
802
|
-
// This block hasn't actually moved on-screen, so there's no need to
|
|
803
|
-
// update
|
|
804
|
-
// its connection locations.
|
|
805
716
|
} else {
|
|
806
717
|
// New parent must be non-null so remove this block from the workspace's
|
|
807
718
|
// list of top-most blocks.
|
|
@@ -823,49 +734,52 @@ class Block {
|
|
|
823
734
|
* Includes value and statement inputs, as well as any following statements.
|
|
824
735
|
* Excludes any connection on an output tab or any preceding statements.
|
|
825
736
|
* Blocks are optionally sorted by position; top to bottom.
|
|
826
|
-
* @param
|
|
827
|
-
* @return
|
|
737
|
+
* @param ordered Sort the list if true.
|
|
738
|
+
* @return Flattened array of blocks.
|
|
828
739
|
*/
|
|
829
|
-
getDescendants(ordered) {
|
|
740
|
+
getDescendants(ordered: boolean): this[] {
|
|
830
741
|
const blocks = [this];
|
|
831
742
|
const childBlocks = this.getChildren(ordered);
|
|
832
|
-
for (let child, i = 0;
|
|
833
|
-
|
|
743
|
+
for (let child, i = 0; child = childBlocks[i]; i++) {
|
|
744
|
+
// AnyDuringMigration because: Argument of type 'Block[]' is not
|
|
745
|
+
// assignable to parameter of type 'this[]'.
|
|
746
|
+
blocks.push.apply(
|
|
747
|
+
blocks, child.getDescendants(ordered) as AnyDuringMigration);
|
|
834
748
|
}
|
|
835
749
|
return blocks;
|
|
836
750
|
}
|
|
837
751
|
|
|
838
752
|
/**
|
|
839
753
|
* Get whether this block is deletable or not.
|
|
840
|
-
* @return
|
|
754
|
+
* @return True if deletable.
|
|
841
755
|
*/
|
|
842
|
-
isDeletable() {
|
|
843
|
-
return this.deletable_ && !this.isShadow_ &&
|
|
844
|
-
!
|
|
756
|
+
isDeletable(): boolean {
|
|
757
|
+
return this.deletable_ && !this.isShadow_ && !this.disposed &&
|
|
758
|
+
!this.workspace.options.readOnly;
|
|
845
759
|
}
|
|
846
760
|
|
|
847
761
|
/**
|
|
848
762
|
* Set whether this block is deletable or not.
|
|
849
|
-
* @param
|
|
763
|
+
* @param deletable True if deletable.
|
|
850
764
|
*/
|
|
851
|
-
setDeletable(deletable) {
|
|
765
|
+
setDeletable(deletable: boolean) {
|
|
852
766
|
this.deletable_ = deletable;
|
|
853
767
|
}
|
|
854
768
|
|
|
855
769
|
/**
|
|
856
770
|
* Get whether this block is movable or not.
|
|
857
|
-
* @return
|
|
771
|
+
* @return True if movable.
|
|
858
772
|
*/
|
|
859
|
-
isMovable() {
|
|
860
|
-
return this.movable_ && !this.isShadow_ &&
|
|
861
|
-
!
|
|
773
|
+
isMovable(): boolean {
|
|
774
|
+
return this.movable_ && !this.isShadow_ && !this.disposed &&
|
|
775
|
+
!this.workspace.options.readOnly;
|
|
862
776
|
}
|
|
863
777
|
|
|
864
778
|
/**
|
|
865
779
|
* Set whether this block is movable or not.
|
|
866
|
-
* @param
|
|
780
|
+
* @param movable True if movable.
|
|
867
781
|
*/
|
|
868
|
-
setMovable(movable) {
|
|
782
|
+
setMovable(movable: boolean) {
|
|
869
783
|
this.movable_ = movable;
|
|
870
784
|
}
|
|
871
785
|
|
|
@@ -874,9 +788,9 @@ class Block {
|
|
|
874
788
|
* descendants will put this block over the workspace's capacity this block is
|
|
875
789
|
* not duplicatable. If duplicating this block and descendants will put any
|
|
876
790
|
* type over their maxInstances this block is not duplicatable.
|
|
877
|
-
* @return
|
|
791
|
+
* @return True if duplicatable.
|
|
878
792
|
*/
|
|
879
|
-
isDuplicatable() {
|
|
793
|
+
isDuplicatable(): boolean {
|
|
880
794
|
if (!this.workspace.hasBlockLimits()) {
|
|
881
795
|
return true;
|
|
882
796
|
}
|
|
@@ -886,56 +800,55 @@ class Block {
|
|
|
886
800
|
|
|
887
801
|
/**
|
|
888
802
|
* Get whether this block is a shadow block or not.
|
|
889
|
-
* @return
|
|
803
|
+
* @return True if a shadow.
|
|
890
804
|
*/
|
|
891
|
-
isShadow() {
|
|
805
|
+
isShadow(): boolean {
|
|
892
806
|
return this.isShadow_;
|
|
893
807
|
}
|
|
894
808
|
|
|
895
809
|
/**
|
|
896
810
|
* Set whether this block is a shadow block or not.
|
|
897
|
-
* @param
|
|
898
|
-
* @
|
|
811
|
+
* @param shadow True if a shadow.
|
|
812
|
+
* @internal
|
|
899
813
|
*/
|
|
900
|
-
setShadow(shadow) {
|
|
814
|
+
setShadow(shadow: boolean) {
|
|
901
815
|
this.isShadow_ = shadow;
|
|
902
816
|
}
|
|
903
817
|
|
|
904
818
|
/**
|
|
905
819
|
* Get whether this block is an insertion marker block or not.
|
|
906
|
-
* @return
|
|
820
|
+
* @return True if an insertion marker.
|
|
907
821
|
*/
|
|
908
|
-
isInsertionMarker() {
|
|
822
|
+
isInsertionMarker(): boolean {
|
|
909
823
|
return this.isInsertionMarker_;
|
|
910
824
|
}
|
|
911
825
|
|
|
912
826
|
/**
|
|
913
827
|
* Set whether this block is an insertion marker block or not.
|
|
914
828
|
* Once set this cannot be unset.
|
|
915
|
-
* @param
|
|
916
|
-
* @
|
|
829
|
+
* @param insertionMarker True if an insertion marker.
|
|
830
|
+
* @internal
|
|
917
831
|
*/
|
|
918
|
-
setInsertionMarker(insertionMarker) {
|
|
832
|
+
setInsertionMarker(insertionMarker: boolean) {
|
|
919
833
|
this.isInsertionMarker_ = insertionMarker;
|
|
920
834
|
}
|
|
921
835
|
|
|
922
836
|
/**
|
|
923
837
|
* Get whether this block is editable or not.
|
|
924
|
-
* @return
|
|
838
|
+
* @return True if editable.
|
|
925
839
|
*/
|
|
926
|
-
isEditable() {
|
|
927
|
-
return this.editable_ &&
|
|
928
|
-
!(this.workspace && this.workspace.options.readOnly);
|
|
840
|
+
isEditable(): boolean {
|
|
841
|
+
return this.editable_ && !this.disposed && !this.workspace.options.readOnly;
|
|
929
842
|
}
|
|
930
843
|
|
|
931
844
|
/**
|
|
932
845
|
* Set whether this block is editable or not.
|
|
933
|
-
* @param
|
|
846
|
+
* @param editable True if editable.
|
|
934
847
|
*/
|
|
935
|
-
setEditable(editable) {
|
|
848
|
+
setEditable(editable: boolean) {
|
|
936
849
|
this.editable_ = editable;
|
|
937
|
-
for (let i = 0, input;
|
|
938
|
-
for (let j = 0, field;
|
|
850
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
851
|
+
for (let j = 0, field; field = input.fieldRow[j]; j++) {
|
|
939
852
|
field.updateEditable();
|
|
940
853
|
}
|
|
941
854
|
}
|
|
@@ -943,9 +856,9 @@ class Block {
|
|
|
943
856
|
|
|
944
857
|
/**
|
|
945
858
|
* Returns if this block has been disposed of / deleted.
|
|
946
|
-
* @return
|
|
859
|
+
* @return True if this block has been disposed of / deleted.
|
|
947
860
|
*/
|
|
948
|
-
isDisposed() {
|
|
861
|
+
isDisposed(): boolean {
|
|
949
862
|
return this.disposed;
|
|
950
863
|
}
|
|
951
864
|
|
|
@@ -953,12 +866,12 @@ class Block {
|
|
|
953
866
|
* Find the connection on this block that corresponds to the given connection
|
|
954
867
|
* on the other block.
|
|
955
868
|
* Used to match connections between a block and its insertion marker.
|
|
956
|
-
* @param
|
|
957
|
-
* @param
|
|
958
|
-
* @return
|
|
959
|
-
* @
|
|
869
|
+
* @param otherBlock The other block to match against.
|
|
870
|
+
* @param conn The other connection to match.
|
|
871
|
+
* @return The matching connection on this block, or null.
|
|
872
|
+
* @internal
|
|
960
873
|
*/
|
|
961
|
-
getMatchingConnection(otherBlock, conn) {
|
|
874
|
+
getMatchingConnection(otherBlock: Block, conn: Connection): Connection|null {
|
|
962
875
|
const connections = this.getConnections_(true);
|
|
963
876
|
const otherConnections = otherBlock.getConnections_(true);
|
|
964
877
|
if (connections.length !== otherConnections.length) {
|
|
@@ -974,61 +887,61 @@ class Block {
|
|
|
974
887
|
|
|
975
888
|
/**
|
|
976
889
|
* Set the URL of this block's help page.
|
|
977
|
-
* @param
|
|
978
|
-
*
|
|
890
|
+
* @param url URL string for block help, or function that returns a URL. Null
|
|
891
|
+
* for no help.
|
|
979
892
|
*/
|
|
980
|
-
setHelpUrl(url) {
|
|
893
|
+
setHelpUrl(url: string|Function) {
|
|
981
894
|
this.helpUrl = url;
|
|
982
895
|
}
|
|
983
896
|
|
|
984
897
|
/**
|
|
985
898
|
* Sets the tooltip for this block.
|
|
986
|
-
* @param
|
|
987
|
-
*
|
|
988
|
-
*
|
|
899
|
+
* @param newTip The text for the tooltip, a function that returns the text
|
|
900
|
+
* for the tooltip, or a parent object whose tooltip will be used. To not
|
|
901
|
+
* display a tooltip pass the empty string.
|
|
989
902
|
*/
|
|
990
|
-
setTooltip(newTip) {
|
|
903
|
+
setTooltip(newTip: Tooltip.TipInfo) {
|
|
991
904
|
this.tooltip = newTip;
|
|
992
905
|
}
|
|
993
906
|
|
|
994
907
|
/**
|
|
995
908
|
* Returns the tooltip text for this block.
|
|
996
|
-
* @return
|
|
909
|
+
* @return The tooltip text for this block.
|
|
997
910
|
*/
|
|
998
|
-
getTooltip() {
|
|
911
|
+
getTooltip(): string {
|
|
999
912
|
return Tooltip.getTooltipOfObject(this);
|
|
1000
913
|
}
|
|
1001
914
|
|
|
1002
915
|
/**
|
|
1003
916
|
* Get the colour of a block.
|
|
1004
|
-
* @return
|
|
917
|
+
* @return #RRGGBB string.
|
|
1005
918
|
*/
|
|
1006
|
-
getColour() {
|
|
919
|
+
getColour(): string {
|
|
1007
920
|
return this.colour_;
|
|
1008
921
|
}
|
|
1009
922
|
|
|
1010
923
|
/**
|
|
1011
924
|
* Get the name of the block style.
|
|
1012
|
-
* @return
|
|
925
|
+
* @return Name of the block style.
|
|
1013
926
|
*/
|
|
1014
|
-
getStyleName() {
|
|
927
|
+
getStyleName(): string {
|
|
1015
928
|
return this.styleName_;
|
|
1016
929
|
}
|
|
1017
930
|
|
|
1018
931
|
/**
|
|
1019
932
|
* Get the HSV hue value of a block. Null if hue not set.
|
|
1020
|
-
* @return
|
|
933
|
+
* @return Hue value (0-360).
|
|
1021
934
|
*/
|
|
1022
|
-
getHue() {
|
|
935
|
+
getHue(): number|null {
|
|
1023
936
|
return this.hue_;
|
|
1024
937
|
}
|
|
1025
938
|
|
|
1026
939
|
/**
|
|
1027
940
|
* Change the colour of a block.
|
|
1028
|
-
* @param
|
|
1029
|
-
*
|
|
941
|
+
* @param colour HSV hue value (0 to 360), #RRGGBB string, or a message
|
|
942
|
+
* reference string pointing to one of those two values.
|
|
1030
943
|
*/
|
|
1031
|
-
setColour(colour) {
|
|
944
|
+
setColour(colour: number|string) {
|
|
1032
945
|
const parsed = parsing.parseBlockColour(colour);
|
|
1033
946
|
this.hue_ = parsed.hue;
|
|
1034
947
|
this.colour_ = parsed.hex;
|
|
@@ -1036,9 +949,9 @@ class Block {
|
|
|
1036
949
|
|
|
1037
950
|
/**
|
|
1038
951
|
* Set the style and colour values of a block.
|
|
1039
|
-
* @param
|
|
952
|
+
* @param blockStyleName Name of the block style.
|
|
1040
953
|
*/
|
|
1041
|
-
setStyle(blockStyleName) {
|
|
954
|
+
setStyle(blockStyleName: string) {
|
|
1042
955
|
this.styleName_ = blockStyleName;
|
|
1043
956
|
}
|
|
1044
957
|
|
|
@@ -1047,11 +960,10 @@ class Block {
|
|
|
1047
960
|
* changes, replacing any prior onchange handler. This is usually only called
|
|
1048
961
|
* from the constructor, the block type initializer function, or an extension
|
|
1049
962
|
* initializer function.
|
|
1050
|
-
* @param
|
|
1051
|
-
* when the block's workspace changes.
|
|
963
|
+
* @param onchangeFn The callback to call when the block's workspace changes.
|
|
1052
964
|
* @throws {Error} if onchangeFn is not falsey and not a function.
|
|
1053
965
|
*/
|
|
1054
|
-
setOnChange(onchangeFn) {
|
|
966
|
+
setOnChange(onchangeFn: (p1: Abstract) => AnyDuringMigration) {
|
|
1055
967
|
if (onchangeFn && typeof onchangeFn !== 'function') {
|
|
1056
968
|
throw Error('onchange must be a function.');
|
|
1057
969
|
}
|
|
@@ -1059,18 +971,16 @@ class Block {
|
|
|
1059
971
|
this.workspace.removeChangeListener(this.onchangeWrapper_);
|
|
1060
972
|
}
|
|
1061
973
|
this.onchange = onchangeFn;
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
this.workspace.addChangeListener(this.onchangeWrapper_);
|
|
1065
|
-
}
|
|
974
|
+
this.onchangeWrapper_ = onchangeFn.bind(this);
|
|
975
|
+
this.workspace.addChangeListener(this.onchangeWrapper_);
|
|
1066
976
|
}
|
|
1067
977
|
|
|
1068
978
|
/**
|
|
1069
979
|
* Returns the named field from a block.
|
|
1070
|
-
* @param
|
|
1071
|
-
* @return
|
|
980
|
+
* @param name The name of the field.
|
|
981
|
+
* @return Named field, or null if field does not exist.
|
|
1072
982
|
*/
|
|
1073
|
-
getField(name) {
|
|
983
|
+
getField(name: string): Field|null {
|
|
1074
984
|
if (typeof name !== 'string') {
|
|
1075
985
|
throw TypeError(
|
|
1076
986
|
'Block.prototype.getField expects a string ' +
|
|
@@ -1078,8 +988,8 @@ class Block {
|
|
|
1078
988
|
(name === undefined ? 'nothing' : name + ' of type ' + typeof name) +
|
|
1079
989
|
' instead');
|
|
1080
990
|
}
|
|
1081
|
-
for (let i = 0, input;
|
|
1082
|
-
for (let j = 0, field;
|
|
991
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
992
|
+
for (let j = 0, field; field = input.fieldRow[j]; j++) {
|
|
1083
993
|
if (field.name === name) {
|
|
1084
994
|
return field;
|
|
1085
995
|
}
|
|
@@ -1090,12 +1000,12 @@ class Block {
|
|
|
1090
1000
|
|
|
1091
1001
|
/**
|
|
1092
1002
|
* Return all variables referenced by this block.
|
|
1093
|
-
* @return
|
|
1003
|
+
* @return List of variable ids.
|
|
1094
1004
|
*/
|
|
1095
|
-
getVars() {
|
|
1005
|
+
getVars(): string[] {
|
|
1096
1006
|
const vars = [];
|
|
1097
|
-
for (let i = 0, input;
|
|
1098
|
-
for (let j = 0, field;
|
|
1007
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
1008
|
+
for (let j = 0, field; field = input.fieldRow[j]; j++) {
|
|
1099
1009
|
if (field.referencesVariables()) {
|
|
1100
1010
|
vars.push(field.getValue());
|
|
1101
1011
|
}
|
|
@@ -1106,16 +1016,16 @@ class Block {
|
|
|
1106
1016
|
|
|
1107
1017
|
/**
|
|
1108
1018
|
* Return all variables referenced by this block.
|
|
1109
|
-
* @return
|
|
1110
|
-
* @
|
|
1019
|
+
* @return List of variable models.
|
|
1020
|
+
* @internal
|
|
1111
1021
|
*/
|
|
1112
|
-
getVarModels() {
|
|
1022
|
+
getVarModels(): VariableModel[] {
|
|
1113
1023
|
const vars = [];
|
|
1114
|
-
for (let i = 0, input;
|
|
1115
|
-
for (let j = 0, field;
|
|
1024
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
1025
|
+
for (let j = 0, field; field = input.fieldRow[j]; j++) {
|
|
1116
1026
|
if (field.referencesVariables()) {
|
|
1117
|
-
const model =
|
|
1118
|
-
|
|
1027
|
+
const model =
|
|
1028
|
+
this.workspace.getVariableById(field.getValue() as string);
|
|
1119
1029
|
// Check if the variable actually exists (and isn't just a potential
|
|
1120
1030
|
// variable).
|
|
1121
1031
|
if (model) {
|
|
@@ -1130,12 +1040,12 @@ class Block {
|
|
|
1130
1040
|
/**
|
|
1131
1041
|
* Notification that a variable is renaming but keeping the same ID. If the
|
|
1132
1042
|
* variable is in use on this block, rerender to show the new name.
|
|
1133
|
-
* @param
|
|
1134
|
-
* @
|
|
1043
|
+
* @param variable The variable being renamed.
|
|
1044
|
+
* @internal
|
|
1135
1045
|
*/
|
|
1136
|
-
updateVarName(variable) {
|
|
1137
|
-
for (let i = 0, input;
|
|
1138
|
-
for (let j = 0, field;
|
|
1046
|
+
updateVarName(variable: VariableModel) {
|
|
1047
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
1048
|
+
for (let j = 0, field; field = input.fieldRow[j]; j++) {
|
|
1139
1049
|
if (field.referencesVariables() &&
|
|
1140
1050
|
variable.getId() === field.getValue()) {
|
|
1141
1051
|
field.refreshVariableName();
|
|
@@ -1147,13 +1057,13 @@ class Block {
|
|
|
1147
1057
|
/**
|
|
1148
1058
|
* Notification that a variable is renaming.
|
|
1149
1059
|
* If the ID matches one of this block's variables, rename it.
|
|
1150
|
-
* @param
|
|
1151
|
-
* @param
|
|
1152
|
-
*
|
|
1060
|
+
* @param oldId ID of variable to rename.
|
|
1061
|
+
* @param newId ID of new variable. May be the same as oldId, but with an
|
|
1062
|
+
* updated name.
|
|
1153
1063
|
*/
|
|
1154
|
-
renameVarById(oldId, newId) {
|
|
1155
|
-
for (let i = 0, input;
|
|
1156
|
-
for (let j = 0, field;
|
|
1064
|
+
renameVarById(oldId: string, newId: string) {
|
|
1065
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
1066
|
+
for (let j = 0, field; field = input.fieldRow[j]; j++) {
|
|
1157
1067
|
if (field.referencesVariables() && oldId === field.getValue()) {
|
|
1158
1068
|
field.setValue(newId);
|
|
1159
1069
|
}
|
|
@@ -1163,10 +1073,10 @@ class Block {
|
|
|
1163
1073
|
|
|
1164
1074
|
/**
|
|
1165
1075
|
* Returns the language-neutral value of the given field.
|
|
1166
|
-
* @param
|
|
1167
|
-
* @return
|
|
1076
|
+
* @param name The name of the field.
|
|
1077
|
+
* @return Value of the field or null if field does not exist.
|
|
1168
1078
|
*/
|
|
1169
|
-
getFieldValue(name) {
|
|
1079
|
+
getFieldValue(name: string): AnyDuringMigration {
|
|
1170
1080
|
const field = this.getField(name);
|
|
1171
1081
|
if (field) {
|
|
1172
1082
|
return field.getValue();
|
|
@@ -1176,10 +1086,10 @@ class Block {
|
|
|
1176
1086
|
|
|
1177
1087
|
/**
|
|
1178
1088
|
* Sets the value of the given field for this block.
|
|
1179
|
-
* @param
|
|
1180
|
-
* @param
|
|
1089
|
+
* @param newValue The value to set.
|
|
1090
|
+
* @param name The name of the field to set the value of.
|
|
1181
1091
|
*/
|
|
1182
|
-
setFieldValue(newValue, name) {
|
|
1092
|
+
setFieldValue(newValue: AnyDuringMigration, name: string) {
|
|
1183
1093
|
const field = this.getField(name);
|
|
1184
1094
|
if (!field) {
|
|
1185
1095
|
throw Error('Field "' + name + '" not found.');
|
|
@@ -1189,12 +1099,11 @@ class Block {
|
|
|
1189
1099
|
|
|
1190
1100
|
/**
|
|
1191
1101
|
* Set whether this block can chain onto the bottom of another block.
|
|
1192
|
-
* @param
|
|
1193
|
-
* @param
|
|
1194
|
-
*
|
|
1195
|
-
* connected.
|
|
1102
|
+
* @param newBoolean True if there can be a previous statement.
|
|
1103
|
+
* @param opt_check Statement type or list of statement types. Null/undefined
|
|
1104
|
+
* if any type could be connected.
|
|
1196
1105
|
*/
|
|
1197
|
-
setPreviousStatement(newBoolean, opt_check) {
|
|
1106
|
+
setPreviousStatement(newBoolean: boolean, opt_check?: string|string[]|null) {
|
|
1198
1107
|
if (newBoolean) {
|
|
1199
1108
|
if (opt_check === undefined) {
|
|
1200
1109
|
opt_check = null;
|
|
@@ -1212,19 +1121,20 @@ class Block {
|
|
|
1212
1121
|
'connection.');
|
|
1213
1122
|
}
|
|
1214
1123
|
this.previousConnection.dispose();
|
|
1215
|
-
|
|
1124
|
+
// AnyDuringMigration because: Type 'null' is not assignable to type
|
|
1125
|
+
// 'Connection'.
|
|
1126
|
+
this.previousConnection = null as AnyDuringMigration;
|
|
1216
1127
|
}
|
|
1217
1128
|
}
|
|
1218
1129
|
}
|
|
1219
1130
|
|
|
1220
1131
|
/**
|
|
1221
1132
|
* Set whether another block can chain onto the bottom of this block.
|
|
1222
|
-
* @param
|
|
1223
|
-
* @param
|
|
1224
|
-
*
|
|
1225
|
-
* connected.
|
|
1133
|
+
* @param newBoolean True if there can be a next statement.
|
|
1134
|
+
* @param opt_check Statement type or list of statement types. Null/undefined
|
|
1135
|
+
* if any type could be connected.
|
|
1226
1136
|
*/
|
|
1227
|
-
setNextStatement(newBoolean, opt_check) {
|
|
1137
|
+
setNextStatement(newBoolean: boolean, opt_check?: string|string[]|null) {
|
|
1228
1138
|
if (newBoolean) {
|
|
1229
1139
|
if (opt_check === undefined) {
|
|
1230
1140
|
opt_check = null;
|
|
@@ -1242,19 +1152,20 @@ class Block {
|
|
|
1242
1152
|
'connection.');
|
|
1243
1153
|
}
|
|
1244
1154
|
this.nextConnection.dispose();
|
|
1245
|
-
|
|
1155
|
+
// AnyDuringMigration because: Type 'null' is not assignable to type
|
|
1156
|
+
// 'Connection'.
|
|
1157
|
+
this.nextConnection = null as AnyDuringMigration;
|
|
1246
1158
|
}
|
|
1247
1159
|
}
|
|
1248
1160
|
}
|
|
1249
1161
|
|
|
1250
1162
|
/**
|
|
1251
1163
|
* Set whether this block returns a value.
|
|
1252
|
-
* @param
|
|
1253
|
-
* @param
|
|
1254
|
-
*
|
|
1255
|
-
* (e.g. variable get).
|
|
1164
|
+
* @param newBoolean True if there is an output.
|
|
1165
|
+
* @param opt_check Returned type or list of returned types. Null or
|
|
1166
|
+
* undefined if any type could be returned (e.g. variable get).
|
|
1256
1167
|
*/
|
|
1257
|
-
setOutput(newBoolean, opt_check) {
|
|
1168
|
+
setOutput(newBoolean: boolean, opt_check?: string|string[]|null) {
|
|
1258
1169
|
if (newBoolean) {
|
|
1259
1170
|
if (opt_check === undefined) {
|
|
1260
1171
|
opt_check = null;
|
|
@@ -1271,28 +1182,30 @@ class Block {
|
|
|
1271
1182
|
'Must disconnect output value before removing connection.');
|
|
1272
1183
|
}
|
|
1273
1184
|
this.outputConnection.dispose();
|
|
1274
|
-
|
|
1185
|
+
// AnyDuringMigration because: Type 'null' is not assignable to type
|
|
1186
|
+
// 'Connection'.
|
|
1187
|
+
this.outputConnection = null as AnyDuringMigration;
|
|
1275
1188
|
}
|
|
1276
1189
|
}
|
|
1277
1190
|
}
|
|
1278
1191
|
|
|
1279
1192
|
/**
|
|
1280
1193
|
* Set whether value inputs are arranged horizontally or vertically.
|
|
1281
|
-
* @param
|
|
1194
|
+
* @param newBoolean True if inputs are horizontal.
|
|
1282
1195
|
*/
|
|
1283
|
-
setInputsInline(newBoolean) {
|
|
1196
|
+
setInputsInline(newBoolean: boolean) {
|
|
1284
1197
|
if (this.inputsInline !== newBoolean) {
|
|
1285
|
-
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))
|
|
1286
|
-
|
|
1198
|
+
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))!
|
|
1199
|
+
(this, 'inline', null, this.inputsInline, newBoolean));
|
|
1287
1200
|
this.inputsInline = newBoolean;
|
|
1288
1201
|
}
|
|
1289
1202
|
}
|
|
1290
1203
|
|
|
1291
1204
|
/**
|
|
1292
1205
|
* Get whether value inputs are arranged horizontally or vertically.
|
|
1293
|
-
* @return
|
|
1206
|
+
* @return True if inputs are horizontal.
|
|
1294
1207
|
*/
|
|
1295
|
-
getInputsInline() {
|
|
1208
|
+
getInputsInline(): boolean {
|
|
1296
1209
|
if (this.inputsInline !== undefined) {
|
|
1297
1210
|
// Set explicitly.
|
|
1298
1211
|
return this.inputsInline;
|
|
@@ -1317,47 +1230,47 @@ class Block {
|
|
|
1317
1230
|
|
|
1318
1231
|
/**
|
|
1319
1232
|
* Set the block's output shape.
|
|
1320
|
-
* @param
|
|
1233
|
+
* @param outputShape Value representing an output shape.
|
|
1321
1234
|
*/
|
|
1322
|
-
setOutputShape(outputShape) {
|
|
1235
|
+
setOutputShape(outputShape: number|null) {
|
|
1323
1236
|
this.outputShape_ = outputShape;
|
|
1324
1237
|
}
|
|
1325
1238
|
|
|
1326
1239
|
/**
|
|
1327
1240
|
* Get the block's output shape.
|
|
1328
|
-
* @return
|
|
1241
|
+
* @return Value representing output shape if one exists.
|
|
1329
1242
|
*/
|
|
1330
|
-
getOutputShape() {
|
|
1243
|
+
getOutputShape(): number|null {
|
|
1331
1244
|
return this.outputShape_;
|
|
1332
1245
|
}
|
|
1333
1246
|
|
|
1334
1247
|
/**
|
|
1335
1248
|
* Get whether this block is enabled or not.
|
|
1336
|
-
* @return
|
|
1249
|
+
* @return True if enabled.
|
|
1337
1250
|
*/
|
|
1338
|
-
isEnabled() {
|
|
1251
|
+
isEnabled(): boolean {
|
|
1339
1252
|
return !this.disabled;
|
|
1340
1253
|
}
|
|
1341
1254
|
|
|
1342
1255
|
/**
|
|
1343
1256
|
* Set whether the block is enabled or not.
|
|
1344
|
-
* @param
|
|
1257
|
+
* @param enabled True if enabled.
|
|
1345
1258
|
*/
|
|
1346
|
-
setEnabled(enabled) {
|
|
1259
|
+
setEnabled(enabled: boolean) {
|
|
1347
1260
|
if (this.isEnabled() !== enabled) {
|
|
1348
1261
|
const oldValue = this.disabled;
|
|
1349
1262
|
this.disabled = !enabled;
|
|
1350
|
-
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))
|
|
1351
|
-
|
|
1263
|
+
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))!
|
|
1264
|
+
(this, 'disabled', null, oldValue, !enabled));
|
|
1352
1265
|
}
|
|
1353
1266
|
}
|
|
1354
1267
|
|
|
1355
1268
|
/**
|
|
1356
1269
|
* Get whether the block is disabled or not due to parents.
|
|
1357
1270
|
* The block's own disabled property is not considered.
|
|
1358
|
-
* @return
|
|
1271
|
+
* @return True if disabled.
|
|
1359
1272
|
*/
|
|
1360
|
-
getInheritedDisabled() {
|
|
1273
|
+
getInheritedDisabled(): boolean {
|
|
1361
1274
|
let ancestor = this.getSurroundParent();
|
|
1362
1275
|
while (ancestor) {
|
|
1363
1276
|
if (ancestor.disabled) {
|
|
@@ -1371,32 +1284,32 @@ class Block {
|
|
|
1371
1284
|
|
|
1372
1285
|
/**
|
|
1373
1286
|
* Get whether the block is collapsed or not.
|
|
1374
|
-
* @return
|
|
1287
|
+
* @return True if collapsed.
|
|
1375
1288
|
*/
|
|
1376
|
-
isCollapsed() {
|
|
1289
|
+
isCollapsed(): boolean {
|
|
1377
1290
|
return this.collapsed_;
|
|
1378
1291
|
}
|
|
1379
1292
|
|
|
1380
1293
|
/**
|
|
1381
1294
|
* Set whether the block is collapsed or not.
|
|
1382
|
-
* @param
|
|
1295
|
+
* @param collapsed True if collapsed.
|
|
1383
1296
|
*/
|
|
1384
|
-
setCollapsed(collapsed) {
|
|
1297
|
+
setCollapsed(collapsed: boolean) {
|
|
1385
1298
|
if (this.collapsed_ !== collapsed) {
|
|
1386
|
-
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))
|
|
1387
|
-
|
|
1299
|
+
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))!
|
|
1300
|
+
(this, 'collapsed', null, this.collapsed_, collapsed));
|
|
1388
1301
|
this.collapsed_ = collapsed;
|
|
1389
1302
|
}
|
|
1390
1303
|
}
|
|
1391
1304
|
|
|
1392
1305
|
/**
|
|
1393
1306
|
* Create a human-readable text representation of this block and any children.
|
|
1394
|
-
* @param
|
|
1395
|
-
* @param
|
|
1396
|
-
*
|
|
1397
|
-
* @return
|
|
1307
|
+
* @param opt_maxLength Truncate the string to this length.
|
|
1308
|
+
* @param opt_emptyToken The placeholder string used to denote an empty field.
|
|
1309
|
+
* If not specified, '?' is used.
|
|
1310
|
+
* @return Text of block.
|
|
1398
1311
|
*/
|
|
1399
|
-
toString(opt_maxLength, opt_emptyToken) {
|
|
1312
|
+
toString(opt_maxLength?: number, opt_emptyToken?: string): string {
|
|
1400
1313
|
let text = [];
|
|
1401
1314
|
const emptyFieldPlaceholder = opt_emptyToken || '?';
|
|
1402
1315
|
|
|
@@ -1409,10 +1322,10 @@ class Block {
|
|
|
1409
1322
|
|
|
1410
1323
|
/**
|
|
1411
1324
|
* Whether or not to add parentheses around an input.
|
|
1412
|
-
* @param
|
|
1413
|
-
* @return
|
|
1325
|
+
* @param connection The connection.
|
|
1326
|
+
* @return True if we should add parentheses around the input.
|
|
1414
1327
|
*/
|
|
1415
|
-
function shouldAddParentheses(connection) {
|
|
1328
|
+
function shouldAddParentheses(connection: Connection): boolean {
|
|
1416
1329
|
let checks = connection.getCheck();
|
|
1417
1330
|
if (!checks && connection.targetConnection) {
|
|
1418
1331
|
checks = connection.targetConnection.getCheck();
|
|
@@ -1421,12 +1334,10 @@ class Block {
|
|
|
1421
1334
|
(checks.indexOf('Boolean') !== -1 || checks.indexOf('Number') !== -1);
|
|
1422
1335
|
}
|
|
1423
1336
|
|
|
1424
|
-
/**
|
|
1425
|
-
* Check that we haven't circled back to the original root node.
|
|
1426
|
-
*/
|
|
1337
|
+
/** Check that we haven't circled back to the original root node. */
|
|
1427
1338
|
function checkRoot() {
|
|
1428
|
-
if (node && node.getType() === rootNode
|
|
1429
|
-
node.getLocation() === rootNode
|
|
1339
|
+
if (node && node.getType() === rootNode?.getType() &&
|
|
1340
|
+
node.getLocation() === rootNode?.getLocation()) {
|
|
1430
1341
|
node = null;
|
|
1431
1342
|
}
|
|
1432
1343
|
}
|
|
@@ -1435,7 +1346,7 @@ class Block {
|
|
|
1435
1346
|
while (node) {
|
|
1436
1347
|
switch (node.getType()) {
|
|
1437
1348
|
case ASTNode.types.INPUT: {
|
|
1438
|
-
const connection =
|
|
1349
|
+
const connection = node.getLocation() as Connection;
|
|
1439
1350
|
if (!node.in()) {
|
|
1440
1351
|
text.push(emptyFieldPlaceholder);
|
|
1441
1352
|
} else if (shouldAddParentheses(connection)) {
|
|
@@ -1444,7 +1355,7 @@ class Block {
|
|
|
1444
1355
|
break;
|
|
1445
1356
|
}
|
|
1446
1357
|
case ASTNode.types.FIELD: {
|
|
1447
|
-
const field =
|
|
1358
|
+
const field = node.getLocation() as Field;
|
|
1448
1359
|
if (field.name !== constants.COLLAPSED_FIELD_NAME) {
|
|
1449
1360
|
text.push(field.getText());
|
|
1450
1361
|
}
|
|
@@ -1463,8 +1374,7 @@ class Block {
|
|
|
1463
1374
|
checkRoot();
|
|
1464
1375
|
// If we hit an input on the way up, possibly close out parentheses.
|
|
1465
1376
|
if (node && node.getType() === ASTNode.types.INPUT &&
|
|
1466
|
-
shouldAddParentheses(
|
|
1467
|
-
/** @type {!Connection} */ (node.getLocation()))) {
|
|
1377
|
+
shouldAddParentheses(node.getLocation() as Connection)) {
|
|
1468
1378
|
text.push(')');
|
|
1469
1379
|
}
|
|
1470
1380
|
}
|
|
@@ -1488,17 +1398,23 @@ class Block {
|
|
|
1488
1398
|
}
|
|
1489
1399
|
|
|
1490
1400
|
// Join the text array, removing spaces around added parentheses.
|
|
1401
|
+
// AnyDuringMigration because: Type 'string' is not assignable to type
|
|
1402
|
+
// 'any[]'.
|
|
1491
1403
|
text = text.reduce(function(acc, value) {
|
|
1492
|
-
return acc + (
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1404
|
+
return acc + (acc.substr(-1) === '(' || value === ')' ? '' : ' ') + value;
|
|
1405
|
+
}, '') as AnyDuringMigration;
|
|
1406
|
+
// AnyDuringMigration because: Property 'trim' does not exist on type
|
|
1407
|
+
// 'any[]'.
|
|
1408
|
+
text = (text as AnyDuringMigration).trim() || '???';
|
|
1496
1409
|
if (opt_maxLength) {
|
|
1497
1410
|
// TODO: Improve truncation so that text from this block is given
|
|
1498
1411
|
// priority. E.g. "1+2+3+4+5+6+7+8+9=0" should be "...6+7+8+9=0", not
|
|
1499
1412
|
// "1+2+3+4+5...". E.g. "1+2+3+4+5=6+7+8+9+0" should be "...4+5=6+7...".
|
|
1500
1413
|
if (text.length > opt_maxLength) {
|
|
1501
|
-
|
|
1414
|
+
// AnyDuringMigration because: Type 'string' is not assignable to type
|
|
1415
|
+
// 'any[]'.
|
|
1416
|
+
text = (text.substring(0, opt_maxLength - 3) + '...') as
|
|
1417
|
+
AnyDuringMigration;
|
|
1502
1418
|
}
|
|
1503
1419
|
}
|
|
1504
1420
|
return text;
|
|
@@ -1506,40 +1422,40 @@ class Block {
|
|
|
1506
1422
|
|
|
1507
1423
|
/**
|
|
1508
1424
|
* Shortcut for appending a value input row.
|
|
1509
|
-
* @param
|
|
1510
|
-
*
|
|
1511
|
-
* @return
|
|
1425
|
+
* @param name Language-neutral identifier which may used to find this input
|
|
1426
|
+
* again. Should be unique to this block.
|
|
1427
|
+
* @return The input object created.
|
|
1512
1428
|
*/
|
|
1513
|
-
appendValueInput(name) {
|
|
1429
|
+
appendValueInput(name: string): Input {
|
|
1514
1430
|
return this.appendInput_(inputTypes.VALUE, name);
|
|
1515
1431
|
}
|
|
1516
1432
|
|
|
1517
1433
|
/**
|
|
1518
1434
|
* Shortcut for appending a statement input row.
|
|
1519
|
-
* @param
|
|
1520
|
-
*
|
|
1521
|
-
* @return
|
|
1435
|
+
* @param name Language-neutral identifier which may used to find this input
|
|
1436
|
+
* again. Should be unique to this block.
|
|
1437
|
+
* @return The input object created.
|
|
1522
1438
|
*/
|
|
1523
|
-
appendStatementInput(name) {
|
|
1439
|
+
appendStatementInput(name: string): Input {
|
|
1524
1440
|
return this.appendInput_(inputTypes.STATEMENT, name);
|
|
1525
1441
|
}
|
|
1526
1442
|
|
|
1527
1443
|
/**
|
|
1528
1444
|
* Shortcut for appending a dummy input row.
|
|
1529
|
-
* @param
|
|
1530
|
-
*
|
|
1531
|
-
* @return
|
|
1445
|
+
* @param opt_name Language-neutral identifier which may used to find this
|
|
1446
|
+
* input again. Should be unique to this block.
|
|
1447
|
+
* @return The input object created.
|
|
1532
1448
|
*/
|
|
1533
|
-
appendDummyInput(opt_name) {
|
|
1449
|
+
appendDummyInput(opt_name?: string): Input {
|
|
1534
1450
|
return this.appendInput_(inputTypes.DUMMY, opt_name || '');
|
|
1535
1451
|
}
|
|
1536
1452
|
|
|
1537
1453
|
/**
|
|
1538
1454
|
* Initialize this block using a cross-platform, internationalization-friendly
|
|
1539
1455
|
* JSON description.
|
|
1540
|
-
* @param
|
|
1456
|
+
* @param json Structured data describing the block.
|
|
1541
1457
|
*/
|
|
1542
|
-
jsonInit(json) {
|
|
1458
|
+
jsonInit(json: AnyDuringMigration) {
|
|
1543
1459
|
const warningPrefix = json['type'] ? 'Block "' + json['type'] + '": ' : '';
|
|
1544
1460
|
|
|
1545
1461
|
// Validate inputs.
|
|
@@ -1631,11 +1547,10 @@ class Block {
|
|
|
1631
1547
|
|
|
1632
1548
|
/**
|
|
1633
1549
|
* Initialize the colour of this block from the JSON description.
|
|
1634
|
-
* @param
|
|
1635
|
-
* @param
|
|
1636
|
-
* @private
|
|
1550
|
+
* @param json Structured data describing the block.
|
|
1551
|
+
* @param warningPrefix Warning prefix string identifying block.
|
|
1637
1552
|
*/
|
|
1638
|
-
jsonInitColour_(json, warningPrefix) {
|
|
1553
|
+
private jsonInitColour_(json: AnyDuringMigration, warningPrefix: string) {
|
|
1639
1554
|
if ('colour' in json) {
|
|
1640
1555
|
if (json['colour'] === undefined) {
|
|
1641
1556
|
console.warn(warningPrefix + 'Undefined colour value.');
|
|
@@ -1652,11 +1567,10 @@ class Block {
|
|
|
1652
1567
|
|
|
1653
1568
|
/**
|
|
1654
1569
|
* Initialize the style of this block from the JSON description.
|
|
1655
|
-
* @param
|
|
1656
|
-
* @param
|
|
1657
|
-
* @private
|
|
1570
|
+
* @param json Structured data describing the block.
|
|
1571
|
+
* @param warningPrefix Warning prefix string identifying block.
|
|
1658
1572
|
*/
|
|
1659
|
-
jsonInitStyle_(json, warningPrefix) {
|
|
1573
|
+
private jsonInitStyle_(json: AnyDuringMigration, warningPrefix: string) {
|
|
1660
1574
|
const blockStyleName = json['style'];
|
|
1661
1575
|
try {
|
|
1662
1576
|
this.setStyle(blockStyleName);
|
|
@@ -1671,10 +1585,10 @@ class Block {
|
|
|
1671
1585
|
* the block, including prototype values. This provides some insurance against
|
|
1672
1586
|
* mixin / extension incompatibilities with future block features. This check
|
|
1673
1587
|
* can be disabled by passing true as the second argument.
|
|
1674
|
-
* @param
|
|
1675
|
-
* @param
|
|
1588
|
+
* @param mixinObj The key/values pairs to add to this block object.
|
|
1589
|
+
* @param opt_disableCheck Option flag to disable overwrite checks.
|
|
1676
1590
|
*/
|
|
1677
|
-
mixin(mixinObj, opt_disableCheck) {
|
|
1591
|
+
mixin(mixinObj: AnyDuringMigration, opt_disableCheck?: boolean) {
|
|
1678
1592
|
if (opt_disableCheck !== undefined &&
|
|
1679
1593
|
typeof opt_disableCheck !== 'boolean') {
|
|
1680
1594
|
throw Error('opt_disableCheck must be a boolean if provided');
|
|
@@ -1682,7 +1596,7 @@ class Block {
|
|
|
1682
1596
|
if (!opt_disableCheck) {
|
|
1683
1597
|
const overwrites = [];
|
|
1684
1598
|
for (const key in mixinObj) {
|
|
1685
|
-
if (this[key] !== undefined) {
|
|
1599
|
+
if ((this as AnyDuringMigration)[key] !== undefined) {
|
|
1686
1600
|
overwrites.push(key);
|
|
1687
1601
|
}
|
|
1688
1602
|
}
|
|
@@ -1692,32 +1606,33 @@ class Block {
|
|
|
1692
1606
|
JSON.stringify(overwrites));
|
|
1693
1607
|
}
|
|
1694
1608
|
}
|
|
1695
|
-
|
|
1609
|
+
Object.assign(this, mixinObj);
|
|
1696
1610
|
}
|
|
1697
1611
|
|
|
1698
1612
|
/**
|
|
1699
1613
|
* Interpolate a message description onto the block.
|
|
1700
|
-
* @param
|
|
1701
|
-
*
|
|
1702
|
-
* @param
|
|
1703
|
-
* @param
|
|
1704
|
-
*
|
|
1705
|
-
* @param
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1614
|
+
* @param message Text contains interpolation tokens (%1, %2, ...) that match
|
|
1615
|
+
* with fields or inputs defined in the args array.
|
|
1616
|
+
* @param args Array of arguments to be interpolated.
|
|
1617
|
+
* @param lastDummyAlign If a dummy input is added at the end, how should it
|
|
1618
|
+
* be aligned?
|
|
1619
|
+
* @param warningPrefix Warning prefix string identifying block.
|
|
1620
|
+
*/
|
|
1621
|
+
private interpolate_(
|
|
1622
|
+
message: string, args: AnyDuringMigration[],
|
|
1623
|
+
lastDummyAlign: string|undefined, warningPrefix: string) {
|
|
1709
1624
|
const tokens = parsing.tokenizeInterpolation(message);
|
|
1710
1625
|
this.validateTokens_(tokens, args.length);
|
|
1711
1626
|
const elements = this.interpolateArguments_(tokens, args, lastDummyAlign);
|
|
1712
1627
|
|
|
1713
1628
|
// An array of [field, fieldName] tuples.
|
|
1714
1629
|
const fieldStack = [];
|
|
1715
|
-
for (let i = 0, element;
|
|
1630
|
+
for (let i = 0, element; element = elements[i]; i++) {
|
|
1716
1631
|
if (this.isInputKeyword_(element['type'])) {
|
|
1717
1632
|
const input = this.inputFromJson_(element, warningPrefix);
|
|
1718
1633
|
// Should never be null, but just in case.
|
|
1719
1634
|
if (input) {
|
|
1720
|
-
for (let j = 0, tuple;
|
|
1635
|
+
for (let j = 0, tuple; tuple = fieldStack[j]; j++) {
|
|
1721
1636
|
input.appendField(tuple[0], tuple[1]);
|
|
1722
1637
|
}
|
|
1723
1638
|
fieldStack.length = 0;
|
|
@@ -1737,11 +1652,10 @@ class Block {
|
|
|
1737
1652
|
* Validates that the tokens are within the correct bounds, with no
|
|
1738
1653
|
* duplicates, and that all of the arguments are referred to. Throws errors if
|
|
1739
1654
|
* any of these things are not true.
|
|
1740
|
-
* @param
|
|
1741
|
-
* @param
|
|
1742
|
-
* @private
|
|
1655
|
+
* @param tokens An array of tokens to validate
|
|
1656
|
+
* @param argsCount The number of args that need to be referred to.
|
|
1743
1657
|
*/
|
|
1744
|
-
validateTokens_(tokens
|
|
1658
|
+
private validateTokens_(tokens: Array<string|number>, argsCount: number) {
|
|
1745
1659
|
const visitedArgsHash = [];
|
|
1746
1660
|
let visitedArgsCount = 0;
|
|
1747
1661
|
for (let i = 0; i < tokens.length; i++) {
|
|
@@ -1773,15 +1687,15 @@ class Block {
|
|
|
1773
1687
|
* Inserts args in place of numerical tokens. String args are converted to
|
|
1774
1688
|
* JSON that defines a label field. If necessary an extra dummy input is added
|
|
1775
1689
|
* to the end of the elements.
|
|
1776
|
-
* @param
|
|
1777
|
-
* @param
|
|
1778
|
-
* @param
|
|
1779
|
-
*
|
|
1780
|
-
* @return
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1690
|
+
* @param tokens The tokens to interpolate
|
|
1691
|
+
* @param args The arguments to insert.
|
|
1692
|
+
* @param lastDummyAlign The alignment the added dummy input should have, if
|
|
1693
|
+
* we are required to add one.
|
|
1694
|
+
* @return The JSON definitions of field and inputs to add to the block.
|
|
1695
|
+
*/
|
|
1696
|
+
private interpolateArguments_(
|
|
1697
|
+
tokens: Array<string|number>, args: Array<AnyDuringMigration|string>,
|
|
1698
|
+
lastDummyAlign: string|undefined): AnyDuringMigration[] {
|
|
1785
1699
|
const elements = [];
|
|
1786
1700
|
for (let i = 0; i < tokens.length; i++) {
|
|
1787
1701
|
let element = tokens[i];
|
|
@@ -1790,7 +1704,9 @@ class Block {
|
|
|
1790
1704
|
}
|
|
1791
1705
|
// Args can be strings, which is why this isn't elseif.
|
|
1792
1706
|
if (typeof element === 'string') {
|
|
1793
|
-
|
|
1707
|
+
// AnyDuringMigration because: Type '{ text: string; type: string; } |
|
|
1708
|
+
// null' is not assignable to type 'string | number'.
|
|
1709
|
+
element = this.stringToFieldJson_(element) as AnyDuringMigration;
|
|
1794
1710
|
if (!element) {
|
|
1795
1711
|
continue;
|
|
1796
1712
|
}
|
|
@@ -1799,10 +1715,12 @@ class Block {
|
|
|
1799
1715
|
}
|
|
1800
1716
|
|
|
1801
1717
|
const length = elements.length;
|
|
1802
|
-
if (length &&
|
|
1718
|
+
if (length &&
|
|
1719
|
+
!this.isInputKeyword_(
|
|
1720
|
+
(elements as AnyDuringMigration)[length - 1]['type'])) {
|
|
1803
1721
|
const dummyInput = {'type': 'input_dummy'};
|
|
1804
1722
|
if (lastDummyAlign) {
|
|
1805
|
-
dummyInput['align'] = lastDummyAlign;
|
|
1723
|
+
(dummyInput as AnyDuringMigration)['align'] = lastDummyAlign;
|
|
1806
1724
|
}
|
|
1807
1725
|
elements.push(dummyInput);
|
|
1808
1726
|
}
|
|
@@ -1814,13 +1732,11 @@ class Block {
|
|
|
1814
1732
|
* Creates a field from the JSON definition of a field. If a field with the
|
|
1815
1733
|
* given type cannot be found, this attempts to create a different field using
|
|
1816
1734
|
* the 'alt' property of the JSON definition (if it exists).
|
|
1817
|
-
* @param
|
|
1818
|
-
*
|
|
1819
|
-
* @return {?Field} The field defined by the JSON, or null if one
|
|
1820
|
-
* couldn't be created.
|
|
1821
|
-
* @private
|
|
1735
|
+
* @param element The element to try to turn into a field.
|
|
1736
|
+
* @return The field defined by the JSON, or null if one couldn't be created.
|
|
1822
1737
|
*/
|
|
1823
|
-
fieldFromJson_(element
|
|
1738
|
+
private fieldFromJson_(element: {alt?: string, type?: string, text?: string}):
|
|
1739
|
+
Field|null {
|
|
1824
1740
|
const field = fieldRegistry.fromJson(element);
|
|
1825
1741
|
if (!field && element['alt']) {
|
|
1826
1742
|
if (typeof element['alt'] === 'string') {
|
|
@@ -1835,14 +1751,14 @@ class Block {
|
|
|
1835
1751
|
/**
|
|
1836
1752
|
* Creates an input from the JSON definition of an input. Sets the input's
|
|
1837
1753
|
* check and alignment if they are provided.
|
|
1838
|
-
* @param
|
|
1839
|
-
* @param
|
|
1840
|
-
*
|
|
1841
|
-
* @return
|
|
1842
|
-
*
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1754
|
+
* @param element The JSON to turn into an input.
|
|
1755
|
+
* @param warningPrefix The prefix to add to warnings to help the developer
|
|
1756
|
+
* debug.
|
|
1757
|
+
* @return The input that has been created, or null if one could not be
|
|
1758
|
+
* created for some reason (should never happen).
|
|
1759
|
+
*/
|
|
1760
|
+
private inputFromJson_(element: AnyDuringMigration, warningPrefix: string):
|
|
1761
|
+
Input|null {
|
|
1846
1762
|
const alignmentLookup = {
|
|
1847
1763
|
'LEFT': Align.LEFT,
|
|
1848
1764
|
'RIGHT': Align.RIGHT,
|
|
@@ -1871,7 +1787,9 @@ class Block {
|
|
|
1871
1787
|
input.setCheck(element['check']);
|
|
1872
1788
|
}
|
|
1873
1789
|
if (element['align']) {
|
|
1874
|
-
const alignment =
|
|
1790
|
+
const alignment =
|
|
1791
|
+
(alignmentLookup as
|
|
1792
|
+
AnyDuringMigration)[element['align'].toUpperCase()];
|
|
1875
1793
|
if (alignment === undefined) {
|
|
1876
1794
|
console.warn(warningPrefix + 'Illegal align value: ', element['align']);
|
|
1877
1795
|
} else {
|
|
@@ -1883,12 +1801,11 @@ class Block {
|
|
|
1883
1801
|
|
|
1884
1802
|
/**
|
|
1885
1803
|
* Returns true if the given string matches one of the input keywords.
|
|
1886
|
-
* @param
|
|
1887
|
-
* @return
|
|
1888
|
-
*
|
|
1889
|
-
* @private
|
|
1804
|
+
* @param str The string to check.
|
|
1805
|
+
* @return True if the given string matches one of the input keywords, false
|
|
1806
|
+
* otherwise.
|
|
1890
1807
|
*/
|
|
1891
|
-
isInputKeyword_(str) {
|
|
1808
|
+
private isInputKeyword_(str: string): boolean {
|
|
1892
1809
|
return str === 'input_value' || str === 'input_statement' ||
|
|
1893
1810
|
str === 'input_dummy';
|
|
1894
1811
|
}
|
|
@@ -1896,12 +1813,10 @@ class Block {
|
|
|
1896
1813
|
/**
|
|
1897
1814
|
* Turns a string into the JSON definition of a label field. If the string
|
|
1898
1815
|
* becomes an empty string when trimmed, this returns null.
|
|
1899
|
-
* @param
|
|
1900
|
-
*
|
|
1901
|
-
* @return {?{text: string, type: string}} The JSON definition or null.
|
|
1902
|
-
* @private
|
|
1816
|
+
* @param str String to turn into the JSON definition of a label field.
|
|
1817
|
+
* @return The JSON definition or null.
|
|
1903
1818
|
*/
|
|
1904
|
-
stringToFieldJson_(str) {
|
|
1819
|
+
private stringToFieldJson_(str: string): {text: string, type: string}|null {
|
|
1905
1820
|
str = str.trim();
|
|
1906
1821
|
if (str) {
|
|
1907
1822
|
return {
|
|
@@ -1914,13 +1829,12 @@ class Block {
|
|
|
1914
1829
|
|
|
1915
1830
|
/**
|
|
1916
1831
|
* Add a value input, statement input or local variable to this block.
|
|
1917
|
-
* @param
|
|
1918
|
-
* @param
|
|
1919
|
-
*
|
|
1920
|
-
* @return
|
|
1921
|
-
* @protected
|
|
1832
|
+
* @param type One of Blockly.inputTypes.
|
|
1833
|
+
* @param name Language-neutral identifier which may used to find this input
|
|
1834
|
+
* again. Should be unique to this block.
|
|
1835
|
+
* @return The input object created.
|
|
1922
1836
|
*/
|
|
1923
|
-
appendInput_(type, name) {
|
|
1837
|
+
protected appendInput_(type: number, name: string): Input {
|
|
1924
1838
|
let connection = null;
|
|
1925
1839
|
if (type === inputTypes.VALUE || type === inputTypes.STATEMENT) {
|
|
1926
1840
|
connection = this.makeConnection_(type);
|
|
@@ -1928,7 +1842,10 @@ class Block {
|
|
|
1928
1842
|
if (type === inputTypes.STATEMENT) {
|
|
1929
1843
|
this.statementInputCount++;
|
|
1930
1844
|
}
|
|
1931
|
-
|
|
1845
|
+
// AnyDuringMigration because: Argument of type 'Connection | null' is not
|
|
1846
|
+
// assignable to parameter of type 'Connection'.
|
|
1847
|
+
const input =
|
|
1848
|
+
new Input(type, name, this, (connection as AnyDuringMigration));
|
|
1932
1849
|
// Append input to list.
|
|
1933
1850
|
this.inputList.push(input);
|
|
1934
1851
|
return input;
|
|
@@ -1936,19 +1853,18 @@ class Block {
|
|
|
1936
1853
|
|
|
1937
1854
|
/**
|
|
1938
1855
|
* Move a named input to a different location on this block.
|
|
1939
|
-
* @param
|
|
1940
|
-
* @param
|
|
1941
|
-
* input
|
|
1942
|
-
* or null to be the input at the end.
|
|
1856
|
+
* @param name The name of the input to move.
|
|
1857
|
+
* @param refName Name of input that should be after the moved input, or null
|
|
1858
|
+
* to be the input at the end.
|
|
1943
1859
|
*/
|
|
1944
|
-
moveInputBefore(name, refName) {
|
|
1860
|
+
moveInputBefore(name: string, refName: string|null) {
|
|
1945
1861
|
if (name === refName) {
|
|
1946
1862
|
return;
|
|
1947
1863
|
}
|
|
1948
1864
|
// Find both inputs.
|
|
1949
1865
|
let inputIndex = -1;
|
|
1950
1866
|
let refIndex = refName ? -1 : this.inputList.length;
|
|
1951
|
-
for (let i = 0, input;
|
|
1867
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
1952
1868
|
if (input.name === name) {
|
|
1953
1869
|
inputIndex = i;
|
|
1954
1870
|
if (refIndex !== -1) {
|
|
@@ -1972,11 +1888,10 @@ class Block {
|
|
|
1972
1888
|
|
|
1973
1889
|
/**
|
|
1974
1890
|
* Move a numbered input to a different location on this block.
|
|
1975
|
-
* @param
|
|
1976
|
-
* @param
|
|
1977
|
-
* input.
|
|
1891
|
+
* @param inputIndex Index of the input to move.
|
|
1892
|
+
* @param refIndex Index of input that should be after the moved input.
|
|
1978
1893
|
*/
|
|
1979
|
-
moveNumberedInputBefore(inputIndex, refIndex) {
|
|
1894
|
+
moveNumberedInputBefore(inputIndex: number, refIndex: number) {
|
|
1980
1895
|
// Validate arguments.
|
|
1981
1896
|
if (inputIndex === refIndex) {
|
|
1982
1897
|
throw Error('Can\'t move input to itself.');
|
|
@@ -1999,15 +1914,14 @@ class Block {
|
|
|
1999
1914
|
|
|
2000
1915
|
/**
|
|
2001
1916
|
* Remove an input from this block.
|
|
2002
|
-
* @param
|
|
2003
|
-
* @param
|
|
2004
|
-
*
|
|
2005
|
-
*
|
|
2006
|
-
* and opt_quiet is true.
|
|
1917
|
+
* @param name The name of the input.
|
|
1918
|
+
* @param opt_quiet True to prevent an error if input is not present.
|
|
1919
|
+
* @return True if operation succeeds, false if input is not present and
|
|
1920
|
+
* opt_quiet is true.
|
|
2007
1921
|
* @throws {Error} if the input is not present and opt_quiet is not true.
|
|
2008
1922
|
*/
|
|
2009
|
-
removeInput(name, opt_quiet) {
|
|
2010
|
-
for (let i = 0, input;
|
|
1923
|
+
removeInput(name: string, opt_quiet?: boolean): boolean {
|
|
1924
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
2011
1925
|
if (input.name === name) {
|
|
2012
1926
|
if (input.type === inputTypes.STATEMENT) {
|
|
2013
1927
|
this.statementInputCount--;
|
|
@@ -2025,11 +1939,11 @@ class Block {
|
|
|
2025
1939
|
|
|
2026
1940
|
/**
|
|
2027
1941
|
* Fetches the named input object.
|
|
2028
|
-
* @param
|
|
2029
|
-
* @return
|
|
1942
|
+
* @param name The name of the input.
|
|
1943
|
+
* @return The input object, or null if input does not exist.
|
|
2030
1944
|
*/
|
|
2031
|
-
getInput(name) {
|
|
2032
|
-
for (let i = 0, input;
|
|
1945
|
+
getInput(name: string): Input|null {
|
|
1946
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
2033
1947
|
if (input.name === name) {
|
|
2034
1948
|
return input;
|
|
2035
1949
|
}
|
|
@@ -2040,76 +1954,75 @@ class Block {
|
|
|
2040
1954
|
|
|
2041
1955
|
/**
|
|
2042
1956
|
* Fetches the block attached to the named input.
|
|
2043
|
-
* @param
|
|
2044
|
-
* @return
|
|
2045
|
-
*
|
|
1957
|
+
* @param name The name of the input.
|
|
1958
|
+
* @return The attached value block, or null if the input is either
|
|
1959
|
+
* disconnected or if the input does not exist.
|
|
2046
1960
|
*/
|
|
2047
|
-
getInputTargetBlock(name) {
|
|
1961
|
+
getInputTargetBlock(name: string): Block|null {
|
|
2048
1962
|
const input = this.getInput(name);
|
|
2049
1963
|
return input && input.connection && input.connection.targetBlock();
|
|
2050
1964
|
}
|
|
2051
1965
|
|
|
2052
1966
|
/**
|
|
2053
1967
|
* Returns the comment on this block (or null if there is no comment).
|
|
2054
|
-
* @return
|
|
1968
|
+
* @return Block's comment.
|
|
2055
1969
|
*/
|
|
2056
|
-
getCommentText() {
|
|
1970
|
+
getCommentText(): string|null {
|
|
2057
1971
|
return this.commentModel.text;
|
|
2058
1972
|
}
|
|
2059
1973
|
|
|
2060
1974
|
/**
|
|
2061
1975
|
* Set this block's comment text.
|
|
2062
|
-
* @param
|
|
1976
|
+
* @param text The text, or null to delete.
|
|
2063
1977
|
*/
|
|
2064
|
-
setCommentText(text) {
|
|
1978
|
+
setCommentText(text: string|null) {
|
|
2065
1979
|
if (this.commentModel.text === text) {
|
|
2066
1980
|
return;
|
|
2067
1981
|
}
|
|
2068
|
-
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))
|
|
2069
|
-
|
|
1982
|
+
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))!
|
|
1983
|
+
(this, 'comment', null, this.commentModel.text, text));
|
|
2070
1984
|
this.commentModel.text = text;
|
|
2071
|
-
|
|
1985
|
+
// AnyDuringMigration because: Type 'string | null' is not assignable to
|
|
1986
|
+
// type 'string | Comment'.
|
|
1987
|
+
this.comment = text as AnyDuringMigration; // For backwards compatibility.
|
|
2072
1988
|
}
|
|
2073
1989
|
|
|
2074
1990
|
/**
|
|
2075
1991
|
* Set this block's warning text.
|
|
2076
|
-
* @param
|
|
2077
|
-
* @param
|
|
2078
|
-
*
|
|
1992
|
+
* @param _text The text, or null to delete.
|
|
1993
|
+
* @param _opt_id An optional ID for the warning text to be able to maintain
|
|
1994
|
+
* multiple warnings.
|
|
2079
1995
|
*/
|
|
2080
|
-
setWarningText(_text, _opt_id) {
|
|
2081
|
-
|
|
2082
|
-
}
|
|
1996
|
+
setWarningText(_text: string|null, _opt_id?: string) {}
|
|
1997
|
+
// NOP.
|
|
2083
1998
|
|
|
2084
1999
|
/**
|
|
2085
2000
|
* Give this block a mutator dialog.
|
|
2086
|
-
* @param
|
|
2087
|
-
* remove.
|
|
2001
|
+
* @param _mutator A mutator dialog instance or null to remove.
|
|
2088
2002
|
*/
|
|
2089
|
-
setMutator(_mutator) {
|
|
2090
|
-
|
|
2091
|
-
}
|
|
2003
|
+
setMutator(_mutator: Mutator) {}
|
|
2004
|
+
// NOP.
|
|
2092
2005
|
|
|
2093
2006
|
/**
|
|
2094
2007
|
* Return the coordinates of the top-left corner of this block relative to the
|
|
2095
2008
|
* drawing surface's origin (0,0), in workspace units.
|
|
2096
|
-
* @return
|
|
2009
|
+
* @return Object with .x and .y properties.
|
|
2097
2010
|
*/
|
|
2098
|
-
getRelativeToSurfaceXY() {
|
|
2011
|
+
getRelativeToSurfaceXY(): Coordinate {
|
|
2099
2012
|
return this.xy_;
|
|
2100
2013
|
}
|
|
2101
2014
|
|
|
2102
2015
|
/**
|
|
2103
2016
|
* Move a block by a relative offset.
|
|
2104
|
-
* @param
|
|
2105
|
-
* @param
|
|
2017
|
+
* @param dx Horizontal offset, in workspace units.
|
|
2018
|
+
* @param dy Vertical offset, in workspace units.
|
|
2106
2019
|
*/
|
|
2107
|
-
moveBy(dx, dy) {
|
|
2020
|
+
moveBy(dx: number, dy: number) {
|
|
2108
2021
|
if (this.parentBlock_) {
|
|
2109
2022
|
throw Error('Block has parent.');
|
|
2110
2023
|
}
|
|
2111
|
-
const event =
|
|
2112
|
-
new (eventUtils.get(eventUtils.BLOCK_MOVE))(this)
|
|
2024
|
+
const event =
|
|
2025
|
+
new (eventUtils.get(eventUtils.BLOCK_MOVE))!(this) as BlockMove;
|
|
2113
2026
|
this.xy_.translate(dx, dy);
|
|
2114
2027
|
event.recordNew();
|
|
2115
2028
|
eventUtils.fire(event);
|
|
@@ -2117,23 +2030,21 @@ class Block {
|
|
|
2117
2030
|
|
|
2118
2031
|
/**
|
|
2119
2032
|
* Create a connection of the specified type.
|
|
2120
|
-
* @param
|
|
2121
|
-
* @return
|
|
2122
|
-
* @protected
|
|
2033
|
+
* @param type The type of the connection to create.
|
|
2034
|
+
* @return A new connection of the specified type.
|
|
2123
2035
|
*/
|
|
2124
|
-
makeConnection_(type) {
|
|
2036
|
+
protected makeConnection_(type: number): Connection {
|
|
2125
2037
|
return new Connection(this, type);
|
|
2126
2038
|
}
|
|
2127
2039
|
|
|
2128
2040
|
/**
|
|
2129
2041
|
* Recursively checks whether all statement and value inputs are filled with
|
|
2130
2042
|
* blocks. Also checks all following statement blocks in this stack.
|
|
2131
|
-
* @param
|
|
2132
|
-
*
|
|
2133
|
-
*
|
|
2134
|
-
* @return {boolean} True if all inputs are filled, false otherwise.
|
|
2043
|
+
* @param opt_shadowBlocksAreFilled An optional argument controlling whether
|
|
2044
|
+
* shadow blocks are counted as filled. Defaults to true.
|
|
2045
|
+
* @return True if all inputs are filled, false otherwise.
|
|
2135
2046
|
*/
|
|
2136
|
-
allInputsFilled(opt_shadowBlocksAreFilled) {
|
|
2047
|
+
allInputsFilled(opt_shadowBlocksAreFilled?: boolean): boolean {
|
|
2137
2048
|
// Account for the shadow block filledness toggle.
|
|
2138
2049
|
if (opt_shadowBlocksAreFilled === undefined) {
|
|
2139
2050
|
opt_shadowBlocksAreFilled = true;
|
|
@@ -2143,7 +2054,7 @@ class Block {
|
|
|
2143
2054
|
}
|
|
2144
2055
|
|
|
2145
2056
|
// Recursively check each input block of the current block.
|
|
2146
|
-
for (let i = 0, input;
|
|
2057
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
2147
2058
|
if (!input.connection) {
|
|
2148
2059
|
continue;
|
|
2149
2060
|
}
|
|
@@ -2169,9 +2080,9 @@ class Block {
|
|
|
2169
2080
|
* Intended to on be used in console logs and errors. If you need a string
|
|
2170
2081
|
* that uses the user's native language (including block text, field values,
|
|
2171
2082
|
* and child blocks), use [toString()]{@link Block#toString}.
|
|
2172
|
-
* @return
|
|
2083
|
+
* @return The description.
|
|
2173
2084
|
*/
|
|
2174
|
-
toDevString() {
|
|
2085
|
+
toDevString(): string {
|
|
2175
2086
|
let msg = this.type ? '"' + this.type + '" block' : 'Block';
|
|
2176
2087
|
if (this.id) {
|
|
2177
2088
|
msg += ' (id="' + this.id + '")';
|
|
@@ -2180,33 +2091,12 @@ class Block {
|
|
|
2180
2091
|
}
|
|
2181
2092
|
}
|
|
2182
2093
|
|
|
2183
|
-
|
|
2184
|
-
|
|
2185
|
-
|
|
2186
|
-
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
|
|
2190
|
-
Block.CommentModel;
|
|
2191
|
-
|
|
2192
|
-
/**
|
|
2193
|
-
* An optional callback method to use whenever the block's parent workspace
|
|
2194
|
-
* changes. This is usually only called from the constructor, the block type
|
|
2195
|
-
* initializer function, or an extension initializer function.
|
|
2196
|
-
* @type {undefined|?function(Abstract)}
|
|
2197
|
-
*/
|
|
2198
|
-
Block.prototype.onchange;
|
|
2199
|
-
|
|
2200
|
-
/**
|
|
2201
|
-
* The language-neutral ID given to the collapsed input.
|
|
2202
|
-
* @const {string}
|
|
2203
|
-
*/
|
|
2204
|
-
Block.COLLAPSED_INPUT_NAME = constants.COLLAPSED_INPUT_NAME;
|
|
2205
|
-
|
|
2206
|
-
/**
|
|
2207
|
-
* The language-neutral ID given to the collapsed field.
|
|
2208
|
-
* @const {string}
|
|
2209
|
-
*/
|
|
2210
|
-
Block.COLLAPSED_FIELD_NAME = constants.COLLAPSED_FIELD_NAME;
|
|
2094
|
+
export namespace Block {
|
|
2095
|
+
export interface CommentModel {
|
|
2096
|
+
text: string|null;
|
|
2097
|
+
pinned: boolean;
|
|
2098
|
+
size: Size;
|
|
2099
|
+
}
|
|
2100
|
+
}
|
|
2211
2101
|
|
|
2212
|
-
|
|
2102
|
+
export type CommentModel = Block.CommentModel;
|