Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/ReckonPrimer.activity/exercises/exercise.py
blob: c3bfcc91ff3ca37e722925466d70a4256133095c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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', ' '])])