diff options
author | Walter 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) |
commit | 5ead9599e1db9459f5a40363824c86321a6a6a41 (patch) | |
tree | 9bea7f4eea3fcce61d1b74506409eedc6959caae | |
parent | 3c6433be379c19c38d9d4e7977938d96ae6d5bf1 (diff) |
fixed save/restore; added rod tallies to Soroban
-rw-r--r-- | AbacusActivity.py | 105 | ||||
-rw-r--r-- | abacus_window.py | 73 |
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: |