From 70340f820f0465a44591409b89588c5bf773a2b2 Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Mon, 10 Oct 2011 23:51:14 +0000 Subject: lots of cleaning up --- (limited to 'AbacusActivity.py') diff --git a/AbacusActivity.py b/AbacusActivity.py index 0a696f0..d30fb46 100644 --- a/AbacusActivity.py +++ b/AbacusActivity.py @@ -18,7 +18,7 @@ import gobject import sugar from sugar.activity import activity -try: # 0.86+ toolbar widgets +try: # 0.86+ toolbar widgets from sugar.graphics.toolbarbox import ToolbarBox HAS_TOOLBARBOX = True except ImportError: @@ -29,6 +29,7 @@ if HAS_TOOLBARBOX: from sugar.activity.widgets import StopButton from sugar.graphics.toolbarbox import ToolbarButton from sugar.graphics.toolbutton import ToolButton +from sugar.graphics.radiotoolbutton import RadioToolButton from sugar.graphics.menuitem import MenuItem from sugar.graphics.icon import Icon from sugar.datastore import datastore @@ -37,68 +38,91 @@ from gettext import gettext as _ import locale import logging -_logger = logging.getLogger("abacus-activity") +_logger = logging.getLogger('abacus-activity') from abacus_window import Abacus, Custom, Suanpan, Soroban, Schety,\ Nepohualtzintzin, Binary, Hex, Decimal, Fractions,\ Caacupe, Cuisenaire -def _button_factory(icon_name, tooltip, callback, toolbar, +def _button_factory(icon_name, toolbar, callback, cb_arg=None, tooltip=None, accelerator=None): - """Factory for making toolbar buttons""" - my_button = ToolButton( icon_name ) - my_button.set_tooltip(tooltip) - my_button.props.sensitive = True + '''Factory for making toolbar buttons''' + button = ToolButton(icon_name) + if tooltip is not None: + button.set_tooltip(tooltip) + button.props.sensitive = True if accelerator is not None: - my_button.props.accelerator = accelerator - my_button.connect('clicked', callback) + button.props.accelerator = accelerator + if cb_arg is None: + button.connect('clicked', callback) + else: + button.connect('clicked', cb_arg) if hasattr(toolbar, 'insert'): # the main toolbar - toolbar.insert(my_button, -1) + toolbar.insert(button, -1) else: # or a secondary toolbar - toolbar.props.page.insert(my_button, -1) - my_button.show() - return my_button + toolbar.props.page.insert(button, -1) + button.show() + return button + + +def _radio_factory(icon_name, toolbar, callback, cb_arg=None, + tooltip=None, group=None): + ''' Add a radio button to a toolbar ''' + button = RadioToolButton(group=group) + button.set_named_icon(icon_name) + if tooltip is not None: + button.set_tooltip(tooltip) + if cb_arg is None: + button.connect('clicked', callback) + else: + button.connect('clicked', callback, cb_arg) + if hasattr(toolbar, 'insert'): # the main toolbar + toolbar.insert(button, -1) + else: # or a secondary toolbar + toolbar.props.page.insert(button, -1) + button.show() + return button -def _label_factory(label, toolbar): - """ Factory for adding a label to a toolbar """ - my_label = gtk.Label(label) - my_label.set_line_wrap(True) - my_label.show() - _toolitem = gtk.ToolItem() - _toolitem.add(my_label) - toolbar.insert(_toolitem, -1) - _toolitem.show() - return my_label +def _label_factory(label_text, toolbar): + ''' Factory for adding a label to a toolbar ''' + label = gtk.Label(label_text) + label.set_line_wrap(True) + label.show() + toolitem = gtk.ToolItem() + toolitem.add(label) + toolbar.insert(toolitem, -1) + toolitem.show() + return label def _spin_factory(default, min, max, callback, toolbar): - _spin_adj = gtk.Adjustment(default, min, max, 1, 32, 0) - my_spin = gtk.SpinButton(_spin_adj, 0, 0) - _spin_id = my_spin.connect('value-changed', callback) - my_spin.set_numeric(True) - my_spin.show() - _toolitem = gtk.ToolItem() - _toolitem.add(my_spin) - toolbar.insert(_toolitem, -1) - _toolitem.show() - return my_spin + spin_adj = gtk.Adjustment(default, min, max, 1, 32, 0) + spin = gtk.SpinButton(spin_adj, 0, 0) + spin_id = spin.connect('value-changed', callback) + spin.set_numeric(True) + spin.show() + toolitem = gtk.ToolItem() + toolitem.add(spin) + toolbar.insert(toolitem, -1) + toolitem.show() + return spin def _separator_factory(toolbar, expand=False, visible=True): - """ add a separator to a toolbar """ - _separator = gtk.SeparatorToolItem() - _separator.props.draw = visible - _separator.set_expand(expand) - toolbar.insert(_separator, -1) - _separator.show() + ''' add a separator to a toolbar ''' + separator = gtk.SeparatorToolItem() + separator.props.draw = visible + separator.set_expand(expand) + toolbar.insert(separator, -1) + separator.show() class AbacusActivity(activity.Activity): def __init__(self, handle): - """ Initiate activity. """ + ''' Initiate activity. ''' super(AbacusActivity, self).__init__(handle) # no sharing @@ -139,8 +163,8 @@ class AbacusActivity(activity.Activity): _separator_factory(toolbox.toolbar, False, True) - _button_factory("edit-delete", _('Reset'), - self._reset_cb, toolbox.toolbar) + _button_factory('edit-delete', toolbox.toolbar, + self._reset_cb, tooltip=_('Reset')) _separator_factory(toolbox.toolbar, True, False) @@ -161,8 +185,8 @@ class AbacusActivity(activity.Activity): toolbox.add_toolbar( _('Custom'), custom_toolbar ) toolbox.add_toolbar(_('Edit'), edit_toolbar) - _button_factory("edit-delete", _('Reset'), - self._reset_cb, edit_toolbar) + _button_factory('edit-delete', edit_toolbar, + self._reset_cb, tooltip=_('Reset')) _separator_factory(edit_toolbar, False, True) @@ -170,88 +194,108 @@ class AbacusActivity(activity.Activity): # no sharing if hasattr(toolbox, 'share'): - toolbox.share.hide() + toolbox.share.hide() elif hasattr(toolbox, 'props'): toolbox.props.visible = False # TRANS: simple decimal abacus - self.decimal = _button_factory("decimal-off", _('Decimal'), - self._decimal_cb, abacus_toolbar) + self.decimal = _radio_factory('decimal', abacus_toolbar, + self._radio_cb, cb_arg='decimal', + tooltip=_('Decimal'), + group=None) # TRANS: http://en.wikipedia.org/wiki/Soroban (Japanese abacus) - self.japanese = _button_factory("soroban-off", _('Soroban'), - self._japanese_cb, abacus_toolbar) + self.japanese = _radio_factory('soroban', abacus_toolbar, + self._radio_cb, cb_arg='japanese', + tooltip=_('Soroban'), + group=self.decimal) # TRANS: http://en.wikipedia.org/wiki/Suanpan (Chinese abacus) - self.chinese = _button_factory("suanpan-on", _('Suanpan'), - self._chinese_cb, abacus_toolbar) + self.chinese = _radio_factory('suanpan', abacus_toolbar, + self._radio_cb, cb_arg='chinese', + tooltip=_('Suanpan'), + group=self.decimal) _separator_factory(abacus_toolbar) - self.mayan = _button_factory("nepohualtzintzin-off", # TRANS: http://en.wikipedia.org/wiki/Abacus#Native_American_abaci - _('Nepohualtzintzin'), - self._mayan_cb, abacus_toolbar) + self.mayan = _radio_factory('nepohualtzintzin', abacus_toolbar, + self._radio_cb, cb_arg='mayan', + tooltip=_('Nepohualtzintzin'), + group=self.decimal) # TRANS: hexidecimal abacus - self.hex = _button_factory("hexadecimal-off", _('Hexadecimal'), - self._hex_cb, abacus_toolbar) + self.hex = _radio_factory('hexadecimal', abacus_toolbar, + self._radio_cb, cb_arg='hex', + tooltip=_('Hexadecimal'), + group=self.decimal) # TRANS: binary abacus - self.binary = _button_factory("binary-off", _('Binary'), - self._binary_cb, abacus_toolbar) + self.binary = _radio_factory('binary', abacus_toolbar, + self._radio_cb, cb_arg='binary', + tooltip=_('Binary'), + group=self.decimal) _separator_factory(abacus_toolbar) # TRANS: http://en.wikipedia.org/wiki/Abacus#Russian_abacus - self.russian = _button_factory("schety-off", _('Schety'), - self._russian_cb, abacus_toolbar) + self.russian = _radio_factory('schety', abacus_toolbar, + self._radio_cb, cb_arg='russian', + tooltip=_('Schety'), + group=self.decimal) # TRANS: abacus for adding fractions - self.fraction = _button_factory("fraction-off", _('Fraction'), - self._fraction_cb, abacus_toolbar) + self.fraction = _radio_factory('fraction', abacus_toolbar, + self._radio_cb, cb_arg='fraction', + tooltip=_('Fraction'), + group=self.decimal) # TRANS: Abacus invented by teachers in Caacupé, Paraguay - self.caacupe = _button_factory("caacupe-off", _('Caacupé'), - self._caacupe_cb, abacus_toolbar) + self.caacupe = _radio_factory('caacupe', abacus_toolbar, + self._radio_cb, cb_arg='caacupe', + tooltip=_('Caacupé'), + group=self.decimal) _separator_factory(abacus_toolbar) # TRANS: Cuisenaire Rods - self.cuisenaire = _button_factory("cuisenaire-off", _('Rods'), - self._cuisenaire_cb, abacus_toolbar) + self.cuisenaire = _radio_factory('cuisenaire', abacus_toolbar, + self._radio_cb, + cb_arg='cuisenaire', + tooltip=_('Rods'), group=self.decimal) # TRANS: Number of rods on the abacus - self._rods_label = _label_factory(_("Rods:")+" ", custom_toolbar) + self._rods_label = _label_factory(_('Rods:') + ' ', custom_toolbar) self._rods_spin = _spin_factory(15, 1, 20, self._rods_spin_cb, custom_toolbar) # TRANS: Number of beads in the top section of the abacus - self._top_label = _label_factory(_("Top:")+" ", custom_toolbar) + self._top_label = _label_factory(_('Top:') + ' ', custom_toolbar) self._top_spin = _spin_factory(2, 0, 4, self._top_spin_cb, custom_toolbar) # TRANS: Number of beads in the bottom section of the abacus - self._bottom_label = _label_factory(_("Bottom:")+" ", + self._bottom_label = _label_factory(_('Bottom:') + ' ', custom_toolbar) self._bottom_spin = _spin_factory(5, 1, 20, self._bottom_spin_cb, custom_toolbar) # TRANS: Scale factor between bottom and top beads - self._value_label = _label_factory(_("Factor:")+" ", custom_toolbar) + self._value_label = _label_factory(_('Factor:') + ' ', custom_toolbar) self._value_spin = _spin_factory(5, 1, 20, self._value_spin_cb, custom_toolbar) # TRANS: Scale factor between rods - self._base_label = _label_factory(_("Base:")+" ", custom_toolbar) + self._base_label = _label_factory(_('Base:') + ' ', custom_toolbar) self._base_spin = _spin_factory(10, 1, 24, self._base_spin_cb, custom_toolbar) _separator_factory(custom_toolbar, False, False) - self.custom = _button_factory("new-abacus", _('Custom'), - self._custom_cb, custom_toolbar) + self.custom = _button_factory('new-abacus', custom_toolbar, + self._custom_cb, + tooltip=_('Custom')) - copy = _button_factory('edit-copy', _('Copy'), self._copy_cb, - edit_toolbar, accelerator='c') - paste = _button_factory('edit-paste', _('Paste'), self._paste_cb, - edit_toolbar, accelerator='v') + copy = _button_factory('edit-copy', edit_toolbar, self._copy_cb, + tooltip=_('Copy'), accelerator='c') + paste = _button_factory('edit-paste', edit_toolbar, self._paste_cb, + tooltip=_('Paste'), accelerator='v') self.toolbox.show() @@ -259,6 +303,8 @@ class AbacusActivity(activity.Activity): # 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(), @@ -282,83 +328,45 @@ class AbacusActivity(activity.Activity): if 'base' in self.metadata: self._base_spin.set_value(int(self.metadata['base'])) if 'abacus' in self.metadata: + # Default is Chinese _logger.debug('restoring %s', self.metadata['abacus']) - if self.metadata['abacus'] == 'suanpan': - self._chinese_cb() - elif self.metadata['abacus'] == 'soroban': - self._japanese_cb() + if self.metadata['abacus'] == 'soroban': + self._select_abacus('japanese') elif self.metadata['abacus'] == 'schety': - self._russian_cb() + self._select_abacus('russian') elif self.metadata['abacus'] == 'nepohualtzintzin': - self._mayan_cb() + self._select_abacus('mayan') elif self.metadata['abacus'] == 'binary': - self._binary_cb() + self._select_abacus('binary') elif self.metadata['abacus'] == 'hexadecimal': - self._hex_cb() + self._select_abacus('hex') elif self.metadata['abacus'] == 'fraction': - self._fraction_cb() + self._select_abacus('fraction') elif self.metadata['abacus'] == 'caacupe': - self._caacupe_cb() + self._select_abacus('caacupe') elif self.metadata['abacus'] == 'cuisenaire': - self._cuisenaire_cb() + self._select_abacus('cuisenaire') elif self.metadata['abacus'] == 'decimal': - self._decimal_cb() + self._select_abacus('decimal') elif self.metadata['abacus'] == 'custom': self._custom_cb() - else: - 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 """ - self.chinese.set_icon("suanpan-off") - self.japanese.set_icon("soroban-off") - self.russian.set_icon("schety-off") - self.mayan.set_icon("nepohualtzintzin-off") - self.binary.set_icon("binary-off") - self.hex.set_icon("hexadecimal-off") - self.fraction.set_icon("fraction-off") - self.caacupe.set_icon("caacupe-off") - self.cuisenaire.set_icon("cuisenaire-off") - self.decimal.set_icon("decimal-off") - if self.abacus.chinese is not None: - self.abacus.chinese.hide() - if self.abacus.japanese is not None: - self.abacus.japanese.hide() - if self.abacus.russian is not None: - self.abacus.russian.hide() - if self.abacus.mayan is not None: - self.abacus.mayan.hide() - if self.abacus.binary is not None: - self.abacus.binary.hide() - if self.abacus.hex is not None: - self.abacus.hex.hide() - if self.abacus.fraction is not None: - self.abacus.fraction.hide() - if self.abacus.decimal is not None: - self.abacus.decimal.hide() - if self.abacus.caacupe is not None: - self.abacus.caacupe.hide() - if self.abacus.cuisenaire is not None: - self.abacus.cuisenaire.hide() - if self.abacus.custom is not None: - self.abacus.custom.hide() + def _radio_cb(self, button, abacus): + self._select_abacus(abacus) def _reset_cb(self, button=None): self.abacus.mode.reset_abacus() self.abacus.mode.label(self.abacus.generate_label()) - def _select_abacus(self, button, icon, abacus): - """ Display the selected abacus; hide the others """ - self._all_off() - if button is not None: - button.set_icon(icon) - self.abacus.mode = abacus - self.abacus.mode.show() - _logger.debug("Setting mode to %s" % (self.abacus.mode.name)) + def _select_abacus(self, abacus): + ''' Display the selected abacus; hide the others ''' + if not hasattr(self, 'abacus'): + return + self.abacus.select_abacus(abacus) def _rods_spin_cb(self, button=None): return @@ -376,7 +384,7 @@ class AbacusActivity(activity.Activity): return def _custom_cb(self, button=None): - """ Display the custom abacus; hide the others """ + ''' Display the custom abacus; hide the others ''' value = float(self.abacus.mode.value(count_beads=False)) if self.abacus.custom is not None: self.abacus.custom.hide() @@ -386,101 +394,13 @@ class AbacusActivity(activity.Activity): self._bottom_spin.get_value_as_int(), self._value_spin.get_value_as_int(), self._base_spin.get_value_as_int()) - self._select_abacus(None, None, self.abacus.custom) + self._select_abacus(self.abacus.custom) self.abacus.mode.reset_abacus() self.abacus.mode.set_value_from_number(value) self.abacus.mode.label(self.abacus.generate_label()) - 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: - self.abacus.chinese = Suanpan(self.abacus) - self._select_abacus(self.chinese, self.abacus.chinese.name+"-on", - self.abacus.chinese) - self.abacus.mode.set_value_from_number(value) - self.abacus.mode.label(self.abacus.generate_label()) - - 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: - self.abacus.japanese = Soroban(self.abacus) - self._select_abacus(self.japanese, self.abacus.japanese.name+"-on", - self.abacus.japanese) - self.abacus.mode.set_value_from_number(value) - self.abacus.mode.label(self.abacus.generate_label()) - - 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=None): - """ Display the nepohualtzintzin; hide the others """ - value = float(self.abacus.mode.value(count_beads=False)) - if self.abacus.mayan is None: - self.abacus.mayan = Nepohualtzintzin(self.abacus) - self._select_abacus(self.mayan, self.abacus.mayan.name+"-on", - self.abacus.mayan) - self.abacus.mode.set_value_from_number(value) - self.abacus.mode.label(self.abacus.generate_label()) - - 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: - self.abacus.binary = Binary(self.abacus) - self._select_abacus(self.binary, self.abacus.binary.name+"-on", - self.abacus.binary) - self.abacus.mode.set_value_from_number(value) - self.abacus.mode.label(self.abacus.generate_label()) - - 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: - self.abacus.hex = Hex(self.abacus) - self._select_abacus(self.hex, self.abacus.hex.name+"-on", - self.abacus.hex) - self.abacus.mode.set_value_from_number(value) - self.abacus.mode.label(self.abacus.generate_label()) - - 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: - self.abacus.decimal = Decimal(self.abacus) - self._select_abacus(self.decimal, self.abacus.decimal.name+"-on", - self.abacus.decimal) - self.abacus.mode.set_value_from_number(value) - self.abacus.mode.label(self.abacus.generate_label()) - - 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=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=None): - """ Display Cuisenaire-like rods; hide the others """ - if self.abacus.cuisenaire is None: - self.abacus.cuisenaire = Cuisenaire(self.abacus) - self._select_abacus(self.cuisenaire, self.abacus.cuisenaire.name+"-on", - self.abacus.cuisenaire) - def _copy_cb(self, arg=None): - """ Copy a number to the clipboard from the active abacus. """ + ''' Copy a number to the clipboard from the active abacus. ''' clipBoard = gtk.Clipboard() text = self.abacus.generate_label(sum_only=True) if text is not None: @@ -488,7 +408,7 @@ class AbacusActivity(activity.Activity): return def _paste_cb(self, arg=None): - """ Paste a number from the clipboard to the active abacus. """ + ''' Paste a number from the clipboard to the active abacus. ''' clipBoard = gtk.Clipboard() text = clipBoard.wait_for_text() if text is not None: @@ -501,8 +421,8 @@ class AbacusActivity(activity.Activity): return def write_file(self, file_path): - """ Write the bead positions to the Journal """ - _logger.debug("Saving current abacus to Journal: %s %s" % ( + ''' Write the bead positions to the Journal ''' + _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) @@ -511,4 +431,3 @@ class AbacusActivity(activity.Activity): 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()) - -- cgit v0.9.1