diff options
Diffstat (limited to 'AbacusActivity.py')
-rw-r--r-- | AbacusActivity.py | 269 |
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 |