2020 * @author [email protected] (Alan Smith) 2121 */
2222import * as Blockly from 'blockly' ;
23+ import { Order } from 'blockly/python' ;
24+
2325import { MRC_STYLE_STEPS } from '../themes/styles' ;
2426import { ExtendedPythonGenerator } from '../editor/extended_python_generator' ;
2527import { createStepFieldFlydown } from '../fields/field_flydown' ;
@@ -75,6 +77,9 @@ const STEPS = {
7577 */
7678 mrcOnMutatorOpen : function ( this : StepsBlock ) : void {
7779 stepContainer . onMutatorOpen ( this ) ;
80+ } ,
81+ mrcOnChange : function ( this : StepsBlock ) : void {
82+
7883 } ,
7984 updateShape_ : function ( this : StepsBlock ) : void {
8085 // some way of knowing what was there before and what is there now
@@ -100,8 +105,39 @@ export const setup = function () {
100105} ;
101106
102107export const pythonFromBlock = function (
103- _block : StepsBlock ,
104- _generator : ExtendedPythonGenerator ,
108+ block : StepsBlock ,
109+ generator : ExtendedPythonGenerator ,
105110) {
106- return 'def steps(self):\n pass'
111+
112+ let code = 'def initialize_steps(self):\n' ;
113+ code += generator . INDENT + 'self.step_from_name = {}\n' ;
114+ code += generator . INDENT + 'self.name_from_step = {}\n' ;
115+ block . mrcStepNames . forEach ( ( stepName , index ) => {
116+ code += generator . INDENT + `self.step_from_name['${ stepName } '] = ${ index } \n` ;
117+ code += generator . INDENT + `self.name_from_step[${ index } ] = '${ stepName } '\n` ;
118+ } ) ;
119+
120+ code += generator . INDENT + 'self.current_step_index = 0\n' ;
121+ code += generator . INDENT + 'self.initialized = True\n' ;
122+
123+ generator . addClassMethodDefinition ( 'initialize_steps' , code ) ;
124+
125+ code = 'def steps(self):\n' ;
126+ code += generator . INDENT + 'if not self.initialized:\n' ;
127+ code += generator . INDENT . repeat ( 2 ) + 'self.initialize_steps()\n\n' ;
128+ code += generator . INDENT + 'match self.current_step_index:\n' ;
129+ block . mrcStepNames . forEach ( ( stepName , index ) => {
130+ code += generator . INDENT . repeat ( 2 ) + `case ${ index } : # ${ stepName } \n` ;
131+ let stepCode = generator . statementToCode ( block , 'STEP_' + index ) ;
132+ if ( stepCode !== '' ) {
133+ code += generator . prefixLines ( stepCode , generator . INDENT . repeat ( 2 ) ) ;
134+ }
135+ let conditionCode = generator . valueToCode ( block , 'CONDITION_' + index , Order . NONE ) || 'False' ;
136+ code += generator . INDENT . repeat ( 3 ) + 'if ' + conditionCode + ':\n' ;
137+ code += generator . INDENT . repeat ( 4 ) + 'self.current_step_index += 1\n' ;
138+ } ) ;
139+
140+ generator . addClassMethodDefinition ( 'steps' , code ) ;
141+
142+ return ''
107143}
0 commit comments