diff options
Diffstat (limited to 'activity.py')
-rw-r--r-- | activity.py | 312 |
1 files changed, 215 insertions, 97 deletions
diff --git a/activity.py b/activity.py index 81c36ae..f6d822e 100644 --- a/activity.py +++ b/activity.py @@ -27,13 +27,19 @@ import logging _logger = logging.getLogger('memorize-activity') from gettext import gettext as _ -from os.path import join, dirname +import os + +import zipfile import gtk import telepathy import telepathy.client -from sugar.activity.activity import Activity, ActivityToolbox +from sugar.activity.widgets import ActivityToolbarButton +from sugar.activity.widgets import StopButton +from sugar.graphics.toolbarbox import ToolbarBox +from sugar.graphics.radiotoolbutton import RadioToolButton +from sugar.activity.activity import Activity from sugar.presence import presenceservice from sugar.presence.tubeconn import TubeConnection @@ -52,38 +58,85 @@ SERVICE = 'org.laptop.Memorize' IFACE = SERVICE PATH = '/org/laptop/Memorize' -_TOOLBAR_PLAY = 1 -_TOOLBAR_CREATE = 2 +_MODE_PLAY = 1 +_MODE_CREATE = 2 + class MemorizeActivity(Activity): - + def __init__(self, handle): Activity.__init__(self, handle) - self.create_load = False self.play_mode = None - - toolbox = ActivityToolbox(self) - activity_toolbar = toolbox.get_activity_toolbar() - - self._memorizeToolbar = memorizetoolbar.MemorizeToolbar(self) - toolbox.add_toolbar(_('Play'), self._memorizeToolbar) - self._memorizeToolbar.show() - - self._createToolbar = createtoolbar.CreateToolbar(self) - toolbox.add_toolbar(_('Create'), self._createToolbar) - self._createToolbar.show() - - self.set_toolbox(toolbox) - toolbox.show() - + + toolbar_box = ToolbarBox() + self.set_toolbar_box(toolbar_box) + + self.activity_button = ActivityToolbarButton(self) + toolbar_box.toolbar.insert(self.activity_button, -1) + + tool_group = None + self._play_button = RadioToolButton() + self._play_button.mode = _MODE_PLAY + self._play_button.props.icon_name = 'player_play' + self._play_button.set_tooltip(_('Play game')) + self._play_button.props.group = tool_group + toolbar_box.toolbar.insert(self._play_button, -1) + tool_group = self._play_button + + self._edit_button = RadioToolButton() + self._edit_button.mode = _MODE_CREATE + self._edit_button.props.icon_name = 'view-source' + self._edit_button.set_tooltip(_('Edit game')) + self._edit_button.props.group = tool_group + toolbar_box.toolbar.insert(self._edit_button, -1) + + toolbar_box.toolbar.insert(gtk.SeparatorToolItem(), -1) + + self._memorizeToolbarBuilder = \ + memorizetoolbar.MemorizeToolbarBuilder(self) + + toolbar_box.toolbar.insert(gtk.SeparatorToolItem(), -1) + + self._createToolbarBuilder = \ + createtoolbar.CreateToolbarBuilder(self) + + separator = gtk.SeparatorToolItem() + separator.set_expand(True) + separator.set_draw(False) + separator.set_size_request(0, -1) + toolbar_box.toolbar.insert(separator, -1) + + toolbar_box.toolbar.insert(StopButton(self), -1) + # Play game mode self.table = cardtable.CardTable() self.scoreboard = scoreboard.Scoreboard() + self.cardlist = cardlist.CardList() + self.createcardpanel = createcardpanel.CreateCardPanel() + self.cardlist.connect('pair-selected', + self.createcardpanel.pair_selected) + self.cardlist.connect('update-create-toolbar', + self._createToolbarBuilder.update_create_toolbar) + self.createcardpanel.connect('add-pair', + self.cardlist.add_pair) + self.createcardpanel.connect('update-pair', + self.cardlist.update_selected) + self._createToolbarBuilder.connect('create_new_game', + self.cardlist.clean_list) + self._createToolbarBuilder.connect('create_new_game', + self.createcardpanel.clean) + self._createToolbarBuilder.connect('create_equal_pairs', + self.change_equal_pairs) self.game = game.MemorizeGame() + self._play_button.connect('clicked', self._change_mode_bt) + self._edit_button.connect('clicked', self._change_mode_bt) + self.table.connect('key-press-event', self.table.key_press_event) self.table.connect('card-flipped', self.game.card_flipped) + self.table.connect('card-flipped', + self._memorizeToolbarBuilder.card_flipped) self.table.connect('card-overflipped', self.game.card_overflipped) self.table.connect('card-highlighted', self.game.card_highlighted) @@ -107,11 +160,14 @@ class MemorizeActivity(Activity): self.game.connect('load_game', self.table.load_game) self.game.connect('change_game', self.table.change_game) - self.game.connect('load_game', self._memorizeToolbar.update_toolbar) - self.game.connect('change_game', self._memorizeToolbar.update_toolbar) - - self._memorizeToolbar.connect('game_changed', self.game.change_game) - + self.game.connect('load_game', + self._memorizeToolbarBuilder.update_toolbar) + self.game.connect('change_game', + self._memorizeToolbarBuilder.update_toolbar) + + self._memorizeToolbarBuilder.connect('game_changed', + self.change_game) + self.hbox = gtk.HBox(False) self.set_canvas(self.hbox) @@ -126,80 +182,135 @@ class MemorizeActivity(Activity): # start on the game toolbar, might change this # to the create toolbar later - self.toolbox.connect('current-toolbar-changed', self.change_mode) - self.toolbox.set_current_toolbar(_TOOLBAR_PLAY) + self._change_mode(_MODE_PLAY) # Get the Presence Service self.pservice = presenceservice.get_instance() self.initiating = None - + # Buddy object for you owner = self.pservice.get_owner() self.owner = owner self.current = 0 - - self.game.set_myself(self.owner) + + self.game.set_myself(self.owner) self.connect('shared', self._shared_cb) - + # Owner.props.key if self._shared_activity: # We are joining the activity self.connect('joined', self._joined_cb) if self.get_shared(): # We've already joined - self._joined_cb() - else: + self._joined_cb(self) + elif not self._jobject.file_path: _logger.debug('buddy joined - __init__: %s', self.owner.props.nick) - game_file = join(dirname(__file__), 'demos', 'addition.zip') + game_file = os.path.join(os.path.dirname(__file__), 'demos', + 'addition.zip') self.game.load_game(game_file, 4, 'demo') - _logger.debug('loading conventional') + self.cardlist.load_game(self.game) + _logger.debug('loading conventional') + self.game.add_buddy(self.owner) + else: self.game.add_buddy(self.owner) self.show_all() - + + def _change_mode_bt(self, button): + if button.get_active(): + self._change_mode(button.mode) + def read_file(self, file_path): - if self.metadata['mime_type'] == 'application/x-memorize-project': - self.toolbox.set_current_toolbar(_TOOLBAR_PLAY) - if self.metadata.has_key('icon-color'): - color = self.metadata['icon-color'] - else: - color = profile.get_color().to_string() - self.game.change_game(None, file_path, 4, 'file', - self.metadata['title'], color) - - def change_mode(self, notebook, index): - if index == _TOOLBAR_CREATE: - if not self.create_load: - # Create game mode - self.cardlist = cardlist.CardList() - self.createcardpanel = createcardpanel.CreateCardPanel() - self.createcardpanel.connect('add-pair', self.cardlist.add_pair) - self.createcardpanel.connect('update-pair', - self.cardlist.update_selected) - self.cardlist.connect('pair-selected', - self.createcardpanel.pair_selected) - self.cardlist.connect('update-create-toolbar', - self._createToolbar.update_create_toolbar) - self.cardlist.connect('update-create-buttons', - self._createToolbar.update_buttons_status) - self._createToolbar.connect('create_new_game', - self.cardlist.clean_list) - self._createToolbar.connect('create_new_game', - self.createcardpanel.clean) - self._createToolbar.connect('create_load_game', - self.cardlist.load_game) - self._createToolbar.connect('create_save_game', - self.cardlist.save_game) - self._createToolbar.connect('create_equal_pairs', \ - self.createcardpanel.change_equal_pairs) - self.create_load = True - - self.hbox.remove(self.scoreboard) - self.hbox.remove(self.table) - self.hbox.pack_start(self.createcardpanel, False) - self.hbox.pack_start(self.cardlist) - self.play_mode = False + if 'icon-color' in self.metadata: + color = self.metadata['icon-color'] + else: + color = profile.get_color().to_string() + self.change_game(None, file_path, 4, 'file', + self.metadata['title'], color) + def close(self, skip_save=False): + if self.game.model.is_demo: + Activity.close(self, skip_save=True) else: + Activity.close(self) + + def write_file(self, file_path): + temp_img_folder = os.path.join(self.game.model.temp_folder, 'images') + temp_snd_folder = os.path.join(self.game.model.temp_folder, 'sounds') + self.game.model.create_temp_directories() + game_zip = zipfile.ZipFile(file_path, 'w') + equal_pairs = self.game.model.data['equal_pairs'] == '1' + for pair in self.game.model.pairs: + # aimg + aimg = self.game.model.pairs[pair].get_property('aimg') + if aimg != None: + if equal_pairs: + aimgfile = 'img' + str(pair) + '.jpg' + else: + aimgfile = 'aimg' + str(pair) + '.jpg' + game_zip.write(os.path.join(temp_img_folder, aimgfile), + os.path.join('images', aimgfile)) + + # bimg + bimg = self.game.model.pairs[pair].get_property('bimg') + if bimg != None: + if equal_pairs: + bimgfile = 'img' + str(pair) + '.jpg' + else: + bimgfile = 'bimg' + str(pair) + '.jpg' + game_zip.write(os.path.join(temp_img_folder, bimgfile), + os.path.join('images', bimgfile)) + # asnd + asnd = self.game.model.pairs[pair].get_property('asnd') + if asnd != None: + game_zip.write(os.path.join(temp_snd_folder, asnd), + os.path.join('sounds', asnd)) + + # bsnd + bsnd = self.game.model.pairs[pair].get_property('bsnd') + if bsnd != None: + game_zip.write(os.path.join(temp_snd_folder, bsnd), + os.path.join('sounds', bsnd)) + + self.game.model.game_path = self.game.model.temp_folder + self.game.model.write() + game_zip.write(os.path.join(self.game.model.temp_folder, 'game.xml'), + 'game.xml') + game_zip.close() + self.metadata['mime_type'] = 'application/x-memorize-project' + + def _complete_close(self): + self._remove_temp_files() + Activity._complete_close(self) + + def _remove_temp_files(self): + tmp_root = os.path.join(os.environ['SUGAR_ACTIVITY_ROOT'], 'instance') + for root, dirs, files in os.walk(tmp_root, topdown=False): + for name in files: + os.remove(os.path.join(root, name)) + for name in dirs: + os.rmdir(os.path.join(root, name)) + + def _change_mode(self, mode): + logging.debug("Change mode %s" % mode) + if mode == _MODE_CREATE: + if self.play_mode == True: + self.hbox.remove(self.scoreboard) + self.hbox.remove(self.table) + self.hbox.pack_start(self.createcardpanel, False) + self.hbox.pack_start(self.cardlist) + self.game.model.create_temp_directories() + self.createcardpanel.set_temp_folder( + self.game.model.temp_folder) + self.play_mode = False + else: + if self.game.model.modified: + self.cardlist.update_model(self.game.model) + self.game.reset_game() + self.table.change_game(None, self.game.model.data, + self.game.model.grid) + self.save() + self.game.model.modified = False + if self.play_mode == False: self.hbox.remove(self.createcardpanel) self.hbox.remove(self.cardlist) @@ -207,13 +318,20 @@ class MemorizeActivity(Activity): self.hbox.pack_start(self.scoreboard) self.hbox.pack_start(self.table, False) self.play_mode = True - - def restart(self, widget): - self.game.reset() + self._memorizeToolbarBuilder.update_controls(mode == _MODE_PLAY) + self._createToolbarBuilder.update_controls(mode == _MODE_CREATE) + + def change_game(self, widget, game_name, size, mode, + title=None, color=None): + _logger.debug('Change game %s', game_name) + self.game.change_game(widget, game_name, size, mode, title, color) + if game_name is not None: + self.cardlist.load_game(self.game) + + def change_equal_pairs(self, widget, state): + self.cardlist.update_model(self.game.model) + self.createcardpanel.change_equal_pairs(widget, state) - def change_game(self, game_name, size, title=None, color=None): - self.game.change_game(game_name, size, title, color) - def _shared_cb(self, activity): _logger.debug('My activity was shared') self.initiating = True @@ -230,10 +348,10 @@ class MemorizeActivity(Activity): self.conn = self._shared_activity.telepathy_conn self.tubes_chan = self._shared_activity.telepathy_tubes_chan self.text_chan = self._shared_activity.telepathy_text_chan - + self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].connect_to_signal( \ 'NewTube', self._new_tube_cb) - + self._shared_activity.connect('buddy-joined', self._buddy_joined_cb) self._shared_activity.connect('buddy-left', self._buddy_left_cb) @@ -263,7 +381,7 @@ class MemorizeActivity(Activity): _logger.debug('This is not my activity: waiting for a tube...') self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].ListTubes( - reply_handler=self._list_tubes_reply_cb, + reply_handler=self._list_tubes_reply_cb, error_handler=self._list_tubes_error_cb) def _new_tube_cb(self, identifier, initiator, tube_type, service, @@ -278,7 +396,7 @@ class MemorizeActivity(Activity): self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].AcceptDBusTube( \ identifier) - self.tube_conn = TubeConnection(self.conn, + self.tube_conn = TubeConnection(self.conn, self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES], identifier, group_iface=self.text_chan[telepathy.CHANNEL_INTERFACE_GROUP]) @@ -299,8 +417,8 @@ class MemorizeActivity(Activity): assert handle != 0 return self.pservice.get_buddy_by_telepathy_handle( \ self.tp_conn_name, self.tp_conn_path, handle) - - def _buddy_joined_cb (self, activity, buddy): + + def _buddy_joined_cb(self, activity, buddy): if buddy != self.owner: if buddy.props.nick == '': _logger.debug("buddy joined: empty nick=%s. Will not add.", @@ -309,7 +427,7 @@ class MemorizeActivity(Activity): _logger.debug("buddy joined: %s", buddy.props.nick) self.game.add_buddy(buddy) - def _buddy_left_cb (self, activity, buddy): + def _buddy_left_cb(self, activity, buddy): if buddy.props.nick == '': _logger.debug("buddy joined: empty nick=%s. Will not remove", buddy.props.nick) @@ -317,11 +435,11 @@ class MemorizeActivity(Activity): _logger.debug("buddy left: %s", buddy.props.nick) self.game.rem_buddy(buddy) - def _focus_in(self, event, data=None): + def _focus_in(self, event, data=None): self.game.audio.play() - - def _focus_out(self, event, data=None): + + def _focus_out(self, event, data=None): self.game.audio.pause() - - def _cleanup_cb(self, data=None): - self.game.audio.stop() + + def _cleanup_cb(self, data=None): + self.game.audio.stop() |