@@ -24,9 +24,18 @@ import * as Blockly from 'blockly/core';
2424import * as toolboxItems from './items' ;
2525import * as storageModule from '../storage/module' ;
2626import { MRC_CATEGORY_STYLE_METHODS } from '../themes/styles' ;
27- import { CLASS_NAME_ROBOT_BASE , CLASS_NAME_OPMODE , CLASS_NAME_MECHANISM } from '../blocks/utils/python' ;
27+ import {
28+ CLASS_NAME_MECHANISM ,
29+ CLASS_NAME_OPMODE ,
30+ CLASS_NAME_ROBOT_BASE ,
31+ MECHANISM_METHOD_NAMES_NOT_OVERRIDEABLE ,
32+ OPMODE_METHOD_NAMES_NOT_OVERRIDEABLE ,
33+ ROBOT_METHOD_NAMES_NOT_OVERRIDEABLE } from '../blocks/utils/python' ;
2834import { addInstanceWithinBlocks } from '../blocks/mrc_call_python_function' ;
29- import { createCustomMethodBlock , getBaseClassBlocks , FIELD_METHOD_NAME , createCustomMethodBlockWithReturn } from '../blocks/mrc_class_method_def' ;
35+ import {
36+ createCustomMethodBlock ,
37+ createCustomMethodBlockWithReturn ,
38+ getBaseClassBlocks } from '../blocks/mrc_class_method_def' ;
3039import { createStepsBlock } from '../blocks/mrc_steps' ;
3140import { Editor } from '../editor/editor' ;
3241
@@ -50,10 +59,6 @@ export function getCategory(editor: Editor): toolboxItems.Category {
5059}
5160
5261class MethodsCategory {
53- private robotClassBlocks = getBaseClassBlocks ( CLASS_NAME_ROBOT_BASE ) ;
54- private mechanismClassBlocks = getBaseClassBlocks ( CLASS_NAME_MECHANISM ) ;
55- private opmodeClassBlocks = getBaseClassBlocks ( CLASS_NAME_OPMODE ) ;
56-
5762 public methodsFlyout ( workspace : Blockly . WorkspaceSvg ) {
5863 const editor = Editor . getEditorForBlocklyWorkspace ( workspace ) ;
5964 if ( ! editor ) {
@@ -71,55 +76,34 @@ class MethodsCategory {
7176
7277 switch ( editor . getModuleType ( ) ) {
7378 case storageModule . ModuleType . ROBOT :
74- // TODO(lizlooney): We need a way to mark a method in python as not overridable.
75- // For example, in RobotBase, define_hardware, register_event_handler,
76- // unregister_event_handler, and fire_event should not be overridden in a user's robot.
77- const robotMethodNamesNotOverrideable : string [ ] = [
78- 'define_hardware' ,
79- 'fire_event' ,
80- 'register_event_handler' ,
81- 'unregister_event_handler' ,
82- ] ;
8379 // Add the methods for a Robot.
84- this . addClassBlocksForCurrentModule (
85- Blockly . Msg [ 'MORE_ROBOT_METHODS_LABEL' ] , this . robotClassBlocks , robotMethodNamesNotOverrideable ,
86- methodNamesAlreadyOverridden , contents ) ;
80+ this . addBaseClassBlocksForCurrentModule (
81+ workspace , Blockly . Msg [ 'MORE_ROBOT_METHODS_LABEL' ] , CLASS_NAME_ROBOT_BASE ,
82+ ROBOT_METHOD_NAMES_NOT_OVERRIDEABLE , methodNamesAlreadyOverridden , contents ) ;
8783 break ;
8884 case storageModule . ModuleType . MECHANISM :
89- // TODO(lizlooney): We need a way to mark a method in python as not overridable.
90- // For example, in Mechanism, register_event_handler, unregister_event_handler, and
91- // fire_event should not be overridden in a user's mechamism.
92- const mechanismMethodNamesNotOverrideable : string [ ] = [
93- 'fire_event' ,
94- 'register_event_handler' ,
95- 'unregister_event_handler' ,
96- ] ;
9785 // Add the methods for a Mechanism.
98- this . addClassBlocksForCurrentModule (
99- Blockly . Msg [ 'MORE_MECHANISM_METHODS_LABEL' ] , this . mechanismClassBlocks , mechanismMethodNamesNotOverrideable ,
100- methodNamesAlreadyOverridden , contents ) ;
86+ this . addBaseClassBlocksForCurrentModule (
87+ workspace , Blockly . Msg [ 'MORE_MECHANISM_METHODS_LABEL' ] , CLASS_NAME_MECHANISM ,
88+ MECHANISM_METHOD_NAMES_NOT_OVERRIDEABLE , methodNamesAlreadyOverridden , contents ) ;
10189 break ;
10290 case storageModule . ModuleType . OPMODE :
10391 const hasSteps = editor . isStepsInWorkspace ( ) ;
10492 if ( ! hasSteps ) {
10593 contents . push ( createStepsBlock ( ) ) ;
10694 }
10795 // Add the methods for an OpMode.
108- this . addClassBlocksForCurrentModule (
109- Blockly . Msg [ 'MORE_OPMODE_METHODS_LABEL' ] , this . opmodeClassBlocks , [ ] ,
110- methodNamesAlreadyOverridden , contents ) ;
96+ this . addBaseClassBlocksForCurrentModule (
97+ workspace , Blockly . Msg [ 'MORE_OPMODE_METHODS_LABEL' ] , CLASS_NAME_OPMODE ,
98+ OPMODE_METHOD_NAMES_NOT_OVERRIDEABLE , methodNamesAlreadyOverridden , contents ) ;
11199 break ;
112100 }
113101
114102 // Add a block that lets the user define a new method.
115103 contents . push (
116- {
117- kind : 'label' ,
118- text : Blockly . Msg [ 'CUSTOM_METHODS_LABEL' ] ,
119- } ,
120- createCustomMethodBlock ( ) ,
121- createCustomMethodBlockWithReturn ( )
122- ) ;
104+ new toolboxItems . Label ( Blockly . Msg [ 'CUSTOM_METHODS_LABEL' ] ) ,
105+ createCustomMethodBlock ( ) ,
106+ createCustomMethodBlockWithReturn ( ) ) ;
123107
124108 // Get blocks for calling methods defined in the current workspace.
125109 const methodsFromWorkspace = editor . getMethodsForWithinFromWorkspace ( ) ;
@@ -132,31 +116,16 @@ class MethodsCategory {
132116 return toolboxInfo ;
133117 }
134118
135- private addClassBlocksForCurrentModule (
136- label : string , classBlocks : toolboxItems . Block [ ] ,
137- methodNamesNotOverrideable : string [ ] ,
138- methodNamesAlreadyOverridden : string [ ] , contents : toolboxItems . ContentsType [ ] ) {
139- let labelAdded = false ;
140- for ( const blockInfo of classBlocks ) {
141- if ( blockInfo . fields ) {
142- const methodName = blockInfo . fields [ FIELD_METHOD_NAME ] ;
143- if ( methodNamesNotOverrideable . includes ( methodName ) ) {
144- continue ;
145- }
146- if ( methodNamesAlreadyOverridden . includes ( methodName ) ) {
147- continue ;
148- }
149- if ( ! labelAdded ) {
150- contents . push (
151- {
152- kind : 'label' ,
153- text : label ,
154- } ,
155- ) ;
156- labelAdded = true ;
157- }
158- contents . push ( blockInfo ) ;
159- }
119+ private addBaseClassBlocksForCurrentModule (
120+ workspace : Blockly . WorkspaceSvg , label : string , baseClassName : string ,
121+ methodNamesNotOverrideable : string [ ] , methodNamesAlreadyOverridden : string [ ] ,
122+ contents : toolboxItems . ContentsType [ ] ) {
123+ const baseClassBlocks : toolboxItems . ContentsType [ ] = getBaseClassBlocks (
124+ workspace , baseClassName , methodNamesNotOverrideable , methodNamesAlreadyOverridden ) ;
125+ if ( baseClassBlocks . length ) {
126+ contents . push (
127+ new toolboxItems . Label ( label ) ,
128+ ...baseClassBlocks ) ;
160129 }
161130 }
162131}
0 commit comments