diff options
author | Walter Bender <walter@sugarlabs.org> | 2010-05-30 00:44:39 (GMT) |
---|---|---|
committer | Walter Bender <walter@sugarlabs.org> | 2010-05-30 00:44:39 (GMT) |
commit | 87e597379a2be4059fdd8fa3271d4cf7eed3c43d (patch) | |
tree | 8f751db40c85eda6ca9ca36873e158296dc2f540 | |
parent | d1f977f78f9e162a4552c5fea64c4441ac8d47f2 (diff) |
added fraction
-rw-r--r-- | AbacusActivity.py | 52 | ||||
-rw-r--r-- | NEWS | 1 | ||||
-rwxr-xr-x | abacus.py | 41 | ||||
-rw-r--r-- | abacus_window.py | 95 |
4 files changed, 80 insertions, 109 deletions
diff --git a/AbacusActivity.py b/AbacusActivity.py index 78efdd7..cab20d0 100644 --- a/AbacusActivity.py +++ b/AbacusActivity.py @@ -34,7 +34,6 @@ from sugar.datastore import datastore from gettext import gettext as _ import locale -import os.path import logging _logger = logging.getLogger("abacus-activity") @@ -61,7 +60,7 @@ class AbacusActivity(activity.Activity): # Suanpan (Chinese abacus) 2:5 self.chinese = ToolButton( "Con" ) - self.chinese.set_tooltip(_('suanpan')) + self.chinese.set_tooltip(_('Suanpan')) self.chinese.props.sensitive = True self.chinese.connect('clicked', self._chinese_cb) toolbar_box.toolbar.insert(self.chinese, -1) @@ -69,7 +68,7 @@ class AbacusActivity(activity.Activity): # Soroban (Japanese abacus) 1:4 self.japanese = ToolButton( "Joff" ) - self.japanese.set_tooltip(_('soroban')) + self.japanese.set_tooltip(_('Soroban')) self.japanese.props.sensitive = True self.japanese.connect('clicked', self._japanese_cb) toolbar_box.toolbar.insert(self.japanese, -1) @@ -77,7 +76,7 @@ class AbacusActivity(activity.Activity): # Schety (Russian abacus) 0:10 self.russian = ToolButton( "Roff" ) - self.russian.set_tooltip(_('schety')) + self.russian.set_tooltip(_('Schety')) self.russian.props.sensitive = True self.russian.connect('clicked', self._russian_cb) toolbar_box.toolbar.insert(self.russian, -1) @@ -85,7 +84,7 @@ class AbacusActivity(activity.Activity): # Nepohualtzintzin (Mayan abacus) 3:4 (base 20) self.mayan = ToolButton( "Moff" ) - self.mayan.set_tooltip(_('nepohualtzintzin')) + self.mayan.set_tooltip(_('Nepohualtzintzin')) self.mayan.props.sensitive = True self.mayan.connect('clicked', self._mayan_cb) toolbar_box.toolbar.insert(self.mayan, -1) @@ -93,12 +92,20 @@ class AbacusActivity(activity.Activity): # Binary (base 2) self.binary = ToolButton( "Boff" ) - self.binary.set_tooltip(_('binary')) + self.binary.set_tooltip(_('Binary')) self.binary.props.sensitive = True self.binary.connect('clicked', self._binary_cb) toolbar_box.toolbar.insert(self.binary, -1) self.binary.show() + # Fractions (1/2, 1/3, 1/4, 1/5, 1/6, 1/8, 1/9, 1/10, 1/12) + self.fraction = ToolButton( "Foff" ) + self.fraction.set_tooltip(_('Fraction')) + self.fraction.props.sensitive = True + self.fraction.connect('clicked', self._fraction_cb) + toolbar_box.toolbar.insert(self.fraction, -1) + self.fraction.show() + separator = gtk.SeparatorToolItem() separator.props.draw = False separator.set_expand(True) @@ -133,8 +140,7 @@ class AbacusActivity(activity.Activity): self.show_all() # Initialize the canvas - self.abacus = Abacus(canvas, os.path.join(activity.get_bundle_path(), - 'images/'), self) + self.abacus = Abacus(canvas, self) # Read the current mode from the Journal try: @@ -148,6 +154,8 @@ class AbacusActivity(activity.Activity): self._mayan_cb(None) elif self.metadata['abacus'] == 'binary': self._binary_cb(None) + elif self.metadata['abacus'] == 'fraction': + self._fraction_cb(None) else: self._chinese_cb(None) except: @@ -164,11 +172,13 @@ class AbacusActivity(activity.Activity): self.russian.set_icon("Roff") self.mayan.set_icon("Moff") self.binary.set_icon("Boff") + self.fraction.set_icon("Foff") self.abacus.chinese.hide() self.abacus.japanese.hide() self.abacus.russian.hide() self.abacus.mayan.hide() self.abacus.binary.hide() + self.abacus.fraction.hide() def _chinese_cb(self, button): """ Display the suanpan; hide the others """ @@ -210,6 +220,14 @@ class AbacusActivity(activity.Activity): self.abacus.mode = self.abacus.binary _logger.debug("Setting mode to %s" % (self.abacus.mode.name)) + def _fraction_cb(self, button): + """ Display the fraction; hide the others """ + self._all_off() + self.fraction.set_icon("Fon") + self.abacus.fraction.show() + self.abacus.mode = self.abacus.fraction + _logger.debug("Setting mode to %s" % (self.abacus.mode.name)) + def write_file(self, file_path): """ Write the bead positions to the Journal """ _logger.debug("Saving current abacus to Journal: %s " % ( @@ -232,7 +250,7 @@ class ProjectToolbar(gtk.Toolbar): # Chinese style self.activity.chinese = ToolButton( "Con" ) - self.activity.chinese.set_tooltip(_('saunpan')) + self.activity.chinese.set_tooltip(_('Saunpan')) self.activity.chinese.props.sensitive = True self.activity.chinese.connect('clicked', self.activity._chinese_cb) self.insert(self.activity.chinese, -1) @@ -240,7 +258,7 @@ class ProjectToolbar(gtk.Toolbar): # Japanese style self.activity.japanese = ToolButton( "Joff" ) - self.activity.japanese.set_tooltip(_('soroban')) + self.activity.japanese.set_tooltip(_('Soroban')) self.activity.japanese.props.sensitive = True self.activity.japanese.connect('clicked', self.activity._japanese_cb) self.insert(self.activity.japanese, -1) @@ -248,7 +266,7 @@ class ProjectToolbar(gtk.Toolbar): # Russian style self.activity.russian = ToolButton( "Roff" ) - self.activity.russian.set_tooltip(_('schety')) + self.activity.russian.set_tooltip(_('Schety')) self.activity.russian.props.sensitive = True self.activity.russian.connect('clicked', self.activity._russian_cb) self.insert(self.activity.russian, -1) @@ -256,7 +274,7 @@ class ProjectToolbar(gtk.Toolbar): # Mayan style self.activity.mayan = ToolButton( "Moff" ) - self.activity.mayan.set_tooltip(_('nepohualtzintzin')) + self.activity.mayan.set_tooltip(_('Nepohualtzintzin')) self.activity.mayan.props.sensitive = True self.activity.mayan.connect('clicked', self.activity._mayan_cb) self.insert(self.activity.mayan, -1) @@ -264,8 +282,16 @@ class ProjectToolbar(gtk.Toolbar): # Binary style self.activity.binary = ToolButton( "Boff" ) - self.activity.binary.set_tooltip(_('binary')) + self.activity.binary.set_tooltip(_('Binary')) self.activity.binary.props.sensitive = True self.activity.binary.connect('clicked', self.activity._binary_cb) self.insert(self.activity.binary, -1) self.activity.binary.show() + + # Fraction style + self.activity.fraction = ToolButton( "Foff" ) + self.activity.fraction.set_tooltip(_('Fraction')) + self.activity.fraction.props.sensitive = True + self.activity.fraction.connect('clicked', self.activity._fraction_cb) + self.insert(self.activity.fraction, -1) + self.activity.fraction.show() @@ -1,6 +1,7 @@ 6 * added binary abacus +* added fraction abacus * autogenerate SVG * general code clean-up/consolidation @@ -17,19 +17,9 @@ pygtk.require('2.0') import gtk from gettext import gettext as _ -import os from abacus_window import Abacus -def makepath(path): - """ Make a path if it doesn't previously exist """ - from os import makedirs - from os.path import normpath, dirname, exists - - dpath = normpath(dirname(path)) - if not exists(dpath): - makedirs(dpath) - class AbacusMain: def __init__(self): self.r = 0 @@ -74,6 +64,9 @@ class AbacusMain: menu_items = gtk.MenuItem(_("Binary")) menu.append(menu_items) menu_items.connect("activate", self._b_cb) + menu_items = gtk.MenuItem(_("Fraction")) + menu.append(menu_items) + menu_items.connect("activate", self._f_cb) menu_items.show() menu_items = gtk.MenuItem(_("Quit")) menu.append(menu_items) @@ -107,28 +100,9 @@ class AbacusMain: self.win.show_all() - if os.path.exists('/usr/share/abacus/images/'): - self.abacus = Abacus(canvas, '/usr/share/abacus/images/') - elif os.path.exists('/usr/local/share/abacus/images/'): - self.abacus = Abacus(canvas, '/usr/local/share/abacus/images/') - else: - self.abacus = Abacus(canvas, os.path.abspath('.')+'/images/') + self.abacus = Abacus(canvas) self.abacus.win = self.win - """ - - canvas = gtk.DrawingArea() - vbox.pack_end(canvas, True, True) - canvas.show() - - menu_bar.append(root_menu) - self.win.show_all() - - # Join the activity - self.abacus = Abacus(canvas, os.path.join(os.path.abspath('.'), - 'images/')) - """ - self.abacus.activity = self def set_title(self, title): @@ -140,6 +114,7 @@ class AbacusMain: self.abacus.russian.hide() self.abacus.mayan.hide() self.abacus.binary.hide() + self.abacus.fraction.hide() def _c_cb(self, widget): self._hide_all() @@ -171,6 +146,12 @@ class AbacusMain: self.abacus.mode = self.abacus.binary return True + def _f_cb(self, widget): + self._hide_all() + self.abacus.fraction.show() + self.abacus.mode = self.abacus.fraction + return True + def destroy(self, event, data=None): """ Callback for destroy event. """ gtk.main_quit() diff --git a/abacus_window.py b/abacus_window.py index cee4a20..abbc9b2 100644 --- a/abacus_window.py +++ b/abacus_window.py @@ -102,9 +102,8 @@ def _svg_style(extras=""): class Abacus(): - def __init__(self, canvas, path, parent=None): + def __init__(self, canvas, parent=None): """ Abacus class """ - self.path = path self.activity = parent if parent is None: # Starting from command line @@ -133,15 +132,16 @@ class Abacus(): self.chinese = Suanpan(self) self.japanese = Soroban(self) self.russian = Schety(self) - # self.russian = Fractions(self) self.mayan = Nepohualtzintzin(self) self.binary = Binary(self) + self.fraction = Fractions(self) self.chinese.show() self.japanese.hide() self.russian.hide() self.mayan.hide() self.binary.hide() + self.fraction.hide() self.mode = self.chinese def _button_press_cb(self, win, event): @@ -618,6 +618,7 @@ class Binary(AbacusGeneric): return(string) + class Schety(AbacusGeneric): def __init__(self, abacus): @@ -816,7 +817,7 @@ class Fractions(AbacusGeneric): 1/5, 1/6, 1/8, 1/9, 1/10, 1/12). """ self.bead_count = (10, 10, 10, 10, 10, 10, 2, 3, 4, 5, 6, 8, 9, 10, 12) self.abacus = abacus - self.name = "schety" + self.name = "fraction" self.num_rods = 15 self.top_beads = 0 self.bot_beads = 12 @@ -843,7 +844,7 @@ class Fractions(AbacusGeneric): rod = _svg_header(10, self.frame_height-(FSTROKE*2), self.abacus.scale) +\ _svg_rect(10, self.frame_height-(FSTROKE*2), 0, 0, 0, 0, - rod_colors[(i+5)%len(rod_colors)], "#404040") +\ + rod_colors[(i+9)%len(rod_colors)], "#404040") +\ _svg_footer() self.rods.append(Sprite(self.abacus.sprites, x+i*dx+ro, y, @@ -851,7 +852,7 @@ class Fractions(AbacusGeneric): for b in range(self.bead_count[i]): self.beads.append(Sprite(self.abacus.sprites, x+i*dx+bo, - y+(12-self.bead_count[i]+b)*BHEIGHT*\ + y+(14-self.bead_count[i]+b)*BHEIGHT*\ self.abacus.scale, self.white)) @@ -860,9 +861,10 @@ class Fractions(AbacusGeneric): i.state = 0 def value(self, count_beads=False): - """ Override to account for fourths """ + """ Override to account for fractions """ string = '' v = [] + value = 0 for r in range(self.num_rods+1): # +1 for overflow v.append(0) @@ -874,61 +876,25 @@ class Fractions(AbacusGeneric): r+=1 j+=self.bead_count[r] if b.state == 1: - if count_beads: - v[r+1] += 1 - else: - v[r+1] += 10/self.bead_count[r] + v[r+1] += 1 if count_beads: # Save the number of beads on each rod as a 2-byte int. for j in v[1:]: string += "%2d" % (j) else: - # Carry to the left if a rod has a value > 9. - # First, process the short rod; - if v[11] == 10: - v[10] += 1 - else: - v[12] += int(v[11]) - v[13] += int(10*v[11]-10*int(v[11])) - - # then, check the rods to the right of the short rod; - for j in range(4): - if v[len(v)-j-1] > 9: - v[len(v)-j-1] -= 10 - if j < 3: - v[len(v)-j-2] += 1 - else: - v[len(v)-j-3] += 1 # skip over the short rod - - # and finally, the rest of the rods. - for j in range(6,16): - if v[len(v)-j-1] > 9: - v[len(v)-j-1] -= 10 - v[len(v)-j-2] += 1 + for r in range(self.num_rods): + if r < 6: + value += pow(10,5-r)*v[r+1] + else: + value += float(v[r+1])/self.bead_count[r] + string = str(value) - # Convert values to a string. - for i, j in enumerate(v): - if i == 11: - string += '.' - elif string != '' or j > 0: - string += str(j) return(string) def set_rod_value(self, r, v): """ Move beads on rod r to represent value v """ - if r == 10: - beads = 4 - bead_index = r*(self.bot_beads) - o = 8 - elif r < 10: - beads = 10 - bead_index = r*(self.bot_beads) - o = 2 - else: - beads = 10 - bead_index = r*(self.bot_beads)-6 - o = 2 + o = self.bot_beads - self.bead_count[r] + 2 # Clear the rod. for i in range(beads): @@ -943,22 +909,19 @@ class Fractions(AbacusGeneric): self.beads[bead_index+i].state = 1 def move_bead(self, bead, dy): - """ Override to account for short rod """ + """ Override to account for short rods """ i = self.beads.index(bead) - r = i/self.bot_beads - # Take into account the rod with just 4 beads - if r < 10: - o = 2 - b = i % self.bot_beads - n = self.bot_beads - elif i > 99 and i < 104: - o = 8 - b = i % self.bot_beads - n = 4 - else: - o = 2 - b = (i+6) % self.bot_beads - n = self.bot_beads + # Find out which row i corresponds to + count = 0 + for r in range(len(self.bead_count)): + count += self.bead_count[r] + if i < count: + break + # Take into account the number of beads per rod + o = self.bot_beads - self.bead_count[r] + 2 + b = i - (count-self.bead_count[r]) + n = self.bead_count[r] + if dy < 0 and bead.state == 0: bead.move_relative((0, -o*BHEIGHT*self.abacus.scale)) bead.state = 1 |