blockly 8.0.5 → 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 +2002 -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 +3 -1
- package/blocks/text.js +14 -6
- package/blocks/variables.js +3 -1
- package/blocks/variables_dynamic.js +3 -1
- package/blocks.d.ts +0 -2
- 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 -719
- 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} +30 -35
- package/core/events/events_block_delete.d.ts +36 -0
- package/core/events/{events_block_delete.js → events_block_delete.ts} +34 -39
- 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.ts +309 -0
- 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} +229 -228
- 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 -3
- package/core.js +1 -2
- package/dart.d.ts +0 -3
- 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 +2 -8
- package/javascript.d.ts +0 -3
- package/javascript_compressed.js +314 -104
- package/javascript_compressed.js.map +1 -1
- package/lua.d.ts +0 -3
- package/lua_compressed.js +399 -81
- package/lua_compressed.js.map +1 -1
- package/package.json +5 -5
- package/php.d.ts +0 -3
- package/php_compressed.js +322 -93
- package/php_compressed.js.map +1 -1
- package/python.d.ts +0 -3
- package/python_compressed.js +237 -90
- package/python_compressed.js.map +1 -1
- package/blockly.d.ts +0 -26127
- 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/input.js +0 -335
- 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 -293
- 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,13 +309,13 @@ class Block {
|
|
|
383
309
|
|
|
384
310
|
/**
|
|
385
311
|
* Dispose of this block.
|
|
386
|
-
* @param
|
|
387
|
-
*
|
|
388
|
-
*
|
|
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.
|
|
389
315
|
* @suppress {checkTypes}
|
|
390
316
|
*/
|
|
391
|
-
dispose(healStack) {
|
|
392
|
-
if (
|
|
317
|
+
dispose(healStack: boolean) {
|
|
318
|
+
if (this.disposed) {
|
|
393
319
|
// Already deleted.
|
|
394
320
|
return;
|
|
395
321
|
}
|
|
@@ -400,28 +326,17 @@ class Block {
|
|
|
400
326
|
|
|
401
327
|
this.unplug(healStack);
|
|
402
328
|
if (eventUtils.isEnabled()) {
|
|
403
|
-
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_DELETE))(this));
|
|
329
|
+
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_DELETE))!(this));
|
|
404
330
|
}
|
|
405
331
|
eventUtils.disable();
|
|
406
332
|
|
|
407
333
|
try {
|
|
408
334
|
// This block is now at the top of the workspace.
|
|
409
335
|
// Remove this block from the workspace's list of top-most blocks.
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
this.workspace.removeBlockById(this.id);
|
|
415
|
-
this.workspace = null;
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
// Just deleting this block from the DOM would result in a memory leak as
|
|
419
|
-
// well as corruption of the connection database. Therefore we must
|
|
420
|
-
// methodically step through the blocks and carefully disassemble them.
|
|
421
|
-
|
|
422
|
-
if (common.getSelected() === this) {
|
|
423
|
-
common.setSelected(null);
|
|
424
|
-
}
|
|
336
|
+
this.workspace.removeTopBlock(this);
|
|
337
|
+
this.workspace.removeTypedBlock(this);
|
|
338
|
+
// Remove from block database.
|
|
339
|
+
this.workspace.removeBlockById(this.id);
|
|
425
340
|
|
|
426
341
|
// First, dispose of all my children.
|
|
427
342
|
for (let i = this.childBlocks_.length - 1; i >= 0; i--) {
|
|
@@ -429,13 +344,13 @@ class Block {
|
|
|
429
344
|
}
|
|
430
345
|
// Then dispose of myself.
|
|
431
346
|
// Dispose of all inputs and their fields.
|
|
432
|
-
for (let i = 0, input;
|
|
347
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
433
348
|
input.dispose();
|
|
434
349
|
}
|
|
435
350
|
this.inputList.length = 0;
|
|
436
351
|
// Dispose of any remaining connections (next/previous/output).
|
|
437
352
|
const connections = this.getConnections_(true);
|
|
438
|
-
for (let i = 0, connection;
|
|
353
|
+
for (let i = 0, connection; connection = connections[i]; i++) {
|
|
439
354
|
connection.dispose();
|
|
440
355
|
}
|
|
441
356
|
} finally {
|
|
@@ -451,11 +366,10 @@ class Block {
|
|
|
451
366
|
* before the first interaction with it. Interactions include UI actions
|
|
452
367
|
* (e.g. clicking and dragging) and firing events (e.g. create, delete, and
|
|
453
368
|
* change).
|
|
454
|
-
* @public
|
|
455
369
|
*/
|
|
456
370
|
initModel() {
|
|
457
|
-
for (let i = 0, input;
|
|
458
|
-
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++) {
|
|
459
373
|
if (field.initModel) {
|
|
460
374
|
field.initModel();
|
|
461
375
|
}
|
|
@@ -466,10 +380,10 @@ class Block {
|
|
|
466
380
|
/**
|
|
467
381
|
* Unplug this block from its superior block. If this block is a statement,
|
|
468
382
|
* optionally reconnect the block underneath with the block on top.
|
|
469
|
-
* @param
|
|
470
|
-
*
|
|
383
|
+
* @param opt_healStack Disconnect child statement and reconnect stack.
|
|
384
|
+
* Defaults to false.
|
|
471
385
|
*/
|
|
472
|
-
unplug(opt_healStack) {
|
|
386
|
+
unplug(opt_healStack?: boolean) {
|
|
473
387
|
if (this.outputConnection) {
|
|
474
388
|
this.unplugFromRow_(opt_healStack);
|
|
475
389
|
}
|
|
@@ -481,11 +395,10 @@ class Block {
|
|
|
481
395
|
/**
|
|
482
396
|
* Unplug this block's output from an input on another block. Optionally
|
|
483
397
|
* reconnect the block's parent to the only child block, if possible.
|
|
484
|
-
* @param
|
|
485
|
-
*
|
|
486
|
-
* @private
|
|
398
|
+
* @param opt_healStack Disconnect right-side block and connect to left-side
|
|
399
|
+
* block. Defaults to false.
|
|
487
400
|
*/
|
|
488
|
-
unplugFromRow_(opt_healStack) {
|
|
401
|
+
private unplugFromRow_(opt_healStack?: boolean) {
|
|
489
402
|
let parentConnection = null;
|
|
490
403
|
if (this.outputConnection.isConnected()) {
|
|
491
404
|
parentConnection = this.outputConnection.targetConnection;
|
|
@@ -500,7 +413,7 @@ class Block {
|
|
|
500
413
|
|
|
501
414
|
const thisConnection = this.getOnlyValueConnection_();
|
|
502
415
|
if (!thisConnection || !thisConnection.isConnected() ||
|
|
503
|
-
thisConnection.targetBlock()
|
|
416
|
+
thisConnection.targetBlock()!.isShadow()) {
|
|
504
417
|
// Too many or too few possible connections on this block, or there's
|
|
505
418
|
// nothing on the other side of this connection.
|
|
506
419
|
return;
|
|
@@ -508,13 +421,13 @@ class Block {
|
|
|
508
421
|
|
|
509
422
|
const childConnection = thisConnection.targetConnection;
|
|
510
423
|
// Disconnect the child block.
|
|
511
|
-
childConnection
|
|
424
|
+
childConnection?.disconnect();
|
|
512
425
|
// Connect child to the parent if possible, otherwise bump away.
|
|
513
426
|
if (this.workspace.connectionChecker.canConnect(
|
|
514
427
|
childConnection, parentConnection, false)) {
|
|
515
|
-
parentConnection.connect(childConnection);
|
|
428
|
+
parentConnection.connect(childConnection!);
|
|
516
429
|
} else {
|
|
517
|
-
childConnection
|
|
430
|
+
childConnection?.onFailedConnect(parentConnection);
|
|
518
431
|
}
|
|
519
432
|
}
|
|
520
433
|
|
|
@@ -525,10 +438,9 @@ class Block {
|
|
|
525
438
|
* Since only one block can be displaced and attached to the insertion marker
|
|
526
439
|
* this should only ever return one connection.
|
|
527
440
|
*
|
|
528
|
-
* @return
|
|
529
|
-
* @private
|
|
441
|
+
* @return The connection on the value input, or null.
|
|
530
442
|
*/
|
|
531
|
-
getOnlyValueConnection_() {
|
|
443
|
+
private getOnlyValueConnection_(): Connection|null {
|
|
532
444
|
let connection = null;
|
|
533
445
|
for (let i = 0; i < this.inputList.length; i++) {
|
|
534
446
|
const thisConnection = this.inputList[i].connection;
|
|
@@ -547,11 +459,10 @@ class Block {
|
|
|
547
459
|
/**
|
|
548
460
|
* Unplug this statement block from its superior block. Optionally reconnect
|
|
549
461
|
* the block underneath with the block on top.
|
|
550
|
-
* @param
|
|
551
|
-
*
|
|
552
|
-
* @private
|
|
462
|
+
* @param opt_healStack Disconnect child statement and reconnect stack.
|
|
463
|
+
* Defaults to false.
|
|
553
464
|
*/
|
|
554
|
-
unplugFromStack_(opt_healStack) {
|
|
465
|
+
private unplugFromStack_(opt_healStack?: boolean) {
|
|
555
466
|
let previousTarget = null;
|
|
556
467
|
if (this.previousConnection.isConnected()) {
|
|
557
468
|
// Remember the connection that any next statements need to connect to.
|
|
@@ -563,23 +474,23 @@ class Block {
|
|
|
563
474
|
if (opt_healStack && nextBlock && !nextBlock.isShadow()) {
|
|
564
475
|
// Disconnect the next statement.
|
|
565
476
|
const nextTarget = this.nextConnection.targetConnection;
|
|
566
|
-
nextTarget
|
|
477
|
+
nextTarget?.disconnect();
|
|
567
478
|
if (previousTarget &&
|
|
568
479
|
this.workspace.connectionChecker.canConnect(
|
|
569
480
|
previousTarget, nextTarget, false)) {
|
|
570
481
|
// Attach the next statement to the previous statement.
|
|
571
|
-
previousTarget.connect(nextTarget);
|
|
482
|
+
previousTarget.connect(nextTarget!);
|
|
572
483
|
}
|
|
573
484
|
}
|
|
574
485
|
}
|
|
575
486
|
|
|
576
487
|
/**
|
|
577
488
|
* Returns all connections originating from this block.
|
|
578
|
-
* @param
|
|
579
|
-
* @return
|
|
580
|
-
* @
|
|
489
|
+
* @param _all If true, return all connections even hidden ones.
|
|
490
|
+
* @return Array of connections.
|
|
491
|
+
* @internal
|
|
581
492
|
*/
|
|
582
|
-
getConnections_(_all) {
|
|
493
|
+
getConnections_(_all: boolean): Connection[] {
|
|
583
494
|
const myConnections = [];
|
|
584
495
|
if (this.outputConnection) {
|
|
585
496
|
myConnections.push(this.outputConnection);
|
|
@@ -590,7 +501,7 @@ class Block {
|
|
|
590
501
|
if (this.nextConnection) {
|
|
591
502
|
myConnections.push(this.nextConnection);
|
|
592
503
|
}
|
|
593
|
-
for (let i = 0, input;
|
|
504
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
594
505
|
if (input.connection) {
|
|
595
506
|
myConnections.push(input.connection);
|
|
596
507
|
}
|
|
@@ -601,17 +512,17 @@ class Block {
|
|
|
601
512
|
/**
|
|
602
513
|
* Walks down a stack of blocks and finds the last next connection on the
|
|
603
514
|
* stack.
|
|
604
|
-
* @param
|
|
605
|
-
*
|
|
606
|
-
*
|
|
607
|
-
* @return
|
|
608
|
-
* @
|
|
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
|
|
609
520
|
*/
|
|
610
|
-
lastConnectionInStack(ignoreShadows) {
|
|
521
|
+
lastConnectionInStack(ignoreShadows: boolean): Connection|null {
|
|
611
522
|
let nextConnection = this.nextConnection;
|
|
612
523
|
while (nextConnection) {
|
|
613
524
|
const nextBlock = nextConnection.targetBlock();
|
|
614
|
-
if (!nextBlock ||
|
|
525
|
+
if (!nextBlock || ignoreShadows && nextBlock.isShadow()) {
|
|
615
526
|
return nextConnection;
|
|
616
527
|
}
|
|
617
528
|
nextConnection = nextBlock.nextConnection;
|
|
@@ -623,29 +534,27 @@ class Block {
|
|
|
623
534
|
* Bump unconnected blocks out of alignment. Two blocks which aren't actually
|
|
624
535
|
* connected should not coincidentally line up on screen.
|
|
625
536
|
*/
|
|
626
|
-
bumpNeighbours() {
|
|
627
|
-
|
|
628
|
-
}
|
|
537
|
+
bumpNeighbours() {}
|
|
538
|
+
// noop.
|
|
629
539
|
|
|
630
540
|
/**
|
|
631
541
|
* Return the parent block or null if this block is at the top level. The
|
|
632
542
|
* parent block is either the block connected to the previous connection (for
|
|
633
543
|
* a statement block) or the block connected to the output connection (for a
|
|
634
544
|
* value block).
|
|
635
|
-
* @return
|
|
545
|
+
* @return The block (if any) that holds the current block.
|
|
636
546
|
*/
|
|
637
|
-
getParent() {
|
|
547
|
+
getParent(): this|null {
|
|
638
548
|
return this.parentBlock_;
|
|
639
549
|
}
|
|
640
550
|
|
|
641
551
|
/**
|
|
642
552
|
* Return the input that connects to the specified block.
|
|
643
|
-
* @param
|
|
644
|
-
* @return
|
|
645
|
-
* 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.
|
|
646
555
|
*/
|
|
647
|
-
getInputWithBlock(block) {
|
|
648
|
-
for (let i = 0, input;
|
|
556
|
+
getInputWithBlock(block: Block): Input|null {
|
|
557
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
649
558
|
if (input.connection && input.connection.targetBlock() === block) {
|
|
650
559
|
return input;
|
|
651
560
|
}
|
|
@@ -658,14 +567,16 @@ class Block {
|
|
|
658
567
|
* block has no surrounding block. A parent block might just be the previous
|
|
659
568
|
* statement, whereas the surrounding block is an if statement, while loop,
|
|
660
569
|
* etc.
|
|
661
|
-
* @return
|
|
570
|
+
* @return The block (if any) that surrounds the current block.
|
|
662
571
|
*/
|
|
663
|
-
getSurroundParent() {
|
|
572
|
+
getSurroundParent(): this|null {
|
|
664
573
|
let block = this;
|
|
665
574
|
let prevBlock;
|
|
666
575
|
do {
|
|
667
576
|
prevBlock = block;
|
|
668
|
-
|
|
577
|
+
// AnyDuringMigration because: Type 'Block | null' is not assignable to
|
|
578
|
+
// type 'this'.
|
|
579
|
+
block = block.getParent() as AnyDuringMigration;
|
|
669
580
|
if (!block) {
|
|
670
581
|
// Ran off the top.
|
|
671
582
|
return null;
|
|
@@ -677,28 +588,28 @@ class Block {
|
|
|
677
588
|
|
|
678
589
|
/**
|
|
679
590
|
* Return the next statement block directly connected to this block.
|
|
680
|
-
* @return
|
|
591
|
+
* @return The next statement block or null.
|
|
681
592
|
*/
|
|
682
|
-
getNextBlock() {
|
|
593
|
+
getNextBlock(): Block|null {
|
|
683
594
|
return this.nextConnection && this.nextConnection.targetBlock();
|
|
684
595
|
}
|
|
685
596
|
|
|
686
597
|
/**
|
|
687
598
|
* Returns the block connected to the previous connection.
|
|
688
|
-
* @return
|
|
599
|
+
* @return The previous statement block or null.
|
|
689
600
|
*/
|
|
690
|
-
getPreviousBlock() {
|
|
601
|
+
getPreviousBlock(): Block|null {
|
|
691
602
|
return this.previousConnection && this.previousConnection.targetBlock();
|
|
692
603
|
}
|
|
693
604
|
|
|
694
605
|
/**
|
|
695
606
|
* Return the connection on the first statement input on this block, or null
|
|
696
607
|
* if there are none.
|
|
697
|
-
* @return
|
|
698
|
-
* @
|
|
608
|
+
* @return The first statement connection or null.
|
|
609
|
+
* @internal
|
|
699
610
|
*/
|
|
700
|
-
getFirstStatementConnection() {
|
|
701
|
-
for (let i = 0, input;
|
|
611
|
+
getFirstStatementConnection(): Connection|null {
|
|
612
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
702
613
|
if (input.connection &&
|
|
703
614
|
input.connection.type === ConnectionType.NEXT_STATEMENT) {
|
|
704
615
|
return input.connection;
|
|
@@ -710,11 +621,11 @@ class Block {
|
|
|
710
621
|
/**
|
|
711
622
|
* Return the top-most block in this block's tree.
|
|
712
623
|
* This will return itself if this block is at the top level.
|
|
713
|
-
* @return
|
|
624
|
+
* @return The root block.
|
|
714
625
|
*/
|
|
715
|
-
getRootBlock() {
|
|
716
|
-
let rootBlock;
|
|
717
|
-
let block = this;
|
|
626
|
+
getRootBlock(): this {
|
|
627
|
+
let rootBlock: this;
|
|
628
|
+
let block: this|null = this;
|
|
718
629
|
do {
|
|
719
630
|
rootBlock = block;
|
|
720
631
|
block = rootBlock.parentBlock_;
|
|
@@ -726,16 +637,18 @@ class Block {
|
|
|
726
637
|
* Walk up from the given block up through the stack of blocks to find
|
|
727
638
|
* the top block of the sub stack. If we are nested in a statement input only
|
|
728
639
|
* find the top-most nested block. Do not go all the way to the root block.
|
|
729
|
-
* @return
|
|
730
|
-
* @
|
|
640
|
+
* @return The top block in a stack.
|
|
641
|
+
* @internal
|
|
731
642
|
*/
|
|
732
|
-
getTopStackBlock() {
|
|
643
|
+
getTopStackBlock(): this {
|
|
733
644
|
let block = this;
|
|
734
645
|
let previous;
|
|
735
646
|
do {
|
|
736
647
|
previous = block.getPreviousBlock();
|
|
648
|
+
// AnyDuringMigration because: Type 'Block' is not assignable to type
|
|
649
|
+
// 'this'.
|
|
737
650
|
} while (previous && previous.getNextBlock() === block &&
|
|
738
|
-
(block = previous));
|
|
651
|
+
(block = previous as AnyDuringMigration));
|
|
739
652
|
return block;
|
|
740
653
|
}
|
|
741
654
|
|
|
@@ -744,15 +657,15 @@ class Block {
|
|
|
744
657
|
* Includes value and statement inputs, as well as any following statement.
|
|
745
658
|
* Excludes any connection on an output tab or any preceding statement.
|
|
746
659
|
* Blocks are optionally sorted by position; top to bottom.
|
|
747
|
-
* @param
|
|
748
|
-
* @return
|
|
660
|
+
* @param ordered Sort the list if true.
|
|
661
|
+
* @return Array of blocks.
|
|
749
662
|
*/
|
|
750
|
-
getChildren(ordered) {
|
|
663
|
+
getChildren(ordered: boolean): Block[] {
|
|
751
664
|
if (!ordered) {
|
|
752
665
|
return this.childBlocks_;
|
|
753
666
|
}
|
|
754
667
|
const blocks = [];
|
|
755
|
-
for (let i = 0, input;
|
|
668
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
756
669
|
if (input.connection) {
|
|
757
670
|
const child = input.connection.targetBlock();
|
|
758
671
|
if (child) {
|
|
@@ -769,10 +682,10 @@ class Block {
|
|
|
769
682
|
|
|
770
683
|
/**
|
|
771
684
|
* Set parent of this block to be a new block or null.
|
|
772
|
-
* @param
|
|
773
|
-
* @
|
|
685
|
+
* @param newParent New parent block.
|
|
686
|
+
* @internal
|
|
774
687
|
*/
|
|
775
|
-
setParent(newParent) {
|
|
688
|
+
setParent(newParent: this|null) {
|
|
776
689
|
if (newParent === this.parentBlock_) {
|
|
777
690
|
return;
|
|
778
691
|
}
|
|
@@ -780,8 +693,8 @@ class Block {
|
|
|
780
693
|
// Check that block is connected to new parent if new parent is not null and
|
|
781
694
|
// that block is not connected to superior one if new parent is null.
|
|
782
695
|
const targetBlock =
|
|
783
|
-
|
|
784
|
-
|
|
696
|
+
this.previousConnection && this.previousConnection.targetBlock() ||
|
|
697
|
+
this.outputConnection && this.outputConnection.targetBlock();
|
|
785
698
|
const isConnected = !!targetBlock;
|
|
786
699
|
|
|
787
700
|
if (isConnected && newParent && targetBlock !== newParent) {
|
|
@@ -794,13 +707,12 @@ class Block {
|
|
|
794
707
|
' superior block.');
|
|
795
708
|
}
|
|
796
709
|
|
|
710
|
+
// This block hasn't actually moved on-screen, so there's no need to
|
|
711
|
+
// update
|
|
712
|
+
// its connection locations.
|
|
797
713
|
if (this.parentBlock_) {
|
|
798
714
|
// Remove this block from the old parent's child list.
|
|
799
715
|
arrayUtils.removeElem(this.parentBlock_.childBlocks_, this);
|
|
800
|
-
|
|
801
|
-
// This block hasn't actually moved on-screen, so there's no need to
|
|
802
|
-
// update
|
|
803
|
-
// its connection locations.
|
|
804
716
|
} else {
|
|
805
717
|
// New parent must be non-null so remove this block from the workspace's
|
|
806
718
|
// list of top-most blocks.
|
|
@@ -822,49 +734,52 @@ class Block {
|
|
|
822
734
|
* Includes value and statement inputs, as well as any following statements.
|
|
823
735
|
* Excludes any connection on an output tab or any preceding statements.
|
|
824
736
|
* Blocks are optionally sorted by position; top to bottom.
|
|
825
|
-
* @param
|
|
826
|
-
* @return
|
|
737
|
+
* @param ordered Sort the list if true.
|
|
738
|
+
* @return Flattened array of blocks.
|
|
827
739
|
*/
|
|
828
|
-
getDescendants(ordered) {
|
|
740
|
+
getDescendants(ordered: boolean): this[] {
|
|
829
741
|
const blocks = [this];
|
|
830
742
|
const childBlocks = this.getChildren(ordered);
|
|
831
|
-
for (let child, i = 0;
|
|
832
|
-
|
|
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);
|
|
833
748
|
}
|
|
834
749
|
return blocks;
|
|
835
750
|
}
|
|
836
751
|
|
|
837
752
|
/**
|
|
838
753
|
* Get whether this block is deletable or not.
|
|
839
|
-
* @return
|
|
754
|
+
* @return True if deletable.
|
|
840
755
|
*/
|
|
841
|
-
isDeletable() {
|
|
842
|
-
return this.deletable_ && !this.isShadow_ &&
|
|
843
|
-
!
|
|
756
|
+
isDeletable(): boolean {
|
|
757
|
+
return this.deletable_ && !this.isShadow_ && !this.disposed &&
|
|
758
|
+
!this.workspace.options.readOnly;
|
|
844
759
|
}
|
|
845
760
|
|
|
846
761
|
/**
|
|
847
762
|
* Set whether this block is deletable or not.
|
|
848
|
-
* @param
|
|
763
|
+
* @param deletable True if deletable.
|
|
849
764
|
*/
|
|
850
|
-
setDeletable(deletable) {
|
|
765
|
+
setDeletable(deletable: boolean) {
|
|
851
766
|
this.deletable_ = deletable;
|
|
852
767
|
}
|
|
853
768
|
|
|
854
769
|
/**
|
|
855
770
|
* Get whether this block is movable or not.
|
|
856
|
-
* @return
|
|
771
|
+
* @return True if movable.
|
|
857
772
|
*/
|
|
858
|
-
isMovable() {
|
|
859
|
-
return this.movable_ && !this.isShadow_ &&
|
|
860
|
-
!
|
|
773
|
+
isMovable(): boolean {
|
|
774
|
+
return this.movable_ && !this.isShadow_ && !this.disposed &&
|
|
775
|
+
!this.workspace.options.readOnly;
|
|
861
776
|
}
|
|
862
777
|
|
|
863
778
|
/**
|
|
864
779
|
* Set whether this block is movable or not.
|
|
865
|
-
* @param
|
|
780
|
+
* @param movable True if movable.
|
|
866
781
|
*/
|
|
867
|
-
setMovable(movable) {
|
|
782
|
+
setMovable(movable: boolean) {
|
|
868
783
|
this.movable_ = movable;
|
|
869
784
|
}
|
|
870
785
|
|
|
@@ -873,9 +788,9 @@ class Block {
|
|
|
873
788
|
* descendants will put this block over the workspace's capacity this block is
|
|
874
789
|
* not duplicatable. If duplicating this block and descendants will put any
|
|
875
790
|
* type over their maxInstances this block is not duplicatable.
|
|
876
|
-
* @return
|
|
791
|
+
* @return True if duplicatable.
|
|
877
792
|
*/
|
|
878
|
-
isDuplicatable() {
|
|
793
|
+
isDuplicatable(): boolean {
|
|
879
794
|
if (!this.workspace.hasBlockLimits()) {
|
|
880
795
|
return true;
|
|
881
796
|
}
|
|
@@ -885,56 +800,55 @@ class Block {
|
|
|
885
800
|
|
|
886
801
|
/**
|
|
887
802
|
* Get whether this block is a shadow block or not.
|
|
888
|
-
* @return
|
|
803
|
+
* @return True if a shadow.
|
|
889
804
|
*/
|
|
890
|
-
isShadow() {
|
|
805
|
+
isShadow(): boolean {
|
|
891
806
|
return this.isShadow_;
|
|
892
807
|
}
|
|
893
808
|
|
|
894
809
|
/**
|
|
895
810
|
* Set whether this block is a shadow block or not.
|
|
896
|
-
* @param
|
|
897
|
-
* @
|
|
811
|
+
* @param shadow True if a shadow.
|
|
812
|
+
* @internal
|
|
898
813
|
*/
|
|
899
|
-
setShadow(shadow) {
|
|
814
|
+
setShadow(shadow: boolean) {
|
|
900
815
|
this.isShadow_ = shadow;
|
|
901
816
|
}
|
|
902
817
|
|
|
903
818
|
/**
|
|
904
819
|
* Get whether this block is an insertion marker block or not.
|
|
905
|
-
* @return
|
|
820
|
+
* @return True if an insertion marker.
|
|
906
821
|
*/
|
|
907
|
-
isInsertionMarker() {
|
|
822
|
+
isInsertionMarker(): boolean {
|
|
908
823
|
return this.isInsertionMarker_;
|
|
909
824
|
}
|
|
910
825
|
|
|
911
826
|
/**
|
|
912
827
|
* Set whether this block is an insertion marker block or not.
|
|
913
828
|
* Once set this cannot be unset.
|
|
914
|
-
* @param
|
|
915
|
-
* @
|
|
829
|
+
* @param insertionMarker True if an insertion marker.
|
|
830
|
+
* @internal
|
|
916
831
|
*/
|
|
917
|
-
setInsertionMarker(insertionMarker) {
|
|
832
|
+
setInsertionMarker(insertionMarker: boolean) {
|
|
918
833
|
this.isInsertionMarker_ = insertionMarker;
|
|
919
834
|
}
|
|
920
835
|
|
|
921
836
|
/**
|
|
922
837
|
* Get whether this block is editable or not.
|
|
923
|
-
* @return
|
|
838
|
+
* @return True if editable.
|
|
924
839
|
*/
|
|
925
|
-
isEditable() {
|
|
926
|
-
return this.editable_ &&
|
|
927
|
-
!(this.workspace && this.workspace.options.readOnly);
|
|
840
|
+
isEditable(): boolean {
|
|
841
|
+
return this.editable_ && !this.disposed && !this.workspace.options.readOnly;
|
|
928
842
|
}
|
|
929
843
|
|
|
930
844
|
/**
|
|
931
845
|
* Set whether this block is editable or not.
|
|
932
|
-
* @param
|
|
846
|
+
* @param editable True if editable.
|
|
933
847
|
*/
|
|
934
|
-
setEditable(editable) {
|
|
848
|
+
setEditable(editable: boolean) {
|
|
935
849
|
this.editable_ = editable;
|
|
936
|
-
for (let i = 0, input;
|
|
937
|
-
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++) {
|
|
938
852
|
field.updateEditable();
|
|
939
853
|
}
|
|
940
854
|
}
|
|
@@ -942,9 +856,9 @@ class Block {
|
|
|
942
856
|
|
|
943
857
|
/**
|
|
944
858
|
* Returns if this block has been disposed of / deleted.
|
|
945
|
-
* @return
|
|
859
|
+
* @return True if this block has been disposed of / deleted.
|
|
946
860
|
*/
|
|
947
|
-
isDisposed() {
|
|
861
|
+
isDisposed(): boolean {
|
|
948
862
|
return this.disposed;
|
|
949
863
|
}
|
|
950
864
|
|
|
@@ -952,12 +866,12 @@ class Block {
|
|
|
952
866
|
* Find the connection on this block that corresponds to the given connection
|
|
953
867
|
* on the other block.
|
|
954
868
|
* Used to match connections between a block and its insertion marker.
|
|
955
|
-
* @param
|
|
956
|
-
* @param
|
|
957
|
-
* @return
|
|
958
|
-
* @
|
|
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
|
|
959
873
|
*/
|
|
960
|
-
getMatchingConnection(otherBlock, conn) {
|
|
874
|
+
getMatchingConnection(otherBlock: Block, conn: Connection): Connection|null {
|
|
961
875
|
const connections = this.getConnections_(true);
|
|
962
876
|
const otherConnections = otherBlock.getConnections_(true);
|
|
963
877
|
if (connections.length !== otherConnections.length) {
|
|
@@ -973,61 +887,61 @@ class Block {
|
|
|
973
887
|
|
|
974
888
|
/**
|
|
975
889
|
* Set the URL of this block's help page.
|
|
976
|
-
* @param
|
|
977
|
-
*
|
|
890
|
+
* @param url URL string for block help, or function that returns a URL. Null
|
|
891
|
+
* for no help.
|
|
978
892
|
*/
|
|
979
|
-
setHelpUrl(url) {
|
|
893
|
+
setHelpUrl(url: string|Function) {
|
|
980
894
|
this.helpUrl = url;
|
|
981
895
|
}
|
|
982
896
|
|
|
983
897
|
/**
|
|
984
898
|
* Sets the tooltip for this block.
|
|
985
|
-
* @param
|
|
986
|
-
*
|
|
987
|
-
*
|
|
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.
|
|
988
902
|
*/
|
|
989
|
-
setTooltip(newTip) {
|
|
903
|
+
setTooltip(newTip: Tooltip.TipInfo) {
|
|
990
904
|
this.tooltip = newTip;
|
|
991
905
|
}
|
|
992
906
|
|
|
993
907
|
/**
|
|
994
908
|
* Returns the tooltip text for this block.
|
|
995
|
-
* @return
|
|
909
|
+
* @return The tooltip text for this block.
|
|
996
910
|
*/
|
|
997
|
-
getTooltip() {
|
|
911
|
+
getTooltip(): string {
|
|
998
912
|
return Tooltip.getTooltipOfObject(this);
|
|
999
913
|
}
|
|
1000
914
|
|
|
1001
915
|
/**
|
|
1002
916
|
* Get the colour of a block.
|
|
1003
|
-
* @return
|
|
917
|
+
* @return #RRGGBB string.
|
|
1004
918
|
*/
|
|
1005
|
-
getColour() {
|
|
919
|
+
getColour(): string {
|
|
1006
920
|
return this.colour_;
|
|
1007
921
|
}
|
|
1008
922
|
|
|
1009
923
|
/**
|
|
1010
924
|
* Get the name of the block style.
|
|
1011
|
-
* @return
|
|
925
|
+
* @return Name of the block style.
|
|
1012
926
|
*/
|
|
1013
|
-
getStyleName() {
|
|
927
|
+
getStyleName(): string {
|
|
1014
928
|
return this.styleName_;
|
|
1015
929
|
}
|
|
1016
930
|
|
|
1017
931
|
/**
|
|
1018
932
|
* Get the HSV hue value of a block. Null if hue not set.
|
|
1019
|
-
* @return
|
|
933
|
+
* @return Hue value (0-360).
|
|
1020
934
|
*/
|
|
1021
|
-
getHue() {
|
|
935
|
+
getHue(): number|null {
|
|
1022
936
|
return this.hue_;
|
|
1023
937
|
}
|
|
1024
938
|
|
|
1025
939
|
/**
|
|
1026
940
|
* Change the colour of a block.
|
|
1027
|
-
* @param
|
|
1028
|
-
*
|
|
941
|
+
* @param colour HSV hue value (0 to 360), #RRGGBB string, or a message
|
|
942
|
+
* reference string pointing to one of those two values.
|
|
1029
943
|
*/
|
|
1030
|
-
setColour(colour) {
|
|
944
|
+
setColour(colour: number|string) {
|
|
1031
945
|
const parsed = parsing.parseBlockColour(colour);
|
|
1032
946
|
this.hue_ = parsed.hue;
|
|
1033
947
|
this.colour_ = parsed.hex;
|
|
@@ -1035,9 +949,9 @@ class Block {
|
|
|
1035
949
|
|
|
1036
950
|
/**
|
|
1037
951
|
* Set the style and colour values of a block.
|
|
1038
|
-
* @param
|
|
952
|
+
* @param blockStyleName Name of the block style.
|
|
1039
953
|
*/
|
|
1040
|
-
setStyle(blockStyleName) {
|
|
954
|
+
setStyle(blockStyleName: string) {
|
|
1041
955
|
this.styleName_ = blockStyleName;
|
|
1042
956
|
}
|
|
1043
957
|
|
|
@@ -1046,11 +960,10 @@ class Block {
|
|
|
1046
960
|
* changes, replacing any prior onchange handler. This is usually only called
|
|
1047
961
|
* from the constructor, the block type initializer function, or an extension
|
|
1048
962
|
* initializer function.
|
|
1049
|
-
* @param
|
|
1050
|
-
* when the block's workspace changes.
|
|
963
|
+
* @param onchangeFn The callback to call when the block's workspace changes.
|
|
1051
964
|
* @throws {Error} if onchangeFn is not falsey and not a function.
|
|
1052
965
|
*/
|
|
1053
|
-
setOnChange(onchangeFn) {
|
|
966
|
+
setOnChange(onchangeFn: (p1: Abstract) => AnyDuringMigration) {
|
|
1054
967
|
if (onchangeFn && typeof onchangeFn !== 'function') {
|
|
1055
968
|
throw Error('onchange must be a function.');
|
|
1056
969
|
}
|
|
@@ -1058,18 +971,16 @@ class Block {
|
|
|
1058
971
|
this.workspace.removeChangeListener(this.onchangeWrapper_);
|
|
1059
972
|
}
|
|
1060
973
|
this.onchange = onchangeFn;
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
this.workspace.addChangeListener(this.onchangeWrapper_);
|
|
1064
|
-
}
|
|
974
|
+
this.onchangeWrapper_ = onchangeFn.bind(this);
|
|
975
|
+
this.workspace.addChangeListener(this.onchangeWrapper_);
|
|
1065
976
|
}
|
|
1066
977
|
|
|
1067
978
|
/**
|
|
1068
979
|
* Returns the named field from a block.
|
|
1069
|
-
* @param
|
|
1070
|
-
* @return
|
|
980
|
+
* @param name The name of the field.
|
|
981
|
+
* @return Named field, or null if field does not exist.
|
|
1071
982
|
*/
|
|
1072
|
-
getField(name) {
|
|
983
|
+
getField(name: string): Field|null {
|
|
1073
984
|
if (typeof name !== 'string') {
|
|
1074
985
|
throw TypeError(
|
|
1075
986
|
'Block.prototype.getField expects a string ' +
|
|
@@ -1077,8 +988,8 @@ class Block {
|
|
|
1077
988
|
(name === undefined ? 'nothing' : name + ' of type ' + typeof name) +
|
|
1078
989
|
' instead');
|
|
1079
990
|
}
|
|
1080
|
-
for (let i = 0, input;
|
|
1081
|
-
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++) {
|
|
1082
993
|
if (field.name === name) {
|
|
1083
994
|
return field;
|
|
1084
995
|
}
|
|
@@ -1089,12 +1000,12 @@ class Block {
|
|
|
1089
1000
|
|
|
1090
1001
|
/**
|
|
1091
1002
|
* Return all variables referenced by this block.
|
|
1092
|
-
* @return
|
|
1003
|
+
* @return List of variable ids.
|
|
1093
1004
|
*/
|
|
1094
|
-
getVars() {
|
|
1005
|
+
getVars(): string[] {
|
|
1095
1006
|
const vars = [];
|
|
1096
|
-
for (let i = 0, input;
|
|
1097
|
-
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++) {
|
|
1098
1009
|
if (field.referencesVariables()) {
|
|
1099
1010
|
vars.push(field.getValue());
|
|
1100
1011
|
}
|
|
@@ -1105,16 +1016,16 @@ class Block {
|
|
|
1105
1016
|
|
|
1106
1017
|
/**
|
|
1107
1018
|
* Return all variables referenced by this block.
|
|
1108
|
-
* @return
|
|
1109
|
-
* @
|
|
1019
|
+
* @return List of variable models.
|
|
1020
|
+
* @internal
|
|
1110
1021
|
*/
|
|
1111
|
-
getVarModels() {
|
|
1022
|
+
getVarModels(): VariableModel[] {
|
|
1112
1023
|
const vars = [];
|
|
1113
|
-
for (let i = 0, input;
|
|
1114
|
-
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++) {
|
|
1115
1026
|
if (field.referencesVariables()) {
|
|
1116
|
-
const model =
|
|
1117
|
-
|
|
1027
|
+
const model =
|
|
1028
|
+
this.workspace.getVariableById(field.getValue() as string);
|
|
1118
1029
|
// Check if the variable actually exists (and isn't just a potential
|
|
1119
1030
|
// variable).
|
|
1120
1031
|
if (model) {
|
|
@@ -1129,12 +1040,12 @@ class Block {
|
|
|
1129
1040
|
/**
|
|
1130
1041
|
* Notification that a variable is renaming but keeping the same ID. If the
|
|
1131
1042
|
* variable is in use on this block, rerender to show the new name.
|
|
1132
|
-
* @param
|
|
1133
|
-
* @
|
|
1043
|
+
* @param variable The variable being renamed.
|
|
1044
|
+
* @internal
|
|
1134
1045
|
*/
|
|
1135
|
-
updateVarName(variable) {
|
|
1136
|
-
for (let i = 0, input;
|
|
1137
|
-
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++) {
|
|
1138
1049
|
if (field.referencesVariables() &&
|
|
1139
1050
|
variable.getId() === field.getValue()) {
|
|
1140
1051
|
field.refreshVariableName();
|
|
@@ -1146,13 +1057,13 @@ class Block {
|
|
|
1146
1057
|
/**
|
|
1147
1058
|
* Notification that a variable is renaming.
|
|
1148
1059
|
* If the ID matches one of this block's variables, rename it.
|
|
1149
|
-
* @param
|
|
1150
|
-
* @param
|
|
1151
|
-
*
|
|
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.
|
|
1152
1063
|
*/
|
|
1153
|
-
renameVarById(oldId, newId) {
|
|
1154
|
-
for (let i = 0, input;
|
|
1155
|
-
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++) {
|
|
1156
1067
|
if (field.referencesVariables() && oldId === field.getValue()) {
|
|
1157
1068
|
field.setValue(newId);
|
|
1158
1069
|
}
|
|
@@ -1162,10 +1073,10 @@ class Block {
|
|
|
1162
1073
|
|
|
1163
1074
|
/**
|
|
1164
1075
|
* Returns the language-neutral value of the given field.
|
|
1165
|
-
* @param
|
|
1166
|
-
* @return
|
|
1076
|
+
* @param name The name of the field.
|
|
1077
|
+
* @return Value of the field or null if field does not exist.
|
|
1167
1078
|
*/
|
|
1168
|
-
getFieldValue(name) {
|
|
1079
|
+
getFieldValue(name: string): AnyDuringMigration {
|
|
1169
1080
|
const field = this.getField(name);
|
|
1170
1081
|
if (field) {
|
|
1171
1082
|
return field.getValue();
|
|
@@ -1175,10 +1086,10 @@ class Block {
|
|
|
1175
1086
|
|
|
1176
1087
|
/**
|
|
1177
1088
|
* Sets the value of the given field for this block.
|
|
1178
|
-
* @param
|
|
1179
|
-
* @param
|
|
1089
|
+
* @param newValue The value to set.
|
|
1090
|
+
* @param name The name of the field to set the value of.
|
|
1180
1091
|
*/
|
|
1181
|
-
setFieldValue(newValue, name) {
|
|
1092
|
+
setFieldValue(newValue: AnyDuringMigration, name: string) {
|
|
1182
1093
|
const field = this.getField(name);
|
|
1183
1094
|
if (!field) {
|
|
1184
1095
|
throw Error('Field "' + name + '" not found.');
|
|
@@ -1188,12 +1099,11 @@ class Block {
|
|
|
1188
1099
|
|
|
1189
1100
|
/**
|
|
1190
1101
|
* Set whether this block can chain onto the bottom of another block.
|
|
1191
|
-
* @param
|
|
1192
|
-
* @param
|
|
1193
|
-
*
|
|
1194
|
-
* 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.
|
|
1195
1105
|
*/
|
|
1196
|
-
setPreviousStatement(newBoolean, opt_check) {
|
|
1106
|
+
setPreviousStatement(newBoolean: boolean, opt_check?: string|string[]|null) {
|
|
1197
1107
|
if (newBoolean) {
|
|
1198
1108
|
if (opt_check === undefined) {
|
|
1199
1109
|
opt_check = null;
|
|
@@ -1211,19 +1121,20 @@ class Block {
|
|
|
1211
1121
|
'connection.');
|
|
1212
1122
|
}
|
|
1213
1123
|
this.previousConnection.dispose();
|
|
1214
|
-
|
|
1124
|
+
// AnyDuringMigration because: Type 'null' is not assignable to type
|
|
1125
|
+
// 'Connection'.
|
|
1126
|
+
this.previousConnection = null as AnyDuringMigration;
|
|
1215
1127
|
}
|
|
1216
1128
|
}
|
|
1217
1129
|
}
|
|
1218
1130
|
|
|
1219
1131
|
/**
|
|
1220
1132
|
* Set whether another block can chain onto the bottom of this block.
|
|
1221
|
-
* @param
|
|
1222
|
-
* @param
|
|
1223
|
-
*
|
|
1224
|
-
* 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.
|
|
1225
1136
|
*/
|
|
1226
|
-
setNextStatement(newBoolean, opt_check) {
|
|
1137
|
+
setNextStatement(newBoolean: boolean, opt_check?: string|string[]|null) {
|
|
1227
1138
|
if (newBoolean) {
|
|
1228
1139
|
if (opt_check === undefined) {
|
|
1229
1140
|
opt_check = null;
|
|
@@ -1241,19 +1152,20 @@ class Block {
|
|
|
1241
1152
|
'connection.');
|
|
1242
1153
|
}
|
|
1243
1154
|
this.nextConnection.dispose();
|
|
1244
|
-
|
|
1155
|
+
// AnyDuringMigration because: Type 'null' is not assignable to type
|
|
1156
|
+
// 'Connection'.
|
|
1157
|
+
this.nextConnection = null as AnyDuringMigration;
|
|
1245
1158
|
}
|
|
1246
1159
|
}
|
|
1247
1160
|
}
|
|
1248
1161
|
|
|
1249
1162
|
/**
|
|
1250
1163
|
* Set whether this block returns a value.
|
|
1251
|
-
* @param
|
|
1252
|
-
* @param
|
|
1253
|
-
*
|
|
1254
|
-
* (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).
|
|
1255
1167
|
*/
|
|
1256
|
-
setOutput(newBoolean, opt_check) {
|
|
1168
|
+
setOutput(newBoolean: boolean, opt_check?: string|string[]|null) {
|
|
1257
1169
|
if (newBoolean) {
|
|
1258
1170
|
if (opt_check === undefined) {
|
|
1259
1171
|
opt_check = null;
|
|
@@ -1270,28 +1182,30 @@ class Block {
|
|
|
1270
1182
|
'Must disconnect output value before removing connection.');
|
|
1271
1183
|
}
|
|
1272
1184
|
this.outputConnection.dispose();
|
|
1273
|
-
|
|
1185
|
+
// AnyDuringMigration because: Type 'null' is not assignable to type
|
|
1186
|
+
// 'Connection'.
|
|
1187
|
+
this.outputConnection = null as AnyDuringMigration;
|
|
1274
1188
|
}
|
|
1275
1189
|
}
|
|
1276
1190
|
}
|
|
1277
1191
|
|
|
1278
1192
|
/**
|
|
1279
1193
|
* Set whether value inputs are arranged horizontally or vertically.
|
|
1280
|
-
* @param
|
|
1194
|
+
* @param newBoolean True if inputs are horizontal.
|
|
1281
1195
|
*/
|
|
1282
|
-
setInputsInline(newBoolean) {
|
|
1196
|
+
setInputsInline(newBoolean: boolean) {
|
|
1283
1197
|
if (this.inputsInline !== newBoolean) {
|
|
1284
|
-
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))
|
|
1285
|
-
|
|
1198
|
+
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))!
|
|
1199
|
+
(this, 'inline', null, this.inputsInline, newBoolean));
|
|
1286
1200
|
this.inputsInline = newBoolean;
|
|
1287
1201
|
}
|
|
1288
1202
|
}
|
|
1289
1203
|
|
|
1290
1204
|
/**
|
|
1291
1205
|
* Get whether value inputs are arranged horizontally or vertically.
|
|
1292
|
-
* @return
|
|
1206
|
+
* @return True if inputs are horizontal.
|
|
1293
1207
|
*/
|
|
1294
|
-
getInputsInline() {
|
|
1208
|
+
getInputsInline(): boolean {
|
|
1295
1209
|
if (this.inputsInline !== undefined) {
|
|
1296
1210
|
// Set explicitly.
|
|
1297
1211
|
return this.inputsInline;
|
|
@@ -1316,47 +1230,47 @@ class Block {
|
|
|
1316
1230
|
|
|
1317
1231
|
/**
|
|
1318
1232
|
* Set the block's output shape.
|
|
1319
|
-
* @param
|
|
1233
|
+
* @param outputShape Value representing an output shape.
|
|
1320
1234
|
*/
|
|
1321
|
-
setOutputShape(outputShape) {
|
|
1235
|
+
setOutputShape(outputShape: number|null) {
|
|
1322
1236
|
this.outputShape_ = outputShape;
|
|
1323
1237
|
}
|
|
1324
1238
|
|
|
1325
1239
|
/**
|
|
1326
1240
|
* Get the block's output shape.
|
|
1327
|
-
* @return
|
|
1241
|
+
* @return Value representing output shape if one exists.
|
|
1328
1242
|
*/
|
|
1329
|
-
getOutputShape() {
|
|
1243
|
+
getOutputShape(): number|null {
|
|
1330
1244
|
return this.outputShape_;
|
|
1331
1245
|
}
|
|
1332
1246
|
|
|
1333
1247
|
/**
|
|
1334
1248
|
* Get whether this block is enabled or not.
|
|
1335
|
-
* @return
|
|
1249
|
+
* @return True if enabled.
|
|
1336
1250
|
*/
|
|
1337
|
-
isEnabled() {
|
|
1251
|
+
isEnabled(): boolean {
|
|
1338
1252
|
return !this.disabled;
|
|
1339
1253
|
}
|
|
1340
1254
|
|
|
1341
1255
|
/**
|
|
1342
1256
|
* Set whether the block is enabled or not.
|
|
1343
|
-
* @param
|
|
1257
|
+
* @param enabled True if enabled.
|
|
1344
1258
|
*/
|
|
1345
|
-
setEnabled(enabled) {
|
|
1259
|
+
setEnabled(enabled: boolean) {
|
|
1346
1260
|
if (this.isEnabled() !== enabled) {
|
|
1347
1261
|
const oldValue = this.disabled;
|
|
1348
1262
|
this.disabled = !enabled;
|
|
1349
|
-
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))
|
|
1350
|
-
|
|
1263
|
+
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))!
|
|
1264
|
+
(this, 'disabled', null, oldValue, !enabled));
|
|
1351
1265
|
}
|
|
1352
1266
|
}
|
|
1353
1267
|
|
|
1354
1268
|
/**
|
|
1355
1269
|
* Get whether the block is disabled or not due to parents.
|
|
1356
1270
|
* The block's own disabled property is not considered.
|
|
1357
|
-
* @return
|
|
1271
|
+
* @return True if disabled.
|
|
1358
1272
|
*/
|
|
1359
|
-
getInheritedDisabled() {
|
|
1273
|
+
getInheritedDisabled(): boolean {
|
|
1360
1274
|
let ancestor = this.getSurroundParent();
|
|
1361
1275
|
while (ancestor) {
|
|
1362
1276
|
if (ancestor.disabled) {
|
|
@@ -1370,32 +1284,32 @@ class Block {
|
|
|
1370
1284
|
|
|
1371
1285
|
/**
|
|
1372
1286
|
* Get whether the block is collapsed or not.
|
|
1373
|
-
* @return
|
|
1287
|
+
* @return True if collapsed.
|
|
1374
1288
|
*/
|
|
1375
|
-
isCollapsed() {
|
|
1289
|
+
isCollapsed(): boolean {
|
|
1376
1290
|
return this.collapsed_;
|
|
1377
1291
|
}
|
|
1378
1292
|
|
|
1379
1293
|
/**
|
|
1380
1294
|
* Set whether the block is collapsed or not.
|
|
1381
|
-
* @param
|
|
1295
|
+
* @param collapsed True if collapsed.
|
|
1382
1296
|
*/
|
|
1383
|
-
setCollapsed(collapsed) {
|
|
1297
|
+
setCollapsed(collapsed: boolean) {
|
|
1384
1298
|
if (this.collapsed_ !== collapsed) {
|
|
1385
|
-
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))
|
|
1386
|
-
|
|
1299
|
+
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))!
|
|
1300
|
+
(this, 'collapsed', null, this.collapsed_, collapsed));
|
|
1387
1301
|
this.collapsed_ = collapsed;
|
|
1388
1302
|
}
|
|
1389
1303
|
}
|
|
1390
1304
|
|
|
1391
1305
|
/**
|
|
1392
1306
|
* Create a human-readable text representation of this block and any children.
|
|
1393
|
-
* @param
|
|
1394
|
-
* @param
|
|
1395
|
-
*
|
|
1396
|
-
* @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.
|
|
1397
1311
|
*/
|
|
1398
|
-
toString(opt_maxLength, opt_emptyToken) {
|
|
1312
|
+
toString(opt_maxLength?: number, opt_emptyToken?: string): string {
|
|
1399
1313
|
let text = [];
|
|
1400
1314
|
const emptyFieldPlaceholder = opt_emptyToken || '?';
|
|
1401
1315
|
|
|
@@ -1408,10 +1322,10 @@ class Block {
|
|
|
1408
1322
|
|
|
1409
1323
|
/**
|
|
1410
1324
|
* Whether or not to add parentheses around an input.
|
|
1411
|
-
* @param
|
|
1412
|
-
* @return
|
|
1325
|
+
* @param connection The connection.
|
|
1326
|
+
* @return True if we should add parentheses around the input.
|
|
1413
1327
|
*/
|
|
1414
|
-
function shouldAddParentheses(connection) {
|
|
1328
|
+
function shouldAddParentheses(connection: Connection): boolean {
|
|
1415
1329
|
let checks = connection.getCheck();
|
|
1416
1330
|
if (!checks && connection.targetConnection) {
|
|
1417
1331
|
checks = connection.targetConnection.getCheck();
|
|
@@ -1420,12 +1334,10 @@ class Block {
|
|
|
1420
1334
|
(checks.indexOf('Boolean') !== -1 || checks.indexOf('Number') !== -1);
|
|
1421
1335
|
}
|
|
1422
1336
|
|
|
1423
|
-
/**
|
|
1424
|
-
* Check that we haven't circled back to the original root node.
|
|
1425
|
-
*/
|
|
1337
|
+
/** Check that we haven't circled back to the original root node. */
|
|
1426
1338
|
function checkRoot() {
|
|
1427
|
-
if (node && node.getType() === rootNode
|
|
1428
|
-
node.getLocation() === rootNode
|
|
1339
|
+
if (node && node.getType() === rootNode?.getType() &&
|
|
1340
|
+
node.getLocation() === rootNode?.getLocation()) {
|
|
1429
1341
|
node = null;
|
|
1430
1342
|
}
|
|
1431
1343
|
}
|
|
@@ -1434,7 +1346,7 @@ class Block {
|
|
|
1434
1346
|
while (node) {
|
|
1435
1347
|
switch (node.getType()) {
|
|
1436
1348
|
case ASTNode.types.INPUT: {
|
|
1437
|
-
const connection =
|
|
1349
|
+
const connection = node.getLocation() as Connection;
|
|
1438
1350
|
if (!node.in()) {
|
|
1439
1351
|
text.push(emptyFieldPlaceholder);
|
|
1440
1352
|
} else if (shouldAddParentheses(connection)) {
|
|
@@ -1443,7 +1355,7 @@ class Block {
|
|
|
1443
1355
|
break;
|
|
1444
1356
|
}
|
|
1445
1357
|
case ASTNode.types.FIELD: {
|
|
1446
|
-
const field =
|
|
1358
|
+
const field = node.getLocation() as Field;
|
|
1447
1359
|
if (field.name !== constants.COLLAPSED_FIELD_NAME) {
|
|
1448
1360
|
text.push(field.getText());
|
|
1449
1361
|
}
|
|
@@ -1462,8 +1374,7 @@ class Block {
|
|
|
1462
1374
|
checkRoot();
|
|
1463
1375
|
// If we hit an input on the way up, possibly close out parentheses.
|
|
1464
1376
|
if (node && node.getType() === ASTNode.types.INPUT &&
|
|
1465
|
-
shouldAddParentheses(
|
|
1466
|
-
/** @type {!Connection} */ (node.getLocation()))) {
|
|
1377
|
+
shouldAddParentheses(node.getLocation() as Connection)) {
|
|
1467
1378
|
text.push(')');
|
|
1468
1379
|
}
|
|
1469
1380
|
}
|
|
@@ -1487,17 +1398,23 @@ class Block {
|
|
|
1487
1398
|
}
|
|
1488
1399
|
|
|
1489
1400
|
// Join the text array, removing spaces around added parentheses.
|
|
1401
|
+
// AnyDuringMigration because: Type 'string' is not assignable to type
|
|
1402
|
+
// 'any[]'.
|
|
1490
1403
|
text = text.reduce(function(acc, value) {
|
|
1491
|
-
return acc + (
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
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() || '???';
|
|
1495
1409
|
if (opt_maxLength) {
|
|
1496
1410
|
// TODO: Improve truncation so that text from this block is given
|
|
1497
1411
|
// priority. E.g. "1+2+3+4+5+6+7+8+9=0" should be "...6+7+8+9=0", not
|
|
1498
1412
|
// "1+2+3+4+5...". E.g. "1+2+3+4+5=6+7+8+9+0" should be "...4+5=6+7...".
|
|
1499
1413
|
if (text.length > opt_maxLength) {
|
|
1500
|
-
|
|
1414
|
+
// AnyDuringMigration because: Type 'string' is not assignable to type
|
|
1415
|
+
// 'any[]'.
|
|
1416
|
+
text = (text.substring(0, opt_maxLength - 3) + '...') as
|
|
1417
|
+
AnyDuringMigration;
|
|
1501
1418
|
}
|
|
1502
1419
|
}
|
|
1503
1420
|
return text;
|
|
@@ -1505,40 +1422,40 @@ class Block {
|
|
|
1505
1422
|
|
|
1506
1423
|
/**
|
|
1507
1424
|
* Shortcut for appending a value input row.
|
|
1508
|
-
* @param
|
|
1509
|
-
*
|
|
1510
|
-
* @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.
|
|
1511
1428
|
*/
|
|
1512
|
-
appendValueInput(name) {
|
|
1429
|
+
appendValueInput(name: string): Input {
|
|
1513
1430
|
return this.appendInput_(inputTypes.VALUE, name);
|
|
1514
1431
|
}
|
|
1515
1432
|
|
|
1516
1433
|
/**
|
|
1517
1434
|
* Shortcut for appending a statement input row.
|
|
1518
|
-
* @param
|
|
1519
|
-
*
|
|
1520
|
-
* @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.
|
|
1521
1438
|
*/
|
|
1522
|
-
appendStatementInput(name) {
|
|
1439
|
+
appendStatementInput(name: string): Input {
|
|
1523
1440
|
return this.appendInput_(inputTypes.STATEMENT, name);
|
|
1524
1441
|
}
|
|
1525
1442
|
|
|
1526
1443
|
/**
|
|
1527
1444
|
* Shortcut for appending a dummy input row.
|
|
1528
|
-
* @param
|
|
1529
|
-
*
|
|
1530
|
-
* @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.
|
|
1531
1448
|
*/
|
|
1532
|
-
appendDummyInput(opt_name) {
|
|
1449
|
+
appendDummyInput(opt_name?: string): Input {
|
|
1533
1450
|
return this.appendInput_(inputTypes.DUMMY, opt_name || '');
|
|
1534
1451
|
}
|
|
1535
1452
|
|
|
1536
1453
|
/**
|
|
1537
1454
|
* Initialize this block using a cross-platform, internationalization-friendly
|
|
1538
1455
|
* JSON description.
|
|
1539
|
-
* @param
|
|
1456
|
+
* @param json Structured data describing the block.
|
|
1540
1457
|
*/
|
|
1541
|
-
jsonInit(json) {
|
|
1458
|
+
jsonInit(json: AnyDuringMigration) {
|
|
1542
1459
|
const warningPrefix = json['type'] ? 'Block "' + json['type'] + '": ' : '';
|
|
1543
1460
|
|
|
1544
1461
|
// Validate inputs.
|
|
@@ -1630,11 +1547,10 @@ class Block {
|
|
|
1630
1547
|
|
|
1631
1548
|
/**
|
|
1632
1549
|
* Initialize the colour of this block from the JSON description.
|
|
1633
|
-
* @param
|
|
1634
|
-
* @param
|
|
1635
|
-
* @private
|
|
1550
|
+
* @param json Structured data describing the block.
|
|
1551
|
+
* @param warningPrefix Warning prefix string identifying block.
|
|
1636
1552
|
*/
|
|
1637
|
-
jsonInitColour_(json, warningPrefix) {
|
|
1553
|
+
private jsonInitColour_(json: AnyDuringMigration, warningPrefix: string) {
|
|
1638
1554
|
if ('colour' in json) {
|
|
1639
1555
|
if (json['colour'] === undefined) {
|
|
1640
1556
|
console.warn(warningPrefix + 'Undefined colour value.');
|
|
@@ -1651,11 +1567,10 @@ class Block {
|
|
|
1651
1567
|
|
|
1652
1568
|
/**
|
|
1653
1569
|
* Initialize the style of this block from the JSON description.
|
|
1654
|
-
* @param
|
|
1655
|
-
* @param
|
|
1656
|
-
* @private
|
|
1570
|
+
* @param json Structured data describing the block.
|
|
1571
|
+
* @param warningPrefix Warning prefix string identifying block.
|
|
1657
1572
|
*/
|
|
1658
|
-
jsonInitStyle_(json, warningPrefix) {
|
|
1573
|
+
private jsonInitStyle_(json: AnyDuringMigration, warningPrefix: string) {
|
|
1659
1574
|
const blockStyleName = json['style'];
|
|
1660
1575
|
try {
|
|
1661
1576
|
this.setStyle(blockStyleName);
|
|
@@ -1670,10 +1585,10 @@ class Block {
|
|
|
1670
1585
|
* the block, including prototype values. This provides some insurance against
|
|
1671
1586
|
* mixin / extension incompatibilities with future block features. This check
|
|
1672
1587
|
* can be disabled by passing true as the second argument.
|
|
1673
|
-
* @param
|
|
1674
|
-
* @param
|
|
1588
|
+
* @param mixinObj The key/values pairs to add to this block object.
|
|
1589
|
+
* @param opt_disableCheck Option flag to disable overwrite checks.
|
|
1675
1590
|
*/
|
|
1676
|
-
mixin(mixinObj, opt_disableCheck) {
|
|
1591
|
+
mixin(mixinObj: AnyDuringMigration, opt_disableCheck?: boolean) {
|
|
1677
1592
|
if (opt_disableCheck !== undefined &&
|
|
1678
1593
|
typeof opt_disableCheck !== 'boolean') {
|
|
1679
1594
|
throw Error('opt_disableCheck must be a boolean if provided');
|
|
@@ -1681,7 +1596,7 @@ class Block {
|
|
|
1681
1596
|
if (!opt_disableCheck) {
|
|
1682
1597
|
const overwrites = [];
|
|
1683
1598
|
for (const key in mixinObj) {
|
|
1684
|
-
if (this[key] !== undefined) {
|
|
1599
|
+
if ((this as AnyDuringMigration)[key] !== undefined) {
|
|
1685
1600
|
overwrites.push(key);
|
|
1686
1601
|
}
|
|
1687
1602
|
}
|
|
@@ -1691,32 +1606,33 @@ class Block {
|
|
|
1691
1606
|
JSON.stringify(overwrites));
|
|
1692
1607
|
}
|
|
1693
1608
|
}
|
|
1694
|
-
|
|
1609
|
+
Object.assign(this, mixinObj);
|
|
1695
1610
|
}
|
|
1696
1611
|
|
|
1697
1612
|
/**
|
|
1698
1613
|
* Interpolate a message description onto the block.
|
|
1699
|
-
* @param
|
|
1700
|
-
*
|
|
1701
|
-
* @param
|
|
1702
|
-
* @param
|
|
1703
|
-
*
|
|
1704
|
-
* @param
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
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) {
|
|
1708
1624
|
const tokens = parsing.tokenizeInterpolation(message);
|
|
1709
1625
|
this.validateTokens_(tokens, args.length);
|
|
1710
1626
|
const elements = this.interpolateArguments_(tokens, args, lastDummyAlign);
|
|
1711
1627
|
|
|
1712
1628
|
// An array of [field, fieldName] tuples.
|
|
1713
1629
|
const fieldStack = [];
|
|
1714
|
-
for (let i = 0, element;
|
|
1630
|
+
for (let i = 0, element; element = elements[i]; i++) {
|
|
1715
1631
|
if (this.isInputKeyword_(element['type'])) {
|
|
1716
1632
|
const input = this.inputFromJson_(element, warningPrefix);
|
|
1717
1633
|
// Should never be null, but just in case.
|
|
1718
1634
|
if (input) {
|
|
1719
|
-
for (let j = 0, tuple;
|
|
1635
|
+
for (let j = 0, tuple; tuple = fieldStack[j]; j++) {
|
|
1720
1636
|
input.appendField(tuple[0], tuple[1]);
|
|
1721
1637
|
}
|
|
1722
1638
|
fieldStack.length = 0;
|
|
@@ -1736,11 +1652,10 @@ class Block {
|
|
|
1736
1652
|
* Validates that the tokens are within the correct bounds, with no
|
|
1737
1653
|
* duplicates, and that all of the arguments are referred to. Throws errors if
|
|
1738
1654
|
* any of these things are not true.
|
|
1739
|
-
* @param
|
|
1740
|
-
* @param
|
|
1741
|
-
* @private
|
|
1655
|
+
* @param tokens An array of tokens to validate
|
|
1656
|
+
* @param argsCount The number of args that need to be referred to.
|
|
1742
1657
|
*/
|
|
1743
|
-
validateTokens_(tokens
|
|
1658
|
+
private validateTokens_(tokens: Array<string|number>, argsCount: number) {
|
|
1744
1659
|
const visitedArgsHash = [];
|
|
1745
1660
|
let visitedArgsCount = 0;
|
|
1746
1661
|
for (let i = 0; i < tokens.length; i++) {
|
|
@@ -1772,15 +1687,15 @@ class Block {
|
|
|
1772
1687
|
* Inserts args in place of numerical tokens. String args are converted to
|
|
1773
1688
|
* JSON that defines a label field. If necessary an extra dummy input is added
|
|
1774
1689
|
* to the end of the elements.
|
|
1775
|
-
* @param
|
|
1776
|
-
* @param
|
|
1777
|
-
* @param
|
|
1778
|
-
*
|
|
1779
|
-
* @return
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
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[] {
|
|
1784
1699
|
const elements = [];
|
|
1785
1700
|
for (let i = 0; i < tokens.length; i++) {
|
|
1786
1701
|
let element = tokens[i];
|
|
@@ -1789,7 +1704,9 @@ class Block {
|
|
|
1789
1704
|
}
|
|
1790
1705
|
// Args can be strings, which is why this isn't elseif.
|
|
1791
1706
|
if (typeof element === 'string') {
|
|
1792
|
-
|
|
1707
|
+
// AnyDuringMigration because: Type '{ text: string; type: string; } |
|
|
1708
|
+
// null' is not assignable to type 'string | number'.
|
|
1709
|
+
element = this.stringToFieldJson_(element) as AnyDuringMigration;
|
|
1793
1710
|
if (!element) {
|
|
1794
1711
|
continue;
|
|
1795
1712
|
}
|
|
@@ -1798,10 +1715,12 @@ class Block {
|
|
|
1798
1715
|
}
|
|
1799
1716
|
|
|
1800
1717
|
const length = elements.length;
|
|
1801
|
-
if (length &&
|
|
1718
|
+
if (length &&
|
|
1719
|
+
!this.isInputKeyword_(
|
|
1720
|
+
(elements as AnyDuringMigration)[length - 1]['type'])) {
|
|
1802
1721
|
const dummyInput = {'type': 'input_dummy'};
|
|
1803
1722
|
if (lastDummyAlign) {
|
|
1804
|
-
dummyInput['align'] = lastDummyAlign;
|
|
1723
|
+
(dummyInput as AnyDuringMigration)['align'] = lastDummyAlign;
|
|
1805
1724
|
}
|
|
1806
1725
|
elements.push(dummyInput);
|
|
1807
1726
|
}
|
|
@@ -1813,13 +1732,11 @@ class Block {
|
|
|
1813
1732
|
* Creates a field from the JSON definition of a field. If a field with the
|
|
1814
1733
|
* given type cannot be found, this attempts to create a different field using
|
|
1815
1734
|
* the 'alt' property of the JSON definition (if it exists).
|
|
1816
|
-
* @param
|
|
1817
|
-
*
|
|
1818
|
-
* @return {?Field} The field defined by the JSON, or null if one
|
|
1819
|
-
* couldn't be created.
|
|
1820
|
-
* @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.
|
|
1821
1737
|
*/
|
|
1822
|
-
fieldFromJson_(element
|
|
1738
|
+
private fieldFromJson_(element: {alt?: string, type?: string, text?: string}):
|
|
1739
|
+
Field|null {
|
|
1823
1740
|
const field = fieldRegistry.fromJson(element);
|
|
1824
1741
|
if (!field && element['alt']) {
|
|
1825
1742
|
if (typeof element['alt'] === 'string') {
|
|
@@ -1834,14 +1751,14 @@ class Block {
|
|
|
1834
1751
|
/**
|
|
1835
1752
|
* Creates an input from the JSON definition of an input. Sets the input's
|
|
1836
1753
|
* check and alignment if they are provided.
|
|
1837
|
-
* @param
|
|
1838
|
-
* @param
|
|
1839
|
-
*
|
|
1840
|
-
* @return
|
|
1841
|
-
*
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
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 {
|
|
1845
1762
|
const alignmentLookup = {
|
|
1846
1763
|
'LEFT': Align.LEFT,
|
|
1847
1764
|
'RIGHT': Align.RIGHT,
|
|
@@ -1870,7 +1787,9 @@ class Block {
|
|
|
1870
1787
|
input.setCheck(element['check']);
|
|
1871
1788
|
}
|
|
1872
1789
|
if (element['align']) {
|
|
1873
|
-
const alignment =
|
|
1790
|
+
const alignment =
|
|
1791
|
+
(alignmentLookup as
|
|
1792
|
+
AnyDuringMigration)[element['align'].toUpperCase()];
|
|
1874
1793
|
if (alignment === undefined) {
|
|
1875
1794
|
console.warn(warningPrefix + 'Illegal align value: ', element['align']);
|
|
1876
1795
|
} else {
|
|
@@ -1882,12 +1801,11 @@ class Block {
|
|
|
1882
1801
|
|
|
1883
1802
|
/**
|
|
1884
1803
|
* Returns true if the given string matches one of the input keywords.
|
|
1885
|
-
* @param
|
|
1886
|
-
* @return
|
|
1887
|
-
*
|
|
1888
|
-
* @private
|
|
1804
|
+
* @param str The string to check.
|
|
1805
|
+
* @return True if the given string matches one of the input keywords, false
|
|
1806
|
+
* otherwise.
|
|
1889
1807
|
*/
|
|
1890
|
-
isInputKeyword_(str) {
|
|
1808
|
+
private isInputKeyword_(str: string): boolean {
|
|
1891
1809
|
return str === 'input_value' || str === 'input_statement' ||
|
|
1892
1810
|
str === 'input_dummy';
|
|
1893
1811
|
}
|
|
@@ -1895,12 +1813,10 @@ class Block {
|
|
|
1895
1813
|
/**
|
|
1896
1814
|
* Turns a string into the JSON definition of a label field. If the string
|
|
1897
1815
|
* becomes an empty string when trimmed, this returns null.
|
|
1898
|
-
* @param
|
|
1899
|
-
*
|
|
1900
|
-
* @return {?{text: string, type: string}} The JSON definition or null.
|
|
1901
|
-
* @private
|
|
1816
|
+
* @param str String to turn into the JSON definition of a label field.
|
|
1817
|
+
* @return The JSON definition or null.
|
|
1902
1818
|
*/
|
|
1903
|
-
stringToFieldJson_(str) {
|
|
1819
|
+
private stringToFieldJson_(str: string): {text: string, type: string}|null {
|
|
1904
1820
|
str = str.trim();
|
|
1905
1821
|
if (str) {
|
|
1906
1822
|
return {
|
|
@@ -1913,13 +1829,12 @@ class Block {
|
|
|
1913
1829
|
|
|
1914
1830
|
/**
|
|
1915
1831
|
* Add a value input, statement input or local variable to this block.
|
|
1916
|
-
* @param
|
|
1917
|
-
* @param
|
|
1918
|
-
*
|
|
1919
|
-
* @return
|
|
1920
|
-
* @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.
|
|
1921
1836
|
*/
|
|
1922
|
-
appendInput_(type, name) {
|
|
1837
|
+
protected appendInput_(type: number, name: string): Input {
|
|
1923
1838
|
let connection = null;
|
|
1924
1839
|
if (type === inputTypes.VALUE || type === inputTypes.STATEMENT) {
|
|
1925
1840
|
connection = this.makeConnection_(type);
|
|
@@ -1927,7 +1842,10 @@ class Block {
|
|
|
1927
1842
|
if (type === inputTypes.STATEMENT) {
|
|
1928
1843
|
this.statementInputCount++;
|
|
1929
1844
|
}
|
|
1930
|
-
|
|
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));
|
|
1931
1849
|
// Append input to list.
|
|
1932
1850
|
this.inputList.push(input);
|
|
1933
1851
|
return input;
|
|
@@ -1935,19 +1853,18 @@ class Block {
|
|
|
1935
1853
|
|
|
1936
1854
|
/**
|
|
1937
1855
|
* Move a named input to a different location on this block.
|
|
1938
|
-
* @param
|
|
1939
|
-
* @param
|
|
1940
|
-
* input
|
|
1941
|
-
* 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.
|
|
1942
1859
|
*/
|
|
1943
|
-
moveInputBefore(name, refName) {
|
|
1860
|
+
moveInputBefore(name: string, refName: string|null) {
|
|
1944
1861
|
if (name === refName) {
|
|
1945
1862
|
return;
|
|
1946
1863
|
}
|
|
1947
1864
|
// Find both inputs.
|
|
1948
1865
|
let inputIndex = -1;
|
|
1949
1866
|
let refIndex = refName ? -1 : this.inputList.length;
|
|
1950
|
-
for (let i = 0, input;
|
|
1867
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
1951
1868
|
if (input.name === name) {
|
|
1952
1869
|
inputIndex = i;
|
|
1953
1870
|
if (refIndex !== -1) {
|
|
@@ -1971,11 +1888,10 @@ class Block {
|
|
|
1971
1888
|
|
|
1972
1889
|
/**
|
|
1973
1890
|
* Move a numbered input to a different location on this block.
|
|
1974
|
-
* @param
|
|
1975
|
-
* @param
|
|
1976
|
-
* input.
|
|
1891
|
+
* @param inputIndex Index of the input to move.
|
|
1892
|
+
* @param refIndex Index of input that should be after the moved input.
|
|
1977
1893
|
*/
|
|
1978
|
-
moveNumberedInputBefore(inputIndex, refIndex) {
|
|
1894
|
+
moveNumberedInputBefore(inputIndex: number, refIndex: number) {
|
|
1979
1895
|
// Validate arguments.
|
|
1980
1896
|
if (inputIndex === refIndex) {
|
|
1981
1897
|
throw Error('Can\'t move input to itself.');
|
|
@@ -1998,15 +1914,14 @@ class Block {
|
|
|
1998
1914
|
|
|
1999
1915
|
/**
|
|
2000
1916
|
* Remove an input from this block.
|
|
2001
|
-
* @param
|
|
2002
|
-
* @param
|
|
2003
|
-
*
|
|
2004
|
-
*
|
|
2005
|
-
* 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.
|
|
2006
1921
|
* @throws {Error} if the input is not present and opt_quiet is not true.
|
|
2007
1922
|
*/
|
|
2008
|
-
removeInput(name, opt_quiet) {
|
|
2009
|
-
for (let i = 0, input;
|
|
1923
|
+
removeInput(name: string, opt_quiet?: boolean): boolean {
|
|
1924
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
2010
1925
|
if (input.name === name) {
|
|
2011
1926
|
if (input.type === inputTypes.STATEMENT) {
|
|
2012
1927
|
this.statementInputCount--;
|
|
@@ -2024,11 +1939,11 @@ class Block {
|
|
|
2024
1939
|
|
|
2025
1940
|
/**
|
|
2026
1941
|
* Fetches the named input object.
|
|
2027
|
-
* @param
|
|
2028
|
-
* @return
|
|
1942
|
+
* @param name The name of the input.
|
|
1943
|
+
* @return The input object, or null if input does not exist.
|
|
2029
1944
|
*/
|
|
2030
|
-
getInput(name) {
|
|
2031
|
-
for (let i = 0, input;
|
|
1945
|
+
getInput(name: string): Input|null {
|
|
1946
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
2032
1947
|
if (input.name === name) {
|
|
2033
1948
|
return input;
|
|
2034
1949
|
}
|
|
@@ -2039,76 +1954,75 @@ class Block {
|
|
|
2039
1954
|
|
|
2040
1955
|
/**
|
|
2041
1956
|
* Fetches the block attached to the named input.
|
|
2042
|
-
* @param
|
|
2043
|
-
* @return
|
|
2044
|
-
*
|
|
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.
|
|
2045
1960
|
*/
|
|
2046
|
-
getInputTargetBlock(name) {
|
|
1961
|
+
getInputTargetBlock(name: string): Block|null {
|
|
2047
1962
|
const input = this.getInput(name);
|
|
2048
1963
|
return input && input.connection && input.connection.targetBlock();
|
|
2049
1964
|
}
|
|
2050
1965
|
|
|
2051
1966
|
/**
|
|
2052
1967
|
* Returns the comment on this block (or null if there is no comment).
|
|
2053
|
-
* @return
|
|
1968
|
+
* @return Block's comment.
|
|
2054
1969
|
*/
|
|
2055
|
-
getCommentText() {
|
|
1970
|
+
getCommentText(): string|null {
|
|
2056
1971
|
return this.commentModel.text;
|
|
2057
1972
|
}
|
|
2058
1973
|
|
|
2059
1974
|
/**
|
|
2060
1975
|
* Set this block's comment text.
|
|
2061
|
-
* @param
|
|
1976
|
+
* @param text The text, or null to delete.
|
|
2062
1977
|
*/
|
|
2063
|
-
setCommentText(text) {
|
|
1978
|
+
setCommentText(text: string|null) {
|
|
2064
1979
|
if (this.commentModel.text === text) {
|
|
2065
1980
|
return;
|
|
2066
1981
|
}
|
|
2067
|
-
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))
|
|
2068
|
-
|
|
1982
|
+
eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))!
|
|
1983
|
+
(this, 'comment', null, this.commentModel.text, text));
|
|
2069
1984
|
this.commentModel.text = text;
|
|
2070
|
-
|
|
1985
|
+
// AnyDuringMigration because: Type 'string | null' is not assignable to
|
|
1986
|
+
// type 'string | Comment'.
|
|
1987
|
+
this.comment = text as AnyDuringMigration; // For backwards compatibility.
|
|
2071
1988
|
}
|
|
2072
1989
|
|
|
2073
1990
|
/**
|
|
2074
1991
|
* Set this block's warning text.
|
|
2075
|
-
* @param
|
|
2076
|
-
* @param
|
|
2077
|
-
*
|
|
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.
|
|
2078
1995
|
*/
|
|
2079
|
-
setWarningText(_text, _opt_id) {
|
|
2080
|
-
|
|
2081
|
-
}
|
|
1996
|
+
setWarningText(_text: string|null, _opt_id?: string) {}
|
|
1997
|
+
// NOP.
|
|
2082
1998
|
|
|
2083
1999
|
/**
|
|
2084
2000
|
* Give this block a mutator dialog.
|
|
2085
|
-
* @param
|
|
2086
|
-
* remove.
|
|
2001
|
+
* @param _mutator A mutator dialog instance or null to remove.
|
|
2087
2002
|
*/
|
|
2088
|
-
setMutator(_mutator) {
|
|
2089
|
-
|
|
2090
|
-
}
|
|
2003
|
+
setMutator(_mutator: Mutator) {}
|
|
2004
|
+
// NOP.
|
|
2091
2005
|
|
|
2092
2006
|
/**
|
|
2093
2007
|
* Return the coordinates of the top-left corner of this block relative to the
|
|
2094
2008
|
* drawing surface's origin (0,0), in workspace units.
|
|
2095
|
-
* @return
|
|
2009
|
+
* @return Object with .x and .y properties.
|
|
2096
2010
|
*/
|
|
2097
|
-
getRelativeToSurfaceXY() {
|
|
2011
|
+
getRelativeToSurfaceXY(): Coordinate {
|
|
2098
2012
|
return this.xy_;
|
|
2099
2013
|
}
|
|
2100
2014
|
|
|
2101
2015
|
/**
|
|
2102
2016
|
* Move a block by a relative offset.
|
|
2103
|
-
* @param
|
|
2104
|
-
* @param
|
|
2017
|
+
* @param dx Horizontal offset, in workspace units.
|
|
2018
|
+
* @param dy Vertical offset, in workspace units.
|
|
2105
2019
|
*/
|
|
2106
|
-
moveBy(dx, dy) {
|
|
2020
|
+
moveBy(dx: number, dy: number) {
|
|
2107
2021
|
if (this.parentBlock_) {
|
|
2108
2022
|
throw Error('Block has parent.');
|
|
2109
2023
|
}
|
|
2110
|
-
const event =
|
|
2111
|
-
new (eventUtils.get(eventUtils.BLOCK_MOVE))(this)
|
|
2024
|
+
const event =
|
|
2025
|
+
new (eventUtils.get(eventUtils.BLOCK_MOVE))!(this) as BlockMove;
|
|
2112
2026
|
this.xy_.translate(dx, dy);
|
|
2113
2027
|
event.recordNew();
|
|
2114
2028
|
eventUtils.fire(event);
|
|
@@ -2116,23 +2030,21 @@ class Block {
|
|
|
2116
2030
|
|
|
2117
2031
|
/**
|
|
2118
2032
|
* Create a connection of the specified type.
|
|
2119
|
-
* @param
|
|
2120
|
-
* @return
|
|
2121
|
-
* @protected
|
|
2033
|
+
* @param type The type of the connection to create.
|
|
2034
|
+
* @return A new connection of the specified type.
|
|
2122
2035
|
*/
|
|
2123
|
-
makeConnection_(type) {
|
|
2036
|
+
protected makeConnection_(type: number): Connection {
|
|
2124
2037
|
return new Connection(this, type);
|
|
2125
2038
|
}
|
|
2126
2039
|
|
|
2127
2040
|
/**
|
|
2128
2041
|
* Recursively checks whether all statement and value inputs are filled with
|
|
2129
2042
|
* blocks. Also checks all following statement blocks in this stack.
|
|
2130
|
-
* @param
|
|
2131
|
-
*
|
|
2132
|
-
*
|
|
2133
|
-
* @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.
|
|
2134
2046
|
*/
|
|
2135
|
-
allInputsFilled(opt_shadowBlocksAreFilled) {
|
|
2047
|
+
allInputsFilled(opt_shadowBlocksAreFilled?: boolean): boolean {
|
|
2136
2048
|
// Account for the shadow block filledness toggle.
|
|
2137
2049
|
if (opt_shadowBlocksAreFilled === undefined) {
|
|
2138
2050
|
opt_shadowBlocksAreFilled = true;
|
|
@@ -2142,7 +2054,7 @@ class Block {
|
|
|
2142
2054
|
}
|
|
2143
2055
|
|
|
2144
2056
|
// Recursively check each input block of the current block.
|
|
2145
|
-
for (let i = 0, input;
|
|
2057
|
+
for (let i = 0, input; input = this.inputList[i]; i++) {
|
|
2146
2058
|
if (!input.connection) {
|
|
2147
2059
|
continue;
|
|
2148
2060
|
}
|
|
@@ -2168,9 +2080,9 @@ class Block {
|
|
|
2168
2080
|
* Intended to on be used in console logs and errors. If you need a string
|
|
2169
2081
|
* that uses the user's native language (including block text, field values,
|
|
2170
2082
|
* and child blocks), use [toString()]{@link Block#toString}.
|
|
2171
|
-
* @return
|
|
2083
|
+
* @return The description.
|
|
2172
2084
|
*/
|
|
2173
|
-
toDevString() {
|
|
2085
|
+
toDevString(): string {
|
|
2174
2086
|
let msg = this.type ? '"' + this.type + '" block' : 'Block';
|
|
2175
2087
|
if (this.id) {
|
|
2176
2088
|
msg += ' (id="' + this.id + '")';
|
|
@@ -2179,33 +2091,12 @@ class Block {
|
|
|
2179
2091
|
}
|
|
2180
2092
|
}
|
|
2181
2093
|
|
|
2182
|
-
|
|
2183
|
-
|
|
2184
|
-
|
|
2185
|
-
|
|
2186
|
-
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
Block.CommentModel;
|
|
2190
|
-
|
|
2191
|
-
/**
|
|
2192
|
-
* An optional callback method to use whenever the block's parent workspace
|
|
2193
|
-
* changes. This is usually only called from the constructor, the block type
|
|
2194
|
-
* initializer function, or an extension initializer function.
|
|
2195
|
-
* @type {undefined|?function(Abstract)}
|
|
2196
|
-
*/
|
|
2197
|
-
Block.prototype.onchange;
|
|
2198
|
-
|
|
2199
|
-
/**
|
|
2200
|
-
* The language-neutral ID given to the collapsed input.
|
|
2201
|
-
* @const {string}
|
|
2202
|
-
*/
|
|
2203
|
-
Block.COLLAPSED_INPUT_NAME = constants.COLLAPSED_INPUT_NAME;
|
|
2204
|
-
|
|
2205
|
-
/**
|
|
2206
|
-
* The language-neutral ID given to the collapsed field.
|
|
2207
|
-
* @const {string}
|
|
2208
|
-
*/
|
|
2209
|
-
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
|
+
}
|
|
2210
2101
|
|
|
2211
|
-
|
|
2102
|
+
export type CommentModel = Block.CommentModel;
|