Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/AbacusActivity.py
diff options
context:
space:
mode:
Diffstat (limited to 'AbacusActivity.py')
-rw-r--r--AbacusActivity.py269
1 files changed, 118 insertions, 151 deletions
diff --git a/AbacusActivity.py b/AbacusActivity.py
index bd3175e..269736d 100644
--- a/AbacusActivity.py
+++ b/AbacusActivity.py
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
-#Copyright (c) 2010-11, Walter Bender
+#Copyright (c) 2010-12, Walter Bender
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -11,56 +11,43 @@
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
-import pygtk
-pygtk.require('2.0')
-import gtk
-import gobject
-
-from sugar.activity import activity
-from sugar import profile
-try: # 0.86+ toolbar widgets
- from sugar.graphics.toolbarbox import ToolbarBox
- HAS_TOOLBARBOX = True
-except ImportError:
- HAS_TOOLBARBOX = False
-if HAS_TOOLBARBOX:
- from sugar.graphics.toolbarbox import ToolbarButton
- from sugar.activity.widgets import ActivityToolbarButton
- from sugar.activity.widgets import StopButton
-from sugar.datastore import datastore
-from sugar.graphics.alert import NotifyAlert
+from gi.repository import Gtk
+from gi.repository import Gdk
+from gi.repository import GObject
+from gi.repository import Pango
+
+from sugar3.activity import activity
+from sugar3 import profile
+from sugar3.graphics.toolbarbox import ToolbarBox
+from sugar3.activity.widgets import ActivityToolbarButton
+from sugar3.activity.widgets import StopButton
+from sugar3.graphics.toolbarbox import ToolbarButton
+from sugar3.graphics.alert import NotifyAlert
+from sugar3.graphics import style
from gettext import gettext as _
-import locale
import logging
_logger = logging.getLogger('abacus-activity')
-from abacus_window import Abacus, Custom, Suanpan, Soroban, Schety,\
- Nepohualtzintzin, Binary, Hex, Decimal, Fractions,\
- Caacupe, Cuisenaire, MAX_RODS, MAX_TOP, MAX_BOT
+from abacus_window import Abacus, Custom, MAX_RODS, MAX_TOP, MAX_BOT
from toolbar_utils import separator_factory, radio_factory, label_factory, \
button_factory, spin_factory
-NAMES = {
- # TRANS: http://en.wikipedia.org/wiki/Soroban (Japanese abacus)
- 'suanpan': _('Suanpan'),
- # TRANS: http://en.wikipedia.org/wiki/Suanpan (Chinese abacus)
- 'soroban': _('Soroban'),
- 'decimal': _('Decimal'),
- # TRANS: http://en.wikipedia.org/wiki/Abacus#Native_American_abaci)
- 'nepohualtzintzin': _('Nepohualtzintzin'),
- 'hexadecimal': _('Hexadecimal'),
- 'binary': _('Binary'),
- # TRANS: http://en.wikipedia.org/wiki/Abacus#Russian_abacus
- 'schety': _('Schety'),
- 'fraction': _('Fraction'),
- # TRANS: Caacupé is an abacus invented by teachers in Caacupé, Paraguay
- 'caacupe': _('Caacupé'),
- 'cuisenaire': _('Rods'),
- 'custom': _('Custom')
- }
+NAMES = {'suanpan': _('Suanpan'),
+ 'soroban': _('Soroban'),
+ 'decimal': _('Decimal'),
+ 'nepohualtzintzin': _('Nepohualtzintzin'),
+ 'hexadecimal': _('Hexadecimal'),
+ 'binary': _('Binary'),
+ 'schety': _('Schety'),
+ 'fraction': _('Fraction'),
+ 'caacupe': _('Caacupé'),
+ 'cuisenaire': _('Rods'),
+ 'custom': _('Custom')
+ }
+
class AbacusActivity(activity.Activity):
@@ -74,92 +61,69 @@ class AbacusActivity(activity.Activity):
# no sharing
self.max_participants = 1
- abacus_toolbar = gtk.Toolbar()
- custom_toolbar = gtk.Toolbar()
- edit_toolbar = gtk.Toolbar()
-
- if HAS_TOOLBARBOX:
- # Use 0.86 toolbar design
- toolbox = ToolbarBox()
-
- activity_button = ActivityToolbarButton(self)
- toolbox.toolbar.insert(activity_button, 0)
- activity_button.show()
-
- edit_toolbar_button = ToolbarButton(label=_('Edit'),
- page=edit_toolbar,
- icon_name='toolbar-edit')
- edit_toolbar_button.show()
- toolbox.toolbar.insert(edit_toolbar_button, -1)
- edit_toolbar_button.show()
-
- abacus_toolbar_button = ToolbarButton(
- page=abacus_toolbar,
- icon_name='abacus-list')
- abacus_toolbar.show()
- toolbox.toolbar.insert(abacus_toolbar_button, -1)
- abacus_toolbar_button.show()
-
- custom_toolbar_button = ToolbarButton(
- page=custom_toolbar,
- icon_name='view-source')
- custom_toolbar.show()
- toolbox.toolbar.insert(custom_toolbar_button, -1)
- custom_toolbar_button.show()
-
- separator_factory(toolbox.toolbar, False, True)
+ abacus_toolbar = Gtk.Toolbar()
+ custom_toolbar = Gtk.Toolbar()
+ edit_toolbar = Gtk.Toolbar()
- button_factory('edit-clear', toolbox.toolbar,
- self._reset_cb, tooltip=_('Reset'))
+ toolbox = ToolbarBox()
- separator_factory(toolbox.toolbar, False, True)
+ activity_button = ActivityToolbarButton(self)
+ toolbox.toolbar.insert(activity_button, 0)
+ activity_button.show()
- self._label = label_factory(toolbox.toolbar, NAMES['suanpan'])
+ edit_toolbar_button = ToolbarButton(label=_('Edit'),
+ page=edit_toolbar,
+ icon_name='toolbar-edit')
+ edit_toolbar_button.show()
+ toolbox.toolbar.insert(edit_toolbar_button, -1)
+ edit_toolbar_button.show()
- separator_factory(toolbox.toolbar, True, False)
+ abacus_toolbar_button = ToolbarButton(
+ page=abacus_toolbar,
+ icon_name='abacus-list')
+ abacus_toolbar.show()
+ toolbox.toolbar.insert(abacus_toolbar_button, -1)
+ abacus_toolbar_button.show()
- stop_button = StopButton(self)
- stop_button.props.accelerator = _('<Ctrl>Q')
- toolbox.toolbar.insert(stop_button, -1)
- stop_button.show()
+ custom_toolbar_button = ToolbarButton(
+ page=custom_toolbar,
+ icon_name='view-source')
+ custom_toolbar.show()
+ toolbox.toolbar.insert(custom_toolbar_button, -1)
+ custom_toolbar_button.show()
- self.set_toolbox(toolbox)
- toolbox.show()
+ separator_factory(toolbox.toolbar, False, True)
- else:
- # Use pre-0.86 toolbar design
- toolbox = activity.ActivityToolbox(self)
- self.set_toolbox(toolbox)
-
- toolbox.add_toolbar(_('Project'), abacus_toolbar)
- toolbox.add_toolbar(_('Custom'), custom_toolbar)
- toolbox.add_toolbar(_('Edit'), edit_toolbar)
+ button_factory('edit-delete', toolbox.toolbar,
+ self._reset_cb, tooltip=_('Reset'))
- button_factory('edit-delete', edit_toolbar,
- self._reset_cb, tooltip=_('Reset'))
+ separator_factory(toolbox.toolbar, False, True)
- self._label = label_factory(edit_toolbar, NAMES['suanpan'])
+ self._label = label_factory(NAMES['suanpan'], toolbox.toolbar)
- separator_factory(edit_toolbar, False, True)
+ separator_factory(toolbox.toolbar, True, False)
- toolbox.set_current_toolbar(1)
+ stop_button = StopButton(self)
+ stop_button.props.accelerator = _('<Ctrl>Q')
+ toolbox.toolbar.insert(stop_button, -1)
+ stop_button.show()
- # no sharing
- if hasattr(toolbox, 'share'):
- toolbox.share.hide()
- elif hasattr(toolbox, 'props'):
- toolbox.props.visible = False
+ self.set_toolbar_box(toolbox)
+ toolbox.show()
+ # TRANS: simple decimal abacus
self.decimal = radio_factory('decimal', abacus_toolbar,
self._radio_cb, cb_arg='decimal',
tooltip=NAMES['decimal'],
group=None)
+ # TRANS: http://en.wikipedia.org/wiki/Soroban (Japanese abacus)
self.japanese = radio_factory('soroban', abacus_toolbar,
self._radio_cb, cb_arg='soroban',
tooltip=_('Soroban'),
group=self.decimal)
+ # TRANS: http://en.wikipedia.org/wiki/Suanpan (Chinese abacus)
self.chinese = radio_factory('suanpan', abacus_toolbar,
self._radio_cb, cb_arg='suanpan',
tooltip=NAMES['suanpan'],
@@ -167,16 +131,19 @@ class AbacusActivity(activity.Activity):
separator_factory(abacus_toolbar)
+ # TRANS: http://en.wikipedia.org/wiki/Abacus#Native_American_abaci
self.mayan = radio_factory('nepohualtzintzin', abacus_toolbar,
self._radio_cb, cb_arg='nepohualtzintzin',
tooltip=NAMES['nepohualtzintzin'],
group=self.decimal)
+ # TRANS: hexidecimal abacus
self.hex = radio_factory('hexadecimal', abacus_toolbar,
self._radio_cb, cb_arg='hexadecimal',
tooltip=NAMES['hexadecimal'],
group=self.decimal)
+ # TRANS: binary abacus
self.binary = radio_factory('binary', abacus_toolbar,
self._radio_cb, cb_arg='binary',
tooltip=NAMES['binary'],
@@ -184,16 +151,19 @@ class AbacusActivity(activity.Activity):
separator_factory(abacus_toolbar)
+ # TRANS: http://en.wikipedia.org/wiki/Abacus#Russian_abacus
self.russian = radio_factory('schety', abacus_toolbar,
self._radio_cb, cb_arg='schety',
tooltip=NAMES['schety'],
group=self.decimal)
+ # TRANS: abacus for adding fractions
self.fraction = radio_factory('fraction', abacus_toolbar,
self._radio_cb, cb_arg='fraction',
tooltip=NAMES['fraction'],
group=self.decimal)
+ # TRANS: Abacus invented by teachers in Caacupé, Paraguay
self.caacupe = radio_factory('caacupe', abacus_toolbar,
self._radio_cb, cb_arg='caacupe',
tooltip=NAMES['caacupe'],
@@ -201,6 +171,7 @@ class AbacusActivity(activity.Activity):
separator_factory(abacus_toolbar)
+ # TRANS: Cuisenaire Rods
self.cuisenaire = radio_factory('cuisenaire', abacus_toolbar,
self._radio_cb,
cb_arg='cuisenaire',
@@ -212,62 +183,60 @@ class AbacusActivity(activity.Activity):
self.custom = radio_factory('custom', abacus_toolbar,
self._radio_cb,
cb_arg='custom',
- tooltip=_('Custom'), group=self.decimal)
+ tooltip=NAMES['custom'], group=self.decimal)
preferences_button = button_factory(
'preferences-system', custom_toolbar, self._preferences_palette_cb,
tooltip=_('Custom'))
self._palette = preferences_button.get_palette()
- button_box = gtk.VBox()
+ button_box = Gtk.VBox()
# TRANS: Number of rods on the abacus
- self._rods_spin = self._add_spinner_and_label(
+ self._rods_spin = add_spinner_and_label(
15, 1, MAX_RODS, _('Rods:'), self._rods_spin_cb, button_box)
# TRANS: Number of beads in the top section of the abacus
- self._top_spin = self._add_spinner_and_label(
+ self._top_spin = add_spinner_and_label(
2, 0, MAX_TOP, _('Top:'), self._top_spin_cb, button_box)
# TRANS: Number of beads in the bottom section of the abacus
- self._bottom_spin = self._add_spinner_and_label(
+ self._bottom_spin = add_spinner_and_label(
2, 0, MAX_BOT, _('Bottom:'), self._bottom_spin_cb, button_box)
# TRANS: Scale factor between bottom and top beads
- self._value_spin = self._add_spinner_and_label(
+ self._value_spin = add_spinner_and_label(
5, 1, MAX_BOT + 1, _('Factor:'), self._value_spin_cb, button_box)
# TRANS: Scale factor between rods
- self._base_spin = self._add_spinner_and_label(
+ self._base_spin = add_spinner_and_label(
10, 1, (MAX_TOP + 1) * MAX_BOT, _('Base:'), self._base_spin_cb,
button_box)
button_box.show_all()
self._palette.set_content(button_box)
+ separator_factory(custom_toolbar, False, False)
+
self.custom_maker = button_factory('new-abacus', custom_toolbar,
self._custom_cb,
tooltip=_('Custom'))
- copy = button_factory('edit-copy', edit_toolbar, self._copy_cb,
- tooltip=_('Copy'), accelerator='<Ctrl>c')
- paste = button_factory('edit-paste', edit_toolbar, self._paste_cb,
- tooltip=_('Paste'), accelerator='<Ctrl>v')
-
- self.toolbox.show()
+ button_factory('edit-copy', edit_toolbar, self._copy_cb,
+ tooltip=_('Copy'), accelerator='<Ctrl>c')
+ button_factory('edit-paste', edit_toolbar, self._paste_cb,
+ tooltip=_('Paste'), accelerator='<Ctrl>v')
- '''
- if HAS_TOOLBARBOX:
- # start with abacus toolbar expanded
- abacus_toolbar_button.set_expanded(True)
- '''
+ # start with abacus toolbar expanded
+ abacus_toolbar_button.set_expanded(True)
self.chinese.set_active(True)
# Create a canvas
- canvas = gtk.DrawingArea()
- canvas.set_size_request(gtk.gdk.screen_width(),
- gtk.gdk.screen_height())
+ canvas = Gtk.DrawingArea()
+ canvas.set_size_request(Gdk.Screen.width(),
+ Gdk.Screen.height())
self.set_canvas(canvas)
canvas.show()
self.show_all()
# Initialize the canvas
self.abacus = Abacus(canvas, self)
+
self._setting_up = False
# Read the current mode from the Journal
@@ -349,7 +318,7 @@ class AbacusActivity(activity.Activity):
alert.show()
def _select_abacus(self, abacus):
- ''' Display the selected abacus; hide the others '''
+ ''' Notify the user of an expected delay and then... '''
if not hasattr(self, 'abacus'):
return
if self._setting_up:
@@ -359,9 +328,10 @@ class AbacusActivity(activity.Activity):
self._notify_new_abacus(NAMES[abacus])
# Give the alert time to load
- gobject.timeout_add(100, self._switch_modes, abacus)
+ GObject.timeout_add(1000, self._switch_modes, abacus)
def _switch_modes(self, abacus):
+ ''' Display the selected abacus '''
# Save current value
value = int(float(self.abacus.mode.value()))
if abacus == 'custom':
@@ -405,16 +375,13 @@ class AbacusActivity(activity.Activity):
self.abacus.custom.create()
self.abacus.custom.draw_rods_and_beads()
self.abacus.custom.show()
-
- self._select_abacus('custom')
-
- # self.abacus.mode = self.abacus.custom
+ self.abacus.mode = self.abacus.custom
self.custom.set_active(True)
self._label.set_text(NAMES['custom'])
def _copy_cb(self, arg=None):
''' Copy a number to the clipboard from the active abacus. '''
- clipBoard = gtk.Clipboard()
+ clipBoard = Gtk.Clipboard()
text = self.abacus.generate_label(sum_only=True)
if text is not None:
clipBoard.set_text(text)
@@ -422,7 +389,7 @@ class AbacusActivity(activity.Activity):
def _paste_cb(self, arg=None):
''' Paste a number from the clipboard to the active abacus. '''
- clipBoard = gtk.Clipboard()
+ clipBoard = Gtk.Clipboard()
text = clipBoard.wait_for_text()
if text is not None:
try:
@@ -445,21 +412,21 @@ class AbacusActivity(activity.Activity):
self.metadata['factor'] = str(self._value_spin.get_value_as_int())
self.metadata['base'] = str(self._base_spin.get_value_as_int())
- def _add_spinner_and_label(self, default_value, min_value, max_value,
- tooltip, cb, box):
- ''' Add a spinner and a label to a box '''
- spinner_and_label = gtk.HBox()
- spinner, item = spin_factory(default_value, min_value, max_value,
- cb, None)
- label = gtk.Label(tooltip)
- label.set_justify(gtk.JUSTIFY_LEFT)
- label.set_line_wrap(True)
- label.show()
- spinner_and_label.pack_start(label)
- label = gtk.Label(' ')
- label.show()
- spinner_and_label.pack_start(label)
- spinner_and_label.pack_start(item)
- box.pack_start(spinner_and_label, False, False, padding=5)
- spinner_and_label.show()
- return spinner
+
+def add_spinner_and_label(default_value, min_value, max_value,
+ tooltip, cb, box):
+ ''' Add a spinner and a label to a box '''
+ spinner_and_label = Gtk.HBox()
+ spinner, item = spin_factory(default_value, min_value, max_value, cb, None)
+ label = Gtk.Label(label=tooltip)
+ label.set_justify(Gtk.Justification.LEFT)
+ label.set_line_wrap(True)
+ label.show()
+ spinner_and_label.pack_start(label, expand=False, fill=False, padding=0)
+ label = Gtk.Label(label=' ')
+ label.show()
+ spinner_and_label.pack_start(label, expand=True, fill=False, padding=0)
+ spinner_and_label.pack_start(item, expand=False, fill=False, padding=0)
+ box.pack_start(spinner_and_label, expand=False, fill=False, padding=5)
+ spinner_and_label.show()
+ return spinner