Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/activity.py
diff options
context:
space:
mode:
Diffstat (limited to 'activity.py')
-rw-r--r--activity.py312
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()