Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Schampijer <simon@schampijer.de>2007-07-10 20:39:04 (GMT)
committer Simon Schampijer <simon@schampijer.de>2007-07-10 20:39:04 (GMT)
commitfdc224fb0597bf34b4e0bf4ec169c0b87b5312cc (patch)
tree649a4c4f0602aa49683522634c8f931f87da576d
parente921da0ec82d15e601e693ed431ee3e08e6c7921 (diff)
- Adopt to API changes in sugar
- use csound instance instead of server
-rw-r--r--controller.py43
-rw-r--r--csound/csoundserver.py113
-rw-r--r--games/drumgit/drumgit.mson12
-rw-r--r--gridtest.py71
-rw-r--r--gridtest_cs.py93
-rw-r--r--gridtest_gst.py105
-rw-r--r--memosono.dtd9
-rwxr-xr-xmemosonoactivity.py23
-rw-r--r--model.py96
-rw-r--r--playtile.py1
-rw-r--r--playview.py1
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. ")
+
+
diff --git a/model.py b/model.py
index 5ba6909..bb7870a 100644
--- a/model.py
+++ b/model.py
@@ -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