From 39edf306f74a9a01dc5533a720741b3c708dde81 Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Mon, 06 Feb 2012 20:09:43 +0000 Subject: adding more modes/custom mode --- diff --git a/YupanaActivity.py b/YupanaActivity.py index 1d811bd..f697bfc 100644 --- a/YupanaActivity.py +++ b/YupanaActivity.py @@ -26,7 +26,7 @@ if _have_toolbox: from sugar.graphics.toolbarbox import ToolbarButton from toolbar_utils import button_factory, label_factory, separator_factory, \ - radio_factory + radio_factory, entry_factory from utils import json_load, json_dump import telepathy @@ -82,7 +82,11 @@ class YupanaActivity(activity.Activity): if 'dotlist' in self.metadata: self._restore() else: - self._yupana.new_yupana() + self._yupana.new_yupana(mode='ten') + + self._make_custom_toolbar() + if self._reload_custom: + self._custom_cb() def _setup_toolbars(self, have_toolbox): """ Setup the toolbars. """ @@ -90,6 +94,7 @@ class YupanaActivity(activity.Activity): self.max_participants = 4 yupana_toolbar = gtk.Toolbar() + self.custom_toolbar = gtk.Toolbar() if have_toolbox: toolbox = ToolbarBox() @@ -106,6 +111,13 @@ class YupanaActivity(activity.Activity): toolbox.toolbar.insert(yupana_toolbar_button, -1) yupana_toolbar_button.show() + custom_toolbar_button = ToolbarButton( + label=_("Custom"), page=self.custom_toolbar, + icon_name='view-source') + self.custom_toolbar.show() + toolbox.toolbar.insert(custom_toolbar_button, -1) + custom_toolbar_button.show() + self.set_toolbar_box(toolbox) toolbox.show() self.toolbar = toolbox.toolbar @@ -115,6 +127,7 @@ class YupanaActivity(activity.Activity): toolbox = activity.ActivityToolbox(self) self.set_toolbox(toolbox) toolbox.add_toolbar(_('Yupana'), yupana_toolbar) + toolbox.add_toolbar(_('Custom'), self.custom_toolbar) toolbox.show() toolbox.set_current_toolbar(1) self.toolbar = yupana_toolbar @@ -137,6 +150,14 @@ class YupanaActivity(activity.Activity): 'factor', yupana_toolbar, self._factor_cb, tooltip=_('prime-factor mode'), group=self.ten_button) + self.fibanocci_button = radio_factory( + 'fibanocci', yupana_toolbar, self._fibanocci_cb, + tooltip=_('fibanocci mode'), + group=self.ten_button) + self.custom_button = radio_factory( + 'view-source', yupana_toolbar, self._custom_cb, + tooltip=_('custom mode'), + group=self.ten_button) separator_factory(self.toolbar, False, False) self.status = label_factory(self.toolbar, '') @@ -151,6 +172,30 @@ class YupanaActivity(activity.Activity): toolbox.toolbar.insert(stop_button, -1) stop_button.show() + def _make_custom_toolbar(self): + self.ones = entry_factory(str(self._yupana.custom[0]), + self.custom_toolbar, + tooltip=_('one row')) + self.twos = entry_factory(str(self._yupana.custom[1]), + self.custom_toolbar, + tooltip=_('two row')) + self.threes = entry_factory(str(self._yupana.custom[2]), + self.custom_toolbar, + tooltip=_('three row')) + self.fives = entry_factory(str(self._yupana.custom[3]), + self.custom_toolbar, + tooltip=_('five row')) + + separator_factory(self.custom_toolbar, False, True) + self.base = entry_factory(str(self._yupana.custom[4]), + self.custom_toolbar, + tooltip=_('base')) + + separator_factory(self.custom_toolbar, False, True) + button_factory('view-refresh', self.custom_toolbar, self._custom_cb, + tooltip=_('Reload custom values.')) + + def _new_yupana_cb(self, button=None): ''' Start a new yupana. ''' self._yupana.new_yupana() @@ -158,22 +203,40 @@ class YupanaActivity(activity.Activity): def _ten_cb(self, button=None): self._yupana.new_yupana(mode='ten') self.status.set_label(_('decimal mode')) - return def _twenty_cb(self, button=None): self._yupana.new_yupana(mode='twenty') self.status.set_label(_('base-twenty mode')) - return def _factor_cb(self, button=None): self._yupana.new_yupana(mode='factor') self.status.set_label(_('prime-factor mode')) - return + + def _fibanocci_cb(self, button=None): + self._yupana.new_yupana(mode='fibanocci') + self.status.set_label(_('fibanocci mode')) + + def _custom_cb(self, button=None): + if hasattr(self, 'ones'): + self._yupana.custom[0] = self.ones.get_text() + self._yupana.custom[1] = self.twos.get_text() + self._yupana.custom[2] = self.threes.get_text() + self._yupana.custom[3] = self.fives.get_text() + self._yupana.custom[4] = self.base.get_text() + self._reload_custom = False + else: + self._reload_custom = True + self._yupana.new_yupana(mode='custom') + self.status.set_label(_('custom mode')) def write_file(self, file_path): """ Write the grid status to the Journal """ [mode, dot_list] = self._yupana.save_yupana() self.metadata['mode'] = mode + self.metadata['custom'] = '' + for i in range(5): + self.metadata['custom'] += str(self._yupana.custom[i]) + self.metadata['custom'] += ' ' self.metadata['dotlist'] = '' for dot in dot_list: self.metadata['dotlist'] += str(dot) @@ -182,13 +245,21 @@ class YupanaActivity(activity.Activity): def _restore(self): """ Restore the yupana state from metadata """ + if 'custom' in self.metadata: + values = self.metadata['custom'].split() + for i in range(5): + self._yupana.custom[i] = int(values[i]) if 'mode' in self.metadata: if self.metadata['mode'] == 'ten': - self._ten_cb() + self.ten_button.set_active(True) elif self.metadata['mode'] == 'twenty': - self._twenty_cb() + self.twenty_button.set_active(True) + elif self.metadata['mode'] == 'factor': + self.factor_button.set_active(True) + elif self.metadata['mode'] == 'fibanocci': + self.fibanocci_button.set_active(True) else: - self._factor_cb() + self.custom_button.set_active(True) if 'dotlist' in self.metadata: dot_list = [] dots = self.metadata['dotlist'].split() diff --git a/icons/fibanocci.svg b/icons/fibanocci.svg new file mode 100644 index 0000000..da535f1 --- /dev/null +++ b/icons/fibanocci.svg @@ -0,0 +1,88 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +2 +5 +20 + \ No newline at end of file diff --git a/yupana.py b/yupana.py index 9dab1fe..bce920a 100644 --- a/yupana.py +++ b/yupana.py @@ -62,6 +62,7 @@ class Yupana(): self.we_are_sharing = False self._sum = 0 self._mode = 'ten' + self.custom = [1, 1, 1, 1, 10] # Generate the sprites we'll need... self._sprites = Sprites(self._canvas) @@ -80,6 +81,7 @@ class Yupana(): Sprite(self._sprites, x, y, self._new_dot(self._colors[0]))) self._dots[-1].type = 0 # not set + self._dots[-1].set_label_color('white') x += self._dot_size + self._space x = int((p * self._width / 6.) + self._dot_size / 2.) + self._space y -= self._dot_size + self._space @@ -88,6 +90,7 @@ class Yupana(): Sprite(self._sprites, x, y, self._new_dot(self._colors[0]))) self._dots[-1].type = 0 # not set + self._dots[-1].set_label_color('white') x += self._dot_size + self._space y -= self._dot_size @@ -100,6 +103,7 @@ class Yupana(): Sprite(self._sprites, x, y, self._new_dot(self._colors[0]))) self._dots[-1].type = 0 # not set + self._dots[-1].set_label_color('white') x += self._dot_size + self._space x = int((p * self._width / 6.) + self._dot_size) + self._space y -= self._dot_size + self._space @@ -108,6 +112,7 @@ class Yupana(): Sprite(self._sprites, x, y, self._new_dot(self._colors[0]))) self._dots[-1].type = 0 # not set + self._dots[-1].set_label_color('white') x += self._dot_size + self._space y -= self._dot_size @@ -120,6 +125,7 @@ class Yupana(): Sprite(self._sprites, x, y, self._new_dot(self._colors[0]))) self._dots[-1].type = 0 # not set + self._dots[-1].set_label_color('white') x += self._dot_size + self._space y -= self._dot_size @@ -132,6 +138,7 @@ class Yupana(): Sprite(self._sprites, x, y, self._new_dot(self._colors[0]))) self._dots[-1].type = 0 # not set + self._dots[-1].set_label_color('white') x += self._dot_size + self._space y -= self._dot_size @@ -168,6 +175,51 @@ class Yupana(): if mode is not None: self._mode = mode + o = (SIX - 1) * (TEN + 1) # only label units + if mode == 'ten': + for i in range(TEN + 1): + self._dots[o + i].set_label('1') + self._dots[o - 1].set_label('10') + elif mode == 'twenty': + for i in range(TEN + 1): + if i in [7, 10]: + self._dots[o + i].set_label('1') + else: + self._dots[o + i].set_label('2') + self._dots[o - 1].set_label('20') + elif mode == 'factor': + for i in range(TEN + 1): + if i in [10]: + self._dots[o + i].set_label('1') + elif i in [8, 9]: + self._dots[o + i].set_label('2') + elif i in [5, 6, 7]: + self._dots[o + i].set_label('3') + else: + self._dots[o + i].set_label('5') + self._dots[o - 1].set_label('10') + elif mode == 'fibanocci': + for i in range(TEN + 1): + if i in [10]: + self._dots[o + i].set_label('1') + elif i in [8, 9]: + self._dots[o + i].set_label('2') + elif i in [5, 6, 7]: + self._dots[o + i].set_label('5') + else: + self._dots[o + i].set_label('20') + self._dots[o - 1].set_label('60') + else: # custom + for i in range(TEN + 1): + if i in [10]: + self._dots[o + i].set_label(str(self.custom[0])) + elif i in [8, 9]: + self._dots[o + i].set_label(str(self.custom[1])) + elif i in [5, 6, 7]: + self._dots[o + i].set_label(str(self.custom[2])) + else: + self._dots[o + i].set_label(str(self.custom[3])) + self._dots[o - 1].set_label(str(self.custom[4])) if self.we_are_sharing: _logger.debug('sending a new yupana') @@ -232,7 +284,7 @@ class Yupana(): return 20 ** e else: return (20 ** e) * 2 - else: # factor mode + elif self._mode == 'factor': if m in [10]: return 10 ** e elif m in [8, 9]: @@ -241,6 +293,25 @@ class Yupana(): return (10 ** e) * 3 else: return (10 ** e) * 5 + elif self._mode == 'fibanocci': + if m in [10]: + return 60 ** e + elif m in [8, 9]: + return (60 ** e) * 2 + elif m in [5, 6, 7]: + return (60 ** e) * 5 + else: + return (60 ** e) * 20 + else: # custom + if m in [10]: + return (self.custom[4] ** e) * self.custom[0] + elif m in [8, 9]: + return (self.custom[4] ** e) * self.custom[1] + elif m in [5, 6, 7]: + return (self.custom[4] ** e) * self.custom[2] + else: + return (self.custom[4] ** e) * self.custom[3] + def remote_button_press(self, dot, color): ''' Receive a button press from a sharer ''' -- cgit v0.9.1