From 693100a7f2dfcb8d4489b8e17a9929548aa450a4 Mon Sep 17 00:00:00 2001 From: Muriel de Souza Godoi Date: Fri, 02 Nov 2007 23:15:11 +0000 Subject: Di D Activities --- diff --git a/activity.py b/activity.py index 2d5be77..aa846a3 100755 --- a/activity.py +++ b/activity.py @@ -203,24 +203,27 @@ class MemorizeActivity(Activity): self.table.connect('card-flipped', self.game.card_flipped) self.table.connect('card-highlighted', self.game.card_highlighted) - self.game.connect('msg_buddy', self.scoreboard.set_buddy_message) - self.game.connect('reset_scoreboard', self.scoreboard.reset) - self.game.connect('reset_table', self.table.reset) - self.game.connect('load_game', self.table.load_game) - self.game.connect('load_mode', self.table.load_msg) - 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.game.connect('set-border', self.table.set_border) self.game.connect('flop-card', self.table.flop_card) self.game.connect('flip-card', self.table.flip_card) self.game.connect('highlight-card', self.table.highlight_card) + self.game.connect('load_mode', self.table.load_msg) + + self.game.connect('msg_buddy', self.scoreboard.set_buddy_message) self.game.connect('add_buddy', self.scoreboard.add_buddy) self.game.connect('rem_buddy', self.scoreboard.rem_buddy) self.game.connect('increase-score', self.scoreboard.increase_score) self.game.connect('wait_mode_buddy', self.scoreboard.set_wait_mode) self.game.connect('change-turn', self.scoreboard.set_selected) + self.game.connect('reset_scoreboard', self.scoreboard.reset) + self.game.connect('reset_table', self.table.reset) + + 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.connect('shared', self._shared_cb) self.play_load = True diff --git a/game.py b/game.py index 0a867fb..993cf04 100755 --- a/game.py +++ b/game.py @@ -53,7 +53,7 @@ class MemorizeGame(GObject): 'rem_buddy': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]), 'increase-score': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]), 'wait_mode_buddy': (SIGNAL_RUN_FIRST, None, 2 * [TYPE_PYOBJECT]), - 'msg_buddy': (SIGNAL_RUN_FIRST, None, 2 * [TYPE_PYOBJECT]), + 'msg_buddy': (SIGNAL_RUN_FIRST, None, 2 * [TYPE_PYOBJECT]), 'change-turn': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]), } @@ -103,9 +103,15 @@ class MemorizeGame(GObject): self.set_load_mode('Loading game...') self.model.grid = grid self.model.data = data + self.model.data['mode'] = mode self.emit('reset_scoreboard') if not signal: - self.emit('change_game_signal', mode, self.get_grid(), self.get_data(), self.waiting_players, self.model.data['game_file']) + self.emit('change_game_signal', + mode, + self.get_grid(), + self.get_data(), + self.waiting_players, + self.model.data['game_file']) self.emit('change_game', self.get_data(), self.get_grid()) for buddy in self.players: self.players_score[buddy] = 0 @@ -114,6 +120,7 @@ class MemorizeGame(GObject): self.last_highlight = 1 self.change_turn() self.model.data['running'] = 'False' + for card in self.model.grid: if card['state'] == '1': self.emit('flip-card', self.model.grid.index(card)) @@ -137,6 +144,10 @@ class MemorizeGame(GObject): def rem_buddy(self, buddy): _logger.debug('Buddy %r was removed from game', buddy.props.nick) if self.current_player == buddy and len(self.players) >= 2: + if self.last_flipped != -1: + self.emit('flop-card', self.last_flipped) + self.model.grid[self.last_flipped]['state'] = '0' + self.last_flipped = -1 self.change_turn() index = self.players.index(buddy) del self.players[index] @@ -154,104 +165,106 @@ class MemorizeGame(GObject): elif self.current_player == self.players[-1]: self.current_player = self.players[0] else: - self.current_player = self.players[self.players.index(self.current_player)+1] + next = self.players[self.players.index(self.current_player)+1] + self.current_player = next self.set_sensitive(self.current_player == self.myself) self.emit('change-turn', self.current_player) + def play_sound(self, snd, sound_file): + if len(snd.split('.')) > 1: + if snd.split('.')[1] in ['wav', 'aif', 'aiff']: + self.cs.perform('i 102 0.0 3.0 "%s" 1 0.9 0'%(sound_file)) + else: + self.cs.perform('i 100 0.0 3.0 "%s" 1 0.9 0'%(sound_file)) + def card_flipped(self, widget, id, signal = False): + # Check if is my turn - if not self.sentitive and not signal: - return - - # do not process flips when flipping back - if self.flip_block is True: + if (not self.sentitive and not signal) or self.last_flipped == id: return # Handle groups if needed - if self.model.data['divided'] == '1': + if self.model.data.get('divided') == '1': if self.last_flipped == -1 and id >= (len(self.model.grid)/2): return if self.last_flipped <> -1 and id < (len(self.model.grid)/2): return + + # do not process flips when flipping back + if self.flip_block: + return + else: + self.flip_block = True + self.model.data['running'] = 'True' - # play sound in any case if available + # play sound in case if available if self.sound == 1: snd = self.model.grid[id].get('snd', None) if snd != None: - sound_file = join(self.model.data.get('pathsnd'),snd) - if len(snd.split('.')) > 1: - if snd.split('.')[1] in ['wav', 'aif', 'aiff']: - self.cs.perform('i 102 0.0 3.0 "%s" 1 0.9 0'%(sound_file)) - else: - self.cs.perform('i 100 0.0 3.0 "%s" 1 0.9 0'%(sound_file)) - _logger.debug('Audio: play sound=%s'%sound_file) + sound_file = join(self.model.data.get('pathsnd'), snd) + self.play_sound(snd, sound_file) + self.emit('flip-card', id) + if not signal: + self.emit('flip-card-signal', id) + # First card case if self.last_flipped == -1: self.last_flipped = id self.model.grid[id]['state'] = '1' - self.emit('flip-card', id) - if not signal: - self.emit('flip-card-signal', id) - if self.model.data['divided'] == '1': - self.card_highlighted(widget, -1, False) + self.flip_block = False - # Pair matched - elif self.model.grid[self.last_flipped]['pairkey'] == self.model.grid[id]['pairkey']: - stroke_color, fill_color = self.current_player.props.color.split(',') - self.emit('set-border', id, stroke_color, fill_color) - self.emit('set-border', self.last_flipped, stroke_color, fill_color) - self.increase_point(self.current_player) - self.model.grid[id]['state'] = self.current_player.props.color - self.model.grid[self.last_flipped]['state'] = self.current_player.props.color - self.emit('flip-card', id) - if self.model.data['divided'] == '1': - self.card_highlighted(widget, -1, False) - if not signal: - self.emit('flip-card-signal', id) + # Second card case + else: + # Pair matched + pair_key_1 = self.model.grid[self.last_flipped]['pairkey'] + pair_key_2 = self.model.grid[id]['pairkey'] + + if pair_key_1 == pair_key_2: + stroke_color, fill_color = self.current_player.props.color.split(',') + self.emit('set-border', id, stroke_color, fill_color) + self.emit('set-border', self.last_flipped, stroke_color, fill_color) + + self.increase_point(self.current_player) + self.model.grid[id]['state'] = self.current_player.props.color + self.model.grid[self.last_flipped]['state'] = self.current_player.props.color + self.flip_block = False + # Pair didn't match + else: + self.model.grid[id]['state'] = '1' + self.set_sensitive(False) + timeout_add(2000, self.flop_card, id, self.last_flipped) self.last_flipped = -1 - # Pair don't match - elif self.model.grid[self.last_flipped]['pairkey'] != self.model.grid[id]['pairkey']: - self.flip_block = True - self.emit('flip-card', id) - if not signal: - self.emit('flip-card-signal', id) - self.model.grid[id]['state'] = '1' - timeout_add(2000, self.flop_card, id, widget) - - def flop_card(self, id, widget): + + def flop_card(self, id, id2): self.emit('flop-card', id) self.model.grid[id]['state'] = '0' - self.emit('flop-card', self.last_flipped) - if self.model.data['divided'] == '1': - self.card_highlighted(widget, -1, False) - # self.emit('highlight-card', id, True) - self.model.grid[self.last_flipped]['state'] = '0' - self.last_flipped = -1 + self.emit('flop-card', id2) + self.model.grid[id2]['state'] = '0' + + #if self.model.data['divided'] == '1': + # self.card_highlighted(widget, -1, False) + self.set_sensitive(True) self.flip_block = False self.change_turn() def card_highlighted(self, widget, id, mouse): - if id == -1: - self.last_highlight = 1 - self.emit('highlight-card', self.last_highlight, False) - return - - if not self.sentitive: + self.emit('highlight-card', self.last_highlight, False) + self.last_highlight = id + + if id == -1 or not self.sentitive: return + if self.model.data['divided'] == '1': if self.last_flipped == -1 and id >= (len(self.model.grid)/2): return if self.last_flipped <> -1 and id < (len(self.model.grid)/2): return - self.emit('highlight-card', self.last_highlight, False) - if mouse and self.model.grid[id]['state']=='0': - self.emit('highlight-card', id, True) - if not mouse: + + if mouse and self.model.grid[id]['state']=='0' or not mouse: self.emit('highlight-card', id, True) - - self.last_highlight = id + def increase_point(self, buddy): self.players_score[buddy] += 1 @@ -263,12 +276,11 @@ class MemorizeGame(GObject): def get_data(self): return self.model.data - def change_game(self, widget, game_name, size, mode, title = None, color= None): - if mode in ['file','demo']: + def change_game(self, widget, game_name, size, mode, title = None, color= None): + if mode in ['file', 'demo']: if self.model.read(game_name) != 0: logging.error(' Reading setup file %s'%game_name) return - #elif mode in ['reset','size']: if size == None: size = int(self.model.data['size']) self.model.def_grid(size) @@ -295,8 +307,7 @@ class MemorizeGame(GObject): self.sentitive = status if not status: self.emit('highlight-card', self.last_highlight, False) - else: - self.emit('highlight-card', self.last_highlight, True) + def get_sensitive(self): return self.sentitive diff --git a/memorizetoolbar.py b/memorizetoolbar.py index 015ac47..f57c410 100755 --- a/memorizetoolbar.py +++ b/memorizetoolbar.py @@ -32,8 +32,22 @@ _logger = logging.getLogger('memorize-activity') class MemorizeToolbar(gtk.Toolbar): __gtype_name__ = 'MemoryToolbar' - standard_game_names = ['Load demo games', 'addition', 'capitals', 'drumgit', 'letters', 'numbers', 'phonemes'] - translated_game_names = [_('Load demo games'), _('addition'), _('capitals'), _('drumgit'), _('letters'), _('numbers'), _('phonemes')] + standard_game_names = ['Load demo games', + 'addition', + 'capitals', + 'drumgit', + 'letters', + 'numbers', + 'phonemes' + ] + translated_game_names = [_('Load demo games'), + _('addition'), + _('capitals'), + _('drumgit'), + _('letters'), + _('numbers'), + _('phonemes') + ] __gsignals__ = { 'game_changed': (SIGNAL_RUN_FIRST, None, 5 * [TYPE_PYOBJECT]) @@ -76,9 +90,10 @@ class MemorizeToolbar(gtk.Toolbar): self._sizes = ['4 X 4', '5 X 5', '6 X 6'] for i, f in enumerate(self._sizes): self._size_combo.combo.append_item(i, f) - self._size_combo.combo.connect('changed', self._game_size_cb) + self.size_handle_id = self._size_combo.combo.connect('changed', self._game_size_cb) self._add_widget(self._size_combo) - + self._size_combo.combo.set_active(0) + separator = gtk.SeparatorToolItem() separator.set_draw(True) self.insert(separator, -1) @@ -105,7 +120,9 @@ class MemorizeToolbar(gtk.Toolbar): self.emit('game_changed', None, None, 'reset', None, None) def _load_game(self, button): - chooser = ObjectChooser(_('Choose memorize game'), None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT) + chooser = ObjectChooser(_('Choose memorize game'), + None, + gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT) jobject = '' try: result = chooser.run() @@ -133,20 +150,20 @@ class MemorizeToolbar(gtk.Toolbar): def _game_changed_cb(self, combobox): if combobox.get_active() == 0: return - if not self._lock: - game_name = self.standard_game_names[self._game_combo.combo.get_active()] - game_file = join(dirname(__file__), 'demos', game_name+'.zip') - game_size = int(self._sizes[self._size_combo.combo.get_active()][0]) - if game_name in self.translated_game_names: - index = self.translated_game_names.index(game_name) - game_name = self.standard_game_names[index] - self.emit('game_changed', game_file, game_size, 'demo', None, None) - #self.activity.change_game(game_file, game_size) - self._game_combo.combo.set_active(0) + title = game_name = self.standard_game_names[self._game_combo.combo.get_active()] + game_size = int(self._sizes[self._size_combo.combo.get_active()][0]) + + if game_name in self.translated_game_names: + index = self.translated_game_names.index(game_name) + game_name = self.standard_game_names[index] + + game_file = join(dirname(__file__), 'demos', game_name+'.zip') + self.emit('game_changed', game_file, game_size, 'demo', title, None) + self._game_combo.combo.set_active(0) def update_toolbar(self, widget, data, grid): size = data.get('size') - self._lock = True + self._size_combo.combo.handler_block(self.size_handle_id) size_index = self._sizes.index(size+' X '+size) self._size_combo.combo.set_active(int(size_index)) - self._lock = False + self._size_combo.combo.handler_unblock(self.size_handle_id) diff --git a/messenger.py b/messenger.py index e66e115..f7fc2bc 100644 --- a/messenger.py +++ b/messenger.py @@ -73,9 +73,10 @@ class Messenger(ExportedGObject): self.ordered_bus_names.append(sender) data = self.game.model.data path = data['game_file'] - title = data.get('title', 'Received game') - color = data.get('color', '#ff00ff,#00ff00') - self.file_sender(path, title, color) + if self.game.model.data['mode'] == 'file': + title = data.get('title', 'Received game') + color = data.get('color', '#ff00ff,#00ff00') + self.file_sender(sender, path, title, color) remote_object = self._tube.get_object(sender, PATH) remote_object.load_game(self.ordered_bus_names, @@ -91,16 +92,18 @@ class Messenger(ExportedGObject): self.player_id = bus_names.index(self._tube.get_unique_name()) #self.game.load_waiting_list(list) self.game.current_player = self.game.players[current_player] - self._change_game_receiver('file', grid, data, path) + self._change_game_receiver(data['mode'], grid, data, path) # Change game method def change_game(self, sender, mode, grid, data, waiting_list, zip): path = self.game.model.data['game_file'] - title = data.get('title', 'Received game') - color = data.get('color', '') + if mode == 'file': - self.file_sender(path, title, color) + title = data.get('title', 'Received game') + color = data.get('color', '') + self.file_sender('all', path, title, color) + self._change_game_signal(mode, grid, data, path) def _change_game_handler(self): @@ -119,33 +122,31 @@ class Messenger(ExportedGObject): if sender == self._tube.get_unique_name(): return if mode == 'demo': - game_name = self.game.model.data['key'] - game_file = join(dirname(__file__), 'demos', game_name+'.zip') + game_name = basename(data.get('game_file', 'debug-demo')) + game_file = join(dirname(__file__), 'demos', game_name).encode('ascii') self.game.model.read(game_file) if mode == 'file': self.game.model.read(self.files[path]) + data['path'] = self.game.model.data['path'] data['pathimg'] = self.game.model.data['pathimg'] data['pathsnd'] = self.game.model.data['pathsnd'] - if mode == 'demo': - self.game.load_remote(grid, data, mode, True) - else: - self.game.load_remote(grid, data, mode, True) + self.game.load_remote(grid, data, mode, True) # File transfer methods - - def file_sender(self, filename, title, color): + + def file_sender(self, target, filename, title, color): size = getsize(filename) f = open(filename, 'r+b') part_size = 4096 num_parts = (size / part_size) +1 for part in range(num_parts): bytes = f.read(part_size) - self._file_part_signal(filename, part+1, num_parts, bytes, title, color) + self._file_part_signal(target, filename, part+1, num_parts, bytes, title, color) f.close() - @signal(dbus_interface=IFACE, signature='suuayss') - def _file_part_signal(self, filename, part, numparts, bytes, title, color): + @signal(dbus_interface=IFACE, signature='ssuuayss') + def _file_part_signal(self, target, filename, part, numparts, bytes, title, color): pass def _file_part_handler(self): @@ -156,11 +157,15 @@ class Messenger(ExportedGObject): sender_keyword='sender', byte_arrays=True) - def _file_part_receiver(self, filename, part, numparts, bytes, title=None, color=None, sender=None): + def _file_part_receiver(self, target, filename, part, numparts, bytes, title=None, color=None, sender=None): # ignore my own signal if sender == self._tube.get_unique_name(): return + if not (target == 'all' or target == self._tube.get_unique_name()): + return + + # first chunk if part == 1: temp_dir = tempfile.mkdtemp() diff --git a/model.py b/model.py index 0751d57..ddfacbc 100644 --- a/model.py +++ b/model.py @@ -19,7 +19,7 @@ import libxml2 import os -from os.path import join, basename +from os.path import join, basename, dirname import logging import random import gobject @@ -104,7 +104,7 @@ class Model(object): self.data['align'] = '1' try: - self.dtd = libxml2.parseDTD(None, os.path.join(self.dtd_path, 'memorize.dtd')) + self.dtd = libxml2.parseDTD(None, join(self.dtd_path, 'memorize.dtd')) except libxml2.parserError, e: _logger.error('Init: no memorize.dtd found ' +str(e)) self.dtd = None @@ -122,10 +122,6 @@ class Model(object): self.count = 0 def read(self, game_file): - if game_file in ["addition", "capitals", "drumgit", "letters", "numbers", "phonemes"]: - game_file = os.path.join(os.path.dirname(__file__), 'games', game_file+'.zip') - game_name = os.path.basename(game_file)[:-4] - temp_folder = tempfile.mkdtemp() self.data['key'] = os.path.basename(game_file) self.data['game_file'] = game_file @@ -148,7 +144,7 @@ class Model(object): ''' reads the configuration from an xml file ''' try: - doc = libxml2.parseFile(os.path.join(os.path.dirname(__file__), os.path.join(self.data['path'], 'game.xml'))) + doc = libxml2.parseFile(join(dirname(__file__), join(self.data['path'], 'game.xml'))) if doc.validateDtd(self.ctxt, self.dtd): # get the requested nodes @@ -320,6 +316,7 @@ class Model(object): random.shuffle(temp1) self.grid = temp1 _logger.debug('Defgrid: grid( size=%s ): %s' %(self.data['size'], self.grid)) + _logger.debug('Defgrid: data: %s' %self.data) def set_data_grid(self, data, grid): self.data = data -- cgit v0.9.1