Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Bender <walter@sugarlabs.org>2010-05-30 00:44:39 (GMT)
committer Walter Bender <walter@sugarlabs.org>2010-05-30 00:44:39 (GMT)
commit87e597379a2be4059fdd8fa3271d4cf7eed3c43d (patch)
tree8f751db40c85eda6ca9ca36873e158296dc2f540
parentd1f977f78f9e162a4552c5fea64c4441ac8d47f2 (diff)
added fraction
-rw-r--r--AbacusActivity.py52
-rw-r--r--NEWS1
-rwxr-xr-xabacus.py41
-rw-r--r--abacus_window.py95
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()
diff --git a/NEWS b/NEWS
index ac8a3d4..696e5b5 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,7 @@
6
* added binary abacus
+* added fraction abacus
* autogenerate SVG
* general code clean-up/consolidation
diff --git a/abacus.py b/abacus.py
index 7c59d15..5f3a95f 100755
--- a/abacus.py
+++ b/abacus.py
@@ -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