diff options
Diffstat (limited to 'ReckonPrimer.activity/exercises/exercise.py')
-rwxr-xr-x | ReckonPrimer.activity/exercises/exercise.py | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/ReckonPrimer.activity/exercises/exercise.py b/ReckonPrimer.activity/exercises/exercise.py new file mode 100755 index 0000000..c3bfcc9 --- /dev/null +++ b/ReckonPrimer.activity/exercises/exercise.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +from functions import contain, collect_digits, make_line, make_input +from functions import make_line_remainder, make_input_remainder + +class Exercise: + + EXERCISES = {} + + """This is the base class for the individual exercises. + An exercise is characterized by a topic. A topic determines the + fields of the settings self._sett and public methods of Exercise. + The values of self._sett may vary from exercise to exercise. + """ + def __init__(self): + """ An Exercise stores data on evaluation, i.e date, duration TODO. + The preliminary format deals with errors only and is + [(None, errors), (settings, errors)], where None indicates, + that the settings are not changed by the Learner, + and settings indicates updates done by the Learner. + The list allows to append the current errors to the previous ones, + and even to do an Exercise subsequently several times; + thus the most recent errors are at the end of the list. """ + self._eval = [] + """ The settings determine the generation of calculations. + The fields of the settings are determined by self._sett['topic']; + the values of the settings are different for different Exercises. + self._sett['calclines'] determines the # of lines in a calculation.""" + self._sett = None + """ Calculations are generated according to the settings. """ + self._calcs = None + """ An Exercise needs the Display for updating the settings""" + self._display = None + + def get_setting(self): + return self._sett + + def update_setting(self, sett): + """ Update the settings and generate calculations accordingly. """ + self._sett = sett + self._calcs = self._generate_calcs() + + def get_calcs(self): + """ Get all calculations generated by the current settings. """ + return self._calcs + + def get_next_calc(self): + """ Get the next calculation from the Exercise. + TODO.WN091123: handle exception after last exercise. """ + return (self._calcs).pop() + + def count(self): + """ Return the number of calculations generated by + the current settings """ + return len(self._calcs) + + #===== methods of subclasses different for topic-specific settings + def format(self, calc): + """ Prepare the representation of a calculation for Display. + This method is public for eventual use on calculations + coming through the net (TODO cooperative games, etc)""" + pass + + def _generate_calcs(self): + """ Generate calculations according to topic-specific settings. + Called on each call of update_setting""" + pass + + def define_buttons(self): + """ Define buttons for update settings including callbacks. + The widgets are local to exerc-instances and attached to the display: + # self.butt.connect('toggled',self.butt_callback) + # self._display.settings_table.attach(self.butt, 1,2,3,4) + And the callbacks run locally, but read and write in the display: + # def butt_callback(self, widget) + # if widget.get_active(): + # self._display._sett['+'] = True + """ + pass + + def set_buttons(self, sett): + """ Display buttons according to the current setting sett. """ + pass + + #===== methods is used by more than one subclass + def format_addsub_simp(self, (calc, linepos)): + """ Prepare the representation of a calculation for Display + on 1 line. Used within several subclasses. """ + #@print('in Display.format_addsub_simp: calc=', (calc, linepos))#@ + _ccs = collect_digits(calc) + #print('in Exercise.format_addsub_simp: _ccs=',_ccs ) + _l0 = make_line(_ccs, linepos) + _ip = make_input(_ccs, linepos) + #@print('in Display.format_addsub_simp: return=', ([_l0], _ip)) #@ + return ([_l0], _ip) +#return ([[' ', '1', '0', ' ', '-', ' ', '7', ' ', '=', ' ', '_', ' ']], [(0, 10, '3', ' 10 - 7 = _ ', ' 10 - 7 = 3 ', [' ', '1', '0', ' ', '-', ' ', '7', ' ', '=', ' ', '3', ' '])]) + |