Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Bender <walter.bender@gmail.com>2011-10-10 19:14:37 (GMT)
committer Walter Bender <walter.bender@gmail.com>2011-10-10 19:14:37 (GMT)
commit5ead9599e1db9459f5a40363824c86321a6a6a41 (patch)
tree9bea7f4eea3fcce61d1b74506409eedc6959caae
parent3c6433be379c19c38d9d4e7977938d96ae6d5bf1 (diff)
fixed save/restore; added rod tallies to Soroban
-rw-r--r--AbacusActivity.py105
-rw-r--r--abacus_window.py73
2 files changed, 98 insertions, 80 deletions
diff --git a/AbacusActivity.py b/AbacusActivity.py
index 67b7302..a96264d 100644
--- a/AbacusActivity.py
+++ b/AbacusActivity.py
@@ -266,46 +266,46 @@ class AbacusActivity(activity.Activity):
self.abacus = Abacus(canvas, self)
# Read the current mode from the Journal
- try:
+ if 'rods' in self.metadata:
self._rods_spin.set_value(int(self.metadata['rods']))
+ if 'top' in self.metadata:
self._top_spin.set_value(int(self.metadata['top']))
+ if 'bottom' in self.metadata:
self._bottom_spin.set_value(int(self.metadata['bottom']))
- self._value_spin.set_value(int(self._metadata['factor']))
+ if 'factor' in self.metadata:
+ self._value_spin.set_value(int(self.metadata['factor']))
+ if 'base' in self.metadata:
self._base_spin.set_value(int(self.metadata['base']))
- except:
- pass
- try:
- if self.metadata['abacus'] == 'suanpan':
- self._chinese_cb(None)
+ if 'abacus' in self.metadata:
+ _logger.debug('restoring %s', self.metadata['abacus'])
+ if self.metadata['abacus'] == 'suanpan':
+ self._chinese_cb()
elif self.metadata['abacus'] == 'soroban':
- self._japanese_cb(None)
+ self._japanese_cb()
elif self.metadata['abacus'] == 'schety':
- self._russian_cb(None)
+ self._russian_cb()
elif self.metadata['abacus'] == 'nepohualtzintzin':
- self._mayan_cb(None)
+ self._mayan_cb()
elif self.metadata['abacus'] == 'binary':
- self._binary_cb(None)
+ self._binary_cb()
elif self.metadata['abacus'] == 'hexadecimal':
- self._hex_cb(None)
+ self._hex_cb()
elif self.metadata['abacus'] == 'fraction':
- self._fraction_cb(None)
+ self._fraction_cb()
elif self.metadata['abacus'] == 'caacupe':
- self._caacupe_cb(None)
+ self._caacupe_cb()
elif self.metadata['abacus'] == 'cuisenaire':
- self._cuisenaire_cb(None)
+ self._cuisenaire_cb()
elif self.metadata['abacus'] == 'decimal':
- self._decimal_cb(None)
+ self._decimal_cb()
elif self.metadata['abacus'] == 'custom':
- self._custom_cb(None)
+ self._custom_cb()
else:
- self._chinese_cb(None)
- except:
- pass
- try:
- self.abacus.mode.set_value(self.metadata['value'])
- self.abacus.mode.label(self.abacus.generate_label())
- except:
- pass
+ self._chinese_cb()
+ if 'value' in self.metadata:
+ _logger.debug('restoring value %s', self.metadata['value'])
+ self.abacus.mode.set_value(self.metadata['value'])
+ self.abacus.mode.label(self.abacus.generate_label())
def _all_off(self):
""" Set all icons to 'off' and hide all of the abacuses """
@@ -342,7 +342,7 @@ class AbacusActivity(activity.Activity):
if self.abacus.custom is not None:
self.abacus.custom.hide()
- def _reset_cb(self, button):
+ def _reset_cb(self, button=None):
self.abacus.mode.reset_abacus()
self.abacus.mode.label(self.abacus.generate_label())
@@ -355,22 +355,22 @@ class AbacusActivity(activity.Activity):
self.abacus.mode.show()
_logger.debug("Setting mode to %s" % (self.abacus.mode.name))
- def _rods_spin_cb(self, button):
+ def _rods_spin_cb(self, button=None):
return
- def _top_spin_cb(self, button):
+ def _top_spin_cb(self, button=None):
return
- def _bottom_spin_cb(self, button):
+ def _bottom_spin_cb(self, button=None):
return
- def _value_spin_cb(self, button):
+ def _value_spin_cb(self, button=None):
return
- def _base_spin_cb(self, button):
+ def _base_spin_cb(self, button=None):
return
- def _custom_cb(self, button):
+ def _custom_cb(self, button=None):
""" Display the custom abacus; hide the others """
value = float(self.abacus.mode.value(count_beads=False))
if self.abacus.custom is not None:
@@ -386,7 +386,7 @@ class AbacusActivity(activity.Activity):
self.abacus.mode.set_value_from_number(value)
self.abacus.mode.label(self.abacus.generate_label())
- def _chinese_cb(self, button):
+ def _chinese_cb(self, button=None):
""" Display the suanpan; hide the others """
value = float(self.abacus.mode.value(count_beads=False))
if self.abacus.chinese is None:
@@ -396,7 +396,7 @@ class AbacusActivity(activity.Activity):
self.abacus.mode.set_value_from_number(value)
self.abacus.mode.label(self.abacus.generate_label())
- def _japanese_cb(self, button):
+ def _japanese_cb(self, button=None):
""" Display the soroban; hide the others """
value = float(self.abacus.mode.value(count_beads=False))
if self.abacus.japanese is None:
@@ -406,14 +406,14 @@ class AbacusActivity(activity.Activity):
self.abacus.mode.set_value_from_number(value)
self.abacus.mode.label(self.abacus.generate_label())
- def _russian_cb(self, button):
+ def _russian_cb(self, button=None):
""" Display the schety; hide the others """
if self.abacus.russian is None:
self.abacus.russian = Schety(self.abacus)
self._select_abacus(self.russian, self.abacus.russian.name+"-on",
self.abacus.russian)
- def _mayan_cb(self, button):
+ def _mayan_cb(self, button=None):
""" Display the nepohualtzintzin; hide the others """
value = float(self.abacus.mode.value(count_beads=False))
if self.abacus.mayan is None:
@@ -423,7 +423,7 @@ class AbacusActivity(activity.Activity):
self.abacus.mode.set_value_from_number(value)
self.abacus.mode.label(self.abacus.generate_label())
- def _binary_cb(self, button):
+ def _binary_cb(self, button=None):
""" Display the binary; hide the others """
value = float(self.abacus.mode.value(count_beads=False))
if self.abacus.binary is None:
@@ -433,7 +433,7 @@ class AbacusActivity(activity.Activity):
self.abacus.mode.set_value_from_number(value)
self.abacus.mode.label(self.abacus.generate_label())
- def _hex_cb(self, button):
+ def _hex_cb(self, button=None):
""" Display the hex; hide the others """
value = float(self.abacus.mode.value(count_beads=False))
if self.abacus.hex is None:
@@ -443,7 +443,7 @@ class AbacusActivity(activity.Activity):
self.abacus.mode.set_value_from_number(value)
self.abacus.mode.label(self.abacus.generate_label())
- def _decimal_cb(self, button):
+ def _decimal_cb(self, button=None):
""" Display the decimal; hide the others """
value = float(self.abacus.mode.value(count_beads=False))
if self.abacus.decimal is None:
@@ -453,21 +453,21 @@ class AbacusActivity(activity.Activity):
self.abacus.mode.set_value_from_number(value)
self.abacus.mode.label(self.abacus.generate_label())
- def _fraction_cb(self, button):
+ def _fraction_cb(self, button=None):
""" Display the fraction; hide the others """
if self.abacus.fraction is None:
self.abacus.fraction = Fractions(self.abacus)
self._select_abacus(self.fraction, self.abacus.fraction.name+"-on",
self.abacus.fraction)
- def _caacupe_cb(self, button):
+ def _caacupe_cb(self, button=None):
""" Display the Caacupe; hide the others """
if self.abacus.caacupe is None:
self.abacus.caacupe = Caacupe(self.abacus)
self._select_abacus(self.caacupe, self.abacus.caacupe.name+"-on",
self.abacus.caacupe)
- def _cuisenaire_cb(self, button):
+ def _cuisenaire_cb(self, button=None):
""" Display Cuisenaire-like rods; hide the others """
if self.abacus.cuisenaire is None:
self.abacus.cuisenaire = Cuisenaire(self.abacus)
@@ -497,16 +497,13 @@ class AbacusActivity(activity.Activity):
def write_file(self, file_path):
""" Write the bead positions to the Journal """
- _logger.debug("Saving current abacus to Journal: %s " % (
- self.abacus.mode.name))
- try:
- self.metadata['abacus'] = self.abacus.mode.name
- self.metadata['value'] = self.abacus.mode.value(True)
- self.metadata['rods'] = str(self._rods_spin.get_value_as_int())
- self.metadata['top'] = str(self._top_spin.get_value_as_int())
- self.metadata['bottom'] = str(self._bottom_spin.get_value_as_int())
- self.metadata['factor'] = str(self._value_spin.get_value_as_int())
- self.metadata['base'] = str(self._base_spin.get_value_as_int())
- except:
- pass
+ _logger.debug("Saving current abacus to Journal: %s %s" % (
+ self.abacus.mode.name, self.abacus.mode.value(True)))
+ self.metadata['abacus'] = self.abacus.mode.name
+ self.metadata['value'] = self.abacus.mode.value(True)
+ self.metadata['rods'] = str(self._rods_spin.get_value_as_int())
+ self.metadata['top'] = str(self._top_spin.get_value_as_int())
+ self.metadata['bottom'] = str(self._bottom_spin.get_value_as_int())
+ self.metadata['factor'] = str(self._value_spin.get_value_as_int())
+ self.metadata['base'] = str(self._base_spin.get_value_as_int())
diff --git a/abacus_window.py b/abacus_window.py
index ca3a9cf..580d89b 100644
--- a/abacus_window.py
+++ b/abacus_window.py
@@ -280,6 +280,7 @@ class Rod():
self.sprites = sprites
self.spr = Sprite(sprites, x, y, _svg_str_to_pixbuf(rod))
self.spr.type = 'frame'
+ self.show_labels = False
self.beads = []
self.lozenge = False
self.white_beads = []
@@ -309,6 +310,17 @@ class Rod():
_svg_bead(COLORS[i], '#000000', stretch=bead_scale) + \
_svg_footer()))
+ bo = (BWIDTH - BOFFSET) * self.scale / 2
+ ro = (BWIDTH + 5) * self.scale / 2
+ self.label = Sprite(self.sprites, x - bo, y + self.spr.rect[3],
+ _svg_str_to_pixbuf(
+ _svg_header(BWIDTH, BHEIGHT, self.scale, stretch=1.0) + \
+ _svg_rect(BWIDTH, BHEIGHT, 0, 0, 0, 0, 'none', 'none') + \
+ _svg_footer()))
+ self.label.type = 'frame'
+ self.label.set_label_color('#FFFFFF')
+ self.label.set_layer(MARK_LAYER)
+
def allocate_beads(self, top_beads, bot_beads, top_factor,
bead_value, bot_size, color=False, middle_black=False,
all_black=False, tristate=False):
@@ -319,6 +331,9 @@ class Rod():
self.top_factor = top_factor
self.fade = False
+ if self.top_beads > 0:
+ self.show_labels = True
+
x = self.spr.rect[0]
y = self.spr.rect[1]
dx = (BWIDTH + BOFFSET) * self.scale
@@ -388,15 +403,19 @@ class Rod():
for bead in self.beads:
bead.set_label_color(LABELS[self.index])
+
def hide(self):
for bead in self.beads:
bead.hide()
self.spr.hide()
+ self.label.hide()
def show(self):
for bead in self.beads:
bead.show()
self.spr.set_layer(ROD_LAYER)
+ if self.show_labels:
+ self.label.set_layer(MARK_LAYER)
def get_max_value(self):
''' Returns maximum numeric value for this rod '''
@@ -451,6 +470,11 @@ class Rod():
for i in range(bot):
self.beads[self.top_beads + i].move_up()
+ if value > 0:
+ self.label.set_label(self.get_bead_count())
+ else:
+ self.label.set_label('')
+
def reset(self):
# Clear the top.
for i in range(self.top_beads):
@@ -461,6 +485,8 @@ class Rod():
if self.beads[self.top_beads + i].get_state() == 1:
self.beads[self.top_beads + i].move_down()
+ self.label.set_label('')
+
def fade_colors(self):
''' Reduce the saturation level of every bead. '''
if self.fade:
@@ -545,6 +571,8 @@ class Rod():
if self.fade and bead.max_fade_level > 0:
self.beads[i + ii].set_color(self.white_beads[3])
self.beads[i + ii].move_down()
+
+ self.label.set_label(self.get_bead_count())
return True
@@ -797,10 +825,8 @@ class AbacusGeneric():
def create(self, dots=False):
''' Create and position the sprites that compose the abacus '''
-
# Width is a function of the number of rods
self.frame_width = self.num_rods * (BWIDTH + BOFFSET) + FSTROKE * 2
-
# Height is a function of the number of beads
if self.top_beads > 0:
self.frame_height = (self.bot_beads + self.top_beads + 5) * \
@@ -825,7 +851,7 @@ class AbacusGeneric():
_svg_str_to_pixbuf(frame))
self.frame.type = 'frame'
- # Some abaci use a dot to show the units position
+ # Some abaci (Soroban) use a dot to show the units position
if dots:
dx = (BWIDTH + BOFFSET) * self.abacus.scale
dotx = int(self.abacus.width / 2) - 5
@@ -844,7 +870,7 @@ class AbacusGeneric():
black_dot = _svg_header(10, 10, self.abacus.scale) + \
_svg_rect(10, 10, 3, 3, 0, 0, '#282828', '#FFFFFF') + \
_svg_footer()
- for i in range(int(self.num_rods / 4 - 1)):
+ for i in range(int(self.num_rods / 4 - 1)): # mark 1000s
self.dots.append(Sprite(self.abacus.sprites,
dotx - 3 * (i + 1) * dx, doty[0],
_svg_str_to_pixbuf(black_dot)))
@@ -950,24 +976,19 @@ class AbacusGeneric():
def set_value(self, string):
''' Set abacus to value in string '''
_logger.debug('restoring %s: [%s]' % (self.name, string))
- # String has two bytes per column.
- value = []
- for r in range(self.num_rods):
- value.append(0)
-
- # Convert string to column values
- if len(string) == 2 * self.num_rods:
- for i in range(self.num_rods):
- value[self.num_rods - i - 1] = int(
- string[2 * self.num_rods - i * 2 - 2:
- 2 * self.num_rods - i * 2])
- else:
- _logger.debug('bad saved string %s (%d != 2 * %d)' % (
- string, len(string), self.num_rods))
+ value = string.split()
# Move the beads to correspond to column values.
- for i, rod in enumerate(self.num_rods):
- rod.set_value(value[r])
+ try:
+ for i, rod in enumerate(self.rods):
+ _logger.debug('setting rod %d to value %d', i, value[i])
+ rod.set_value(int(value[i]))
+ except IndexError:
+ _logger.debug('bad saved string length %s (%d != 2 * %d)',
+ string, len(string), self.num_rods)
+ except TypeError:
+ _logger.debug('bad saved string type %s (%s)',
+ string, str(value[i]))
def max_value(self):
''' Maximum value possible on abacus '''
@@ -996,17 +1017,17 @@ class AbacusGeneric():
if count_beads:
# Save the value associated with each rod as a 2-byte integer.
string = ''
- v = []
+ value = []
for r in range(self.num_rods + 1): # +1 for overflow
- v.append(0)
+ value.append(0)
# Tally the values on each rod.
- for rod in self.rods:
- v[r + 1] = self.rods.get_bead_count()
+ for r, rod in enumerate(self.rods):
+ value[r + 1] = rod.get_bead_count()
# Save the value associated with each rod as a 2-byte integer.
- for j in v[1:]:
- string += '%2d' % (j)
+ for j in value[1:]:
+ string += '%2d ' % (j)
else:
rod_sum = 0
for rod in self.rods: