Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/ReckonPrimer.activity/exercises/exercise.py
diff options
context:
space:
mode:
Diffstat (limited to 'ReckonPrimer.activity/exercises/exercise.py')
-rwxr-xr-xReckonPrimer.activity/exercises/exercise.py96
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', ' '])])
+