diff options
-rw-r--r-- | controller.py | 43 | ||||
-rw-r--r-- | csound/csoundserver.py | 113 | ||||
-rw-r--r-- | games/drumgit/drumgit.mson | 12 | ||||
-rw-r--r-- | gridtest.py | 71 | ||||
-rw-r--r-- | gridtest_cs.py | 93 | ||||
-rw-r--r-- | gridtest_gst.py | 105 | ||||
-rw-r--r-- | memosono.dtd | 9 | ||||
-rwxr-xr-x | memosonoactivity.py | 23 | ||||
-rw-r--r-- | model.py | 96 | ||||
-rw-r--r-- | playtile.py | 1 | ||||
-rw-r--r-- | playview.py | 1 |
11 files changed, 374 insertions, 193 deletions
diff --git a/controller.py b/controller.py index 0ae704f..495aeec 100644 --- a/controller.py +++ b/controller.py @@ -9,15 +9,16 @@ from dbus.service import method, signal from dbus.gobject_service import ExportedGObject from model import Model +from csound.csoundserver import CsoundServer -# XXX: I'm not convinced this is in the right namespace SERVICE = "org.freedesktop.Telepathy.Tube.Memosono" IFACE = SERVICE PATH = "/org/freedesktop/Telepathy/Tube/Memosono" - GAME_PATH = os.path.join(os.path.dirname(__file__),'games/drumgit') +IMAGES_PATH = os.path.join(os.path.dirname(__file__),'games/drumgit/images') +SOUNDS_PATH = os.path.join(os.path.dirname(__file__),'games/drumgit/sounds') MAX_NUM_PLAYERS = 2 _logger = logging.getLogger('controller') @@ -43,6 +44,10 @@ class Controller(ExportedGObject): self.numplayers = 0 self.turn = 0 + self.cs = CsoundServer() + gtk.gdk.threads_init() + self.cs.start() + if self.is_initiator: self.init_game() @@ -93,6 +98,8 @@ class Controller(ExportedGObject): path=PATH, sender_keyword='sender') self.tube.add_signal_receiver(self.flip_cb, 'Flip', IFACE, path=PATH, sender_keyword='sender') + self.tube.add_signal_receiver(self.play_cb, 'Play', IFACE, + path=PATH, sender_keyword='sender') self.tube.add_signal_receiver(self.points_cb, 'Points', IFACE, path=PATH, sender_keyword='sender') @@ -120,11 +127,26 @@ class Controller(ExportedGObject): def selected_cb(self, tilenum, sender=None): _logger.debug('MA: %s flipped tile %d', sender, tilenum) - obj, color = self.model.gettile(tilenum) if self.model.grid[tilenum][2] == 1: self.Info('selected already') else: - self.Flip(tilenum, obj, color) + pairkey, moch, state = self.model.grid[tilenum] + color = self.model.pairs[pairkey].props.color + + if moch == 0: + if self.model.pairs[pairkey].props.aimg != None: + img = os.path.join(IMAGES_PATH, self.model.pairs[pairkey].props.aimg) + self.Flip(tilenum, img, color) + if self.model.pairs[pairkey].props.asnd != None: + snd = os.path.join(SOUNDS_PATH, self.model.pairs[pairkey].props.asnd) + self.Play(tilenum, snd, color) + elif moch == 1: + if self.model.pairs[pairkey].props.bimg != None: + img = os.path.join(IMAGES_PATH, self.model.pairs[pairkey].props.bimg) + self.Flip(tilenum, img, color) + if self.model.pairs[pairkey].props.bsnd != None: + snd = os.path.join(SOUNDS_PATH, self.model.pairs[pairkey].props.bsnd) + self.Play(tilenum, snd, color) self.model.count+=1 if self.model.count == 1: @@ -171,10 +193,21 @@ class Controller(ExportedGObject): def flip_cb(self, tilenum, obj, color, sender=None): handle = self.tube.bus_name_to_handle[sender] - _logger.debug('Flipped tile(%d) from %s', tilenum, sender) + _logger.debug('Flipped tile(%d) from %s. Show image.', tilenum, sender) self.pv.flip(tilenum, os.path.join(os.path.dirname(__file__), obj), color) + @signal(dbus_interface=IFACE, signature='nsn') + def Play(self, tilenum, obj, color): + """Signal that a sound will be played""" + + def play_cb(self, tilenum, obj, color, sender=None): + handle = self.tube.bus_name_to_handle[sender] + _logger.debug('Flipped tile(%d) from %s. Play sound.', tilenum, sender) + _logger.debug(' Sound: %s', obj) + self.cs.perform('i 108 0.0 3.0 "%s" 1 0.7 0.5 0'%(obj)) + + @signal(dbus_interface=IFACE, signature='ss') def Turn(self, playerid, name): """Signal that it is the players turn""" diff --git a/csound/csoundserver.py b/csound/csoundserver.py index c384300..45eca28 100644 --- a/csound/csoundserver.py +++ b/csound/csoundserver.py @@ -1,106 +1,43 @@ #! /usr/bin/env python -import select import os import logging from threading import Thread import csnd -from osc.oscapi import OscApi + +_logger = logging.getLogger('csound') class CsoundServer(Thread): - CSOUND_PORT = 6783 - MAX_PINGS = 3 - TIMEOUT_PING = 10 def __init__(self): Thread.__init__(self) - self.oscapi = OscApi(self.CSOUND_PORT) - self.oscapi.addmethod('/CSOUND/connect', '', self._connect) - self.oscapi.addmethod('/CSOUND/pong', '', self._pong) - self.oscapi.addmethod('/CSOUND/perform', 's', self._perform) - self.oscapi.addmethod('/CSOUND/disconnect', '', self._disconnect) - self.oscapi.addmethod('/CSOUND/quit', '', self._quit) - self.running = 1 - - self.clients = {} - self.start() - - def run(self): - logging.info('start listening...') self.csound = csnd.Csound() - - while self.running: - inputready,outputready,exceptready = select.select([self.oscapi.iosock],[], [], self.TIMEOUT_PING) - for s in inputready: - if s == self.oscapi.iosock: - data, address = s.recvfrom(1024) - self.oscapi.handlemsg(data, address) - if len(inputready) == 0: - self.ping() - - def ping(self): - rm = [] - for client in self.clients: - if self.clients[client] == self.MAX_PINGS: - rm.append(client) - logging.debug('[ping] remove client %s'%str(client)) - else: - self.oscapi.send(client, '/CSOUND/ping', []) - self.clients[client]+=1 - ### print ' [ping] client=%s seq=%s'%(str(client), self.clients[client]) - - for elem in rm: - del self.clients[elem] - if len(self.clients) == 0: - self.perf.Stop() - self.perf.Join() - self.csound.Reset() - logging.debug('[csound] stop csound performance') - - - def _connect(self, *msg): - if msg[1] in self.clients: - logging.debug('[connect_cb] %s already connected'%str(msg[1])) - else: - self.clients[msg[1]]=0 - logging.debug('[connect_cb] %s connected'%str(msg[1])) - if len(self.clients) == 1: - self.perf = csnd.CsoundPerformanceThread(self.csound) - uniorcpath = os.path.join( os.path.dirname(__file__), 'univorc.csd') - if not os.path.exists(uniorcpath): - logging.error('[csound] univorc not found %s'%uniorcpath) - self.csound.Compile(uniorcpath) - self.perf.Play() - logging.debug('[csound] start csound performance %s'%uniorcpath) - - def _disconnect(self, *msg): - if msg[1] not in self.clients: - logging.debug('[disconnect_cb] %s not connected'%str(msg[1])) - else: - del self.clients[msg[1]] - logging.debug('[disconnect_cb] %s disconnected'%str(msg[1])) - if len(self.clients) == 0: - self.perf.Stop() - self.perf.Join() - self.csound.Reset() - logging.debug('[csound] stop csound performance') - - - def _quit(self, *msg): - logging.info('stop listening...') - self.running = 0 + def start(self): + self.perf = csnd.CsoundPerformanceThread(self.csound) + uniorcpath = os.path.join( os.path.dirname(__file__), 'univorc.csd') + if not os.path.exists(uniorcpath): + _logger.error('univorc not found %s'%uniorcpath) + else: + self.csound.Compile(uniorcpath) + self.perf.Play() + _logger.debug('start csound performance %s'%uniorcpath) + + def pause(self): + self.perf.Stop() + self.perf.Join() self.csound.Reset() - self.csound = None - - - def _pong(self, *msg): - self.clients[msg[1]]-=1 - ### print ' [pong_cb] %s'%str(msg) + _logger.debug('stop performance') + def perform(self, msg): + _logger.debug(' [perform_cb] %s'%str(msg)) + self.perf.InputMessage(msg) - def _perform(self, *msg): - logging.debug(' [perform_cb] %s'%str(msg[0][2])) - self.perf.InputMessage(msg[0][2]) + def quit(self): + _logger.info('quit') + self.perf.Stop() + self.perf.Join() + self.csound.Reset() + self.csound = None diff --git a/games/drumgit/drumgit.mson b/games/drumgit/drumgit.mson index f508fa1..0c3aaae 100644 --- a/games/drumgit/drumgit.mson +++ b/games/drumgit/drumgit.mson @@ -1,11 +1,17 @@ <?xml version="1.0"?> <memosono name="drumgit"> - <pair id="1" mother="guitar12_2.jpg" child="guitar12_2.jpg" color="100" /> - <pair id="2" mother="drumkit2_b.jpg" child="drumkit2_b.jpg" color="100" /> - <pair id="3" mother="guitar8_2.jpg" child="guitar8_2.jpg" color="100" /> + <pair aimg="guitar10_2.jpg" asnd="guitcello.aiff" bimg="guitar10_2.jpg" bsnd="guitcello.aiff" color="100" /> + <pair aimg="guitar8_2.jpg" asnd="git_hit1.aiff" bimg="guitar8_2.jpg" bsnd="git_hit1.aiff" color="100" /> + <pair aimg="drumkit2_b.jpg" asnd="beat1_b.aiff" bimg="drumkit2_b.jpg" bsnd="beat1_b.aiff" color="100" /> + </memosono> + <!-- + <pair aimg="guitar12_2.jpg" bimg="guitar12_2.jpg" color="100" /> + <pair aimg="guitar8_2.jpg" bimg="guitar8_2.jpg" color="100" /> + <pair aimg="drumkit2_b.jpg" bimg="drumkit2_b.jpg" color="100" /> + drumkit1_b.jpg beat1_a.aiff drumkit2_b.jpg beat1_b.aiff drumkit3_b.jpg beat1_c.aiff diff --git a/gridtest.py b/gridtest.py deleted file mode 100644 index d442808..0000000 --- a/gridtest.py +++ /dev/null @@ -1,71 +0,0 @@ -import gtk -import os -import random -import hippo -import gobject - -from playview import PlayView -from model import Model - -GAME_PATH = os.path.join(os.path.dirname(__file__),'games/drumgit') -IMAGES_PATH = os.path.join(os.path.dirname(__file__),'games/drumgit/images') - -class Test(object): - def __init__(self): - - self.model = Model(GAME_PATH, os.path.dirname(__file__)) - self.model.read('drumgit.mson') - print 'pairs: %s' %self.model.pairs - - ### create grid from pairs information - self.grid = [] - for key in self.model.pairs.iterkeys(): - self.grid.append((key, 0)) - self.grid.append((key, 1)) - print 'self.grid: %s'%self.grid - - ### shuffle the grid tiles - random.shuffle(self.grid) - print 'self.grid after shufle: %s'%self.grid - - self.pv = PlayView( len(self.grid) ) - for tile in self.pv.tiles: - tile.connect('button-press-event', self._button_press_cb, self.pv.tiles.index(tile)) - - hbox = hippo.CanvasBox(spacing=4, - orientation=hippo.ORIENTATION_HORIZONTAL) - hbox.append(self.pv, hippo.PACK_EXPAND) - - canvas = hippo.Canvas() - canvas.set_root(hbox) - - window = gtk.Window() - window.connect('destroy', gtk.main_quit) - window.connect('key-press-event', self.key_press_cb) - window.add(canvas) - window.show_all() - try: - gtk.main() - except KeyboardInterupt: - pass - - def key_press_cb(self, window, event): - if gtk.gdk.keyval_name(event.keyval) in ('Escape', 'q'): - gtk.main_quit() - - def _button_press_cb(self, tile, event, tilenum=None): - print 'selected tile=%s'%str(tilenum) - pairkey, moch = self.grid[tilenum] - obj = os.path.join(IMAGES_PATH, self.model.pairs[pairkey][moch]) - color = self.model.pairs[pairkey][2] - print 'obj=%s color=%s'%(obj, color) - self.pv.flip(tilenum, obj, color) - gobject.timeout_add(2000, self._turn_back, tilenum) - - def _turn_back(self, tilenum): - self.pv.flip(tilenum, os.path.join(os.path.dirname(__file__), 'images/black.png'), 100) - return False - -if __name__ == '__main__': - Test() - diff --git a/gridtest_cs.py b/gridtest_cs.py new file mode 100644 index 0000000..6bcc89b --- /dev/null +++ b/gridtest_cs.py @@ -0,0 +1,93 @@ +import gtk +import os +import random +import hippo +import gobject + +from playview import PlayView +from gmodel import Model + +from csound.csoundserver import CsoundServer + + +GAME_PATH = os.path.join(os.path.dirname(__file__),'games/drumgit') +IMAGES_PATH = os.path.join(os.path.dirname(__file__),'games/drumgit/images') +SOUNDS_PATH = os.path.join(os.path.dirname(__file__),'games/drumgit/sounds') + +class Test(object): + def __init__(self): + + self.cs = CsoundServer() + self.cs.start() + gtk.gdk.threads_init() + + self.model = Model(GAME_PATH, os.path.dirname(__file__)) + self.model.read('drumgit.mson') + self.model.def_grid() + print '%s' %self.model.pairs[0]._properties + print '%s' %self.model.pairs[1]._properties + print '%s' %self.model.pairs[2]._properties + print 'self.grid: %s'%self.model.grid + + self.pv = PlayView( len(self.model.grid) ) + for tile in self.pv.tiles: + tile.connect('button-press-event', self._button_press_cb, self.pv.tiles.index(tile)) + + hbox = hippo.CanvasBox(spacing=4, + orientation=hippo.ORIENTATION_HORIZONTAL) + hbox.append(self.pv, hippo.PACK_EXPAND) + + canvas = hippo.Canvas() + canvas.set_root(hbox) + + window = gtk.Window() + window.connect('destroy', gtk.main_quit) + window.connect('key-press-event', self.key_press_cb) + window.add(canvas) + window.show_all() + try: + gtk.main() + except KeyboardInterupt: + pass + + def _handle_query(self, source, condition): + data, self.replyaddr = source.recvfrom(1024) + self.oscapi.handlemsg(data, self.replyaddr) + return True + + def _ping(self, *msg): + self.oscapi.send(msg[1], '/CSOUND/pong', []) + + def key_press_cb(self, window, event): + if gtk.gdk.keyval_name(event.keyval) in ('Escape', 'q'): + gtk.main_quit() + self.cs.quit() + + def _button_press_cb(self, tile, event, tilenum=None): + print 'selected tile=%s'%str(tilenum) + pairkey, moch, state = self.model.grid[tilenum] + color = self.model.pairs[pairkey].props.color + if moch == 0: + if self.model.pairs[pairkey].props.aimg != None: + img = os.path.join(IMAGES_PATH, self.model.pairs[pairkey].props.aimg) + self.pv.flip(tilenum, img, color) + gobject.timeout_add(2000, self._turn_back, tilenum) + if self.model.pairs[pairkey].props.asnd != None: + snd = os.path.join(SOUNDS_PATH, self.model.pairs[pairkey].props.asnd) + self.cs.perform('i 108 0.0 3.0 "%s" 1 0.7 0.5 0'%snd) + elif moch == 1: + if self.model.pairs[pairkey].props.bimg != None: + img = os.path.join(IMAGES_PATH, self.model.pairs[pairkey].props.bimg) + self.pv.flip(tilenum, img, color) + gobject.timeout_add(2000, self._turn_back, tilenum) + if self.model.pairs[pairkey].props.bsnd != None: + snd = os.path.join(SOUNDS_PATH, self.model.pairs[pairkey].props.bsnd) + self.cs.perform('i 108 0.0 3.0 "%s" 1 0.7 0.5 0'%snd) + + def _turn_back(self, tilenum): + self.pv.flip(tilenum, os.path.join(os.path.dirname(__file__), 'images/black.png'), 100) + return False + +if __name__ == '__main__': + Test() + diff --git a/gridtest_gst.py b/gridtest_gst.py new file mode 100644 index 0000000..034dc84 --- /dev/null +++ b/gridtest_gst.py @@ -0,0 +1,105 @@ +import gtk +import os +import random +import hippo +import gobject + +import pygst +pygst.require("0.10") +import gst + +from playview import PlayView +from gmodel import Model + + +GAME_PATH = os.path.join(os.path.dirname(__file__),'games/drumgit') +IMAGES_PATH = os.path.join(os.path.dirname(__file__),'games/drumgit/images') +SOUNDS_PATH = os.path.join(os.path.dirname(__file__),'games/drumgit/sounds') + +class Test(object): + def __init__(self): + + self.model = Model(GAME_PATH, os.path.dirname(__file__)) + self.model.read('drumgit.mson') + self.model.def_grid() + print '%s' %self.model.pairs[0]._properties + print '%s' %self.model.pairs[1]._properties + print '%s' %self.model.pairs[2]._properties + print 'self.grid: %s'%self.model.grid + + self.pv = PlayView( len(self.model.grid) ) + for tile in self.pv.tiles: + tile.connect('button-press-event', self._button_press_cb, self.pv.tiles.index(tile)) + + hbox = hippo.CanvasBox(spacing=4, + orientation=hippo.ORIENTATION_HORIZONTAL) + hbox.append(self.pv, hippo.PACK_EXPAND) + + canvas = hippo.Canvas() + canvas.set_root(hbox) + + window = gtk.Window() + window.connect('destroy', gtk.main_quit) + window.connect('key-press-event', self.key_press_cb) + window.add(canvas) + window.show_all() + + + self.player = gst.element_factory_make("playbin", "player") + fakesink = gst.element_factory_make('fakesink', "my-fakesink") + self.player.set_property("video-sink", fakesink) + bus = self.player.get_bus() + bus.add_signal_watch() + bus.connect('message', self.on_message) + + try: + gtk.main() + except KeyboardInterupt: + pass + + def key_press_cb(self, window, event): + if gtk.gdk.keyval_name(event.keyval) in ('Escape', 'q'): + gtk.main_quit() + + def _button_press_cb(self, tile, event, tilenum=None): + print 'selected tile=%s'%str(tilenum) + pairkey, moch, state = self.model.grid[tilenum] + color = self.model.pairs[pairkey].props.color + if moch == 0: + if self.model.pairs[pairkey].props.aimg != None: + img = os.path.join(IMAGES_PATH, self.model.pairs[pairkey].props.aimg) + self.pv.flip(tilenum, img, color) + gobject.timeout_add(2000, self._turn_back, tilenum) + if self.model.pairs[pairkey].props.asnd != None: + snd = os.path.join(SOUNDS_PATH, self.model.pairs[pairkey].props.asnd) + ssnd = os.path.join('/home/erikos/sugar-jhbuild/source/memosono', snd) + print ssnd + self.player.set_property('uri', "file://" + ssnd) + self.player.set_state(gst.STATE_PLAYING) + elif moch == 1: + if self.model.pairs[pairkey].props.bimg != None: + img = os.path.join(IMAGES_PATH, self.model.pairs[pairkey].props.bimg) + self.pv.flip(tilenum, img, color) + gobject.timeout_add(2000, self._turn_back, tilenum) + if self.model.pairs[pairkey].props.bsnd != None: + snd = os.path.join(SOUNDS_PATH, self.model.pairs[pairkey].props.bsnd) + ssnd = os.path.join('/home/erikos/sugar-jhbuild/source/memosono', snd) + print ssnd + self.player.set_property('uri', "file://" + ssnd) + self.player.set_state(gst.STATE_PLAYING) + + def _turn_back(self, tilenum): + self.pv.flip(tilenum, os.path.join(os.path.dirname(__file__), 'images/black.png'), 100) + return False + + def on_message(self, bus, message): + t = message.type + print t + if t == gst.MESSAGE_EOS: + self.player.set_state(gst.STATE_NULL) + elif t == gst.MESSAGE_ERROR: + self.player.set_state(gst.STATE_NULL) + +if __name__ == '__main__': + Test() + gtk.gdk.threads_init() diff --git a/memosono.dtd b/memosono.dtd index bd46b94..713c779 100644 --- a/memosono.dtd +++ b/memosono.dtd @@ -7,8 +7,9 @@ <!ELEMENT pair (#PCDATA)* > <!ATTLIST pair - id CDATA #REQUIRED - mother CDATA #REQUIRED - child CDATA #REQUIRED - color CDATA #REQUIRED + aimg CDATA #IMPLIED + asnd CDATA #IMPLIED + bimg CDATA #IMPLIED + bsnd CDATA #IMPLIED + color CDATA #IMPLIED > diff --git a/memosonoactivity.py b/memosonoactivity.py index ce1890a..e375669 100755 --- a/memosonoactivity.py +++ b/memosonoactivity.py @@ -91,6 +91,11 @@ class MemosonoActivity(Activity): self.set_toolbox(toolbox) toolbox.show() + # connect to the in/out events of the memosono activity + self.connect('focus_in_event', self._focus_in) + self.connect('focus_out_event', self._focus_out) + self.connect('destroy', self._cleanup_cb) + self.info_panel.show('To play, share!') self.connect('shared', self._shared_cb) @@ -251,5 +256,19 @@ class MemosonoActivity(Activity): _logger.debug('buddy left') self.buddies_panel.remove_watcher(buddy) - - + def _cleanup_cb(self, data=None): + if self.ctrl != None: + self.ctrl.cs.quit() + _logger.debug(" Memosono closes: close csound server. ") + + def _focus_in(self, event, data=None): + if self.ctrl != None: + self.ctrl.cs.start() + _logger.debug(" Memosono is visible: start csound server. ") + + def _focus_out(self, event, data=None): + if self.ctrl != None: + self.ctrl.cs.start() + _logger.debug(" Memosono is invisible: pause csound server. ") + + @@ -2,11 +2,58 @@ import libxml2 import os import logging import random +import gobject IMAGES_PATH = 'games/drumgit/images' +GAME_PATH = 'games/drumgit' _logger = logging.getLogger('model') + +class Pair(gobject.GObject): + __gproperties__ = { + 'aimg' : (str, None, None, None, gobject.PARAM_READWRITE), + 'asnd' : (str, None, None, None, gobject.PARAM_READWRITE), + 'bimg' : (str, None, None, None, gobject.PARAM_READWRITE), + 'bsnd' : (str, None, None, None, gobject.PARAM_READWRITE), + 'color': (gobject.TYPE_INT, 'Base', 'Base', 0, 10, 0, gobject.PARAM_READWRITE) + } + + def __init__(self): + gobject.GObject.__init__(self) + self._properties = {'aimg':None, 'asnd':None, 'bimg':None, 'bsnd':None, 'color':100} + + def do_get_property(self, pspec): + """Retrieve a particular property from our property dictionary + """ + if pspec.name == "aimg": + return self._properties["aimg"] + elif pspec.name == "asnd": + return self._properties["asnd"] + elif pspec.name == "bimg": + return self._properties["bimg"] + elif pspec.name == "bsnd": + return self._properties["bsnd"] + elif pspec.name == "color": + return self._properties["color"] + + def set_property(self, name, value): + if name == 'aimg': + self._properties['aimg'] = value + elif name == "asnd": + self._properties["asnd"] = value + elif name == "bimg": + self._properties["bimg"] = value + elif name == "bsnd": + self._properties["bsnd"] = value + elif name == "color": + self._properties["color"] = int(value) + ''' + def do_set_property(self, props, value): + if props.name == 'a_img': + self._properties['a_img'] = value + ''' + class Model(object): ''' The model of the activity. Contains methods to read and save the configuration for a game from xml. Stores the pairs and grid @@ -46,25 +93,22 @@ class Model(object): res = xpa.xpathEval("//*") # write their content to the data structure + self.idpair = 0 for elem in res: attributes = elem.get_properties() - pair = [] - idpair = 0 + pair = Pair() for attribute in attributes: if(attribute.name == 'text'): pass - if(attribute.name == 'id'): - idpair = int(attribute.content) - if(attribute.name == 'mother'): - pair.append(attribute.content) - if(attribute.name == 'child'): - pair.append(attribute.content) - if(attribute.name == 'color'): - pair.append(int(attribute.content)) - if( elem.name == 'memosono' ): - self.name = attribute.content - if( elem.name != 'memosono' ): - self.pairs[idpair] = pair + else: + pass + pair.set_property(attribute.name, attribute.content) + if( elem.name == 'pair' ): + self.pairs[self.idpair] = pair + self.idpair+=1 + elif( elem.name == 'memosono' ): + self.name = attribute.content + xpa.xpathFreeContext() else: _logger.error('Error in validation of the file') @@ -81,10 +125,15 @@ class Model(object): for key in self.pairs: elem = root.newChild(None, "pair", None) - elem.setProp("id", key) - elem.setProp("mother", self.pairs[key][0]) - elem.setProp("child", self.pairs[key][1]) - elem.setProp("color", self.pairs[key][2]) + if self.pairs[key].props.aimg != None: + elem.setProp("aimg", self.pairs[key].props.aimg) + if self.pairs[key].props.asnd != None: + elem.setProp("asnd", self.pairs[key].props.asnd) + if self.pairs[key].props.bimg != None: + elem.setProp("bimg", self.pairs[key].props.bimg) + if self.pairs[key].props.bsnd != None: + elem.setProp("bsnd", self.pairs[key].props.bsnd) + elem.setProp("color", str(self.pairs[key].props.color)) if doc.validateDtd(self.ctxt, self.dtd): doc.saveFormatFile(filename, 1) @@ -121,3 +170,14 @@ class Model(object): + +if __name__ == '__main__': + model = Model(GAME_PATH, os.path.dirname(__file__)) + model.read('drumgit.mson') + print '%s' %model.pairs[0].props.color + print '%s' %model.pairs[1]._properties + print '%s' %model.pairs[2]._properties + + model.def_grid() + print model.grid + #model.save('/tmp/mod.txt') diff --git a/playtile.py b/playtile.py index fd56e4d..a720174 100644 --- a/playtile.py +++ b/playtile.py @@ -3,7 +3,6 @@ import hippo import math import os -from sugar.graphics import font from sugar.graphics import units class PlayTile(hippo.CanvasBox, hippo.CanvasItem): diff --git a/playview.py b/playview.py index af75a2a..df0b983 100644 --- a/playview.py +++ b/playview.py @@ -4,7 +4,6 @@ import cairo import gtk from sugar.graphics import color -from sugar.graphics import font from playtile import PlayTile |