Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@member.fsf.org>2009-07-13 16:56:32 (GMT)
committer Aleksey Lim <alsroot@member.fsf.org>2009-07-13 16:56:32 (GMT)
commita739d83dca1e3cb004cb4a94259e21c7de210b5f (patch)
tree767cb2fea2f9288a6af6a01c57fa0ff3d7399323
parent834c6e2588eb7ae7e184785858c2279d9654aa5b (diff)
Store speak props in Memorize objects
-rw-r--r--cardlist.py64
-rw-r--r--cardtable.py7
-rw-r--r--createcardpanel.py52
-rw-r--r--memorize.dtd2
-rw-r--r--model.py27
-rw-r--r--svgcard.py48
6 files changed, 140 insertions, 60 deletions
diff --git a/cardlist.py b/cardlist.py
index c054165..406b02b 100644
--- a/cardlist.py
+++ b/cardlist.py
@@ -40,7 +40,7 @@ _logger = logging.getLogger('memorize-activity')
class CardList(gtk.EventBox):
__gsignals__ = {
- 'pair-selected': (SIGNAL_RUN_FIRST, None, 7 * [TYPE_PYOBJECT]),
+ 'pair-selected': (SIGNAL_RUN_FIRST, None, 9 * [TYPE_PYOBJECT]),
'update-create-toolbar': (SIGNAL_RUN_FIRST, None, 3 * [TYPE_PYOBJECT]),
'update-create-buttons': (SIGNAL_RUN_FIRST, None, 2 * [TYPE_PYOBJECT]),
}
@@ -94,7 +94,10 @@ class CardList(gtk.EventBox):
else:
bsnd = None
- self.add_pair(None, game_pairs[key].props.achar, game_pairs[key].props.bchar, aimg, bimg, asnd, bsnd, False)
+ self.add_pair(None, game_pairs[key].props.achar,
+ game_pairs[key].props.bchar, aimg, bimg, asnd, bsnd,
+ game_pairs[key].props.aspeak, game_pairs[key].props.bspeak,
+ False)
def save_game(self, widget, game_name, equal_pairs, grouped):
@@ -118,16 +121,24 @@ class CardList(gtk.EventBox):
achar = self.pairs[pair].get_text(1)
if achar != '':
pair_card.set_property('achar', achar)
-
+
# bchar
bchar = self.pairs[pair].get_text(2)
if bchar != '':
pair_card.set_property('bchar', bchar)
+ # aspeak
+ aspeak = self.pairs[pair].get_speak(1)
+ pair_card.set_property('aspeak', aspeak)
+
+ # bspeak
+ bspeak = self.pairs[pair].get_speak(2)
+ pair_card.set_property('bspeak', bspeak)
+
# aimg
aimg = self.pairs[pair].get_pixbuf(1)
if aimg != None:
-
+
if equal_pairs:
aimgfile = 'img'+str(pair)+'.jpg'
else:
@@ -189,8 +200,9 @@ class CardList(gtk.EventBox):
os.rmdir(join(root, name))
os.rmdir(path)
- def add_pair(self, widget, achar, bchar, aimg, bimg, asnd, bsnd, show = True):
- pair = Pair(achar, bchar, aimg, bimg, asnd, bsnd)
+ def add_pair(self, widget, achar, bchar, aimg, bimg, asnd, bsnd,
+ aspeak, bspeak, show = True):
+ pair = Pair(achar, bchar, aimg, bimg, asnd, bsnd, aspeak, bspeak)
self.vbox.pack_end(pair, False, True)
self.pairs.append(pair)
pair.connect('pair-selected', self.set_selected)
@@ -204,7 +216,8 @@ class CardList(gtk.EventBox):
self.pairs.remove(widget)
del widget
self.emit('update-create-buttons', True, True)
- self.emit('pair-selected', False, None, None, None, None, None, None)
+ self.emit('pair-selected', False, None, None, None, None, None, None,
+ False, False)
def set_selected(self, widget, event):
if self.current_pair <> None:
@@ -215,12 +228,15 @@ class CardList(gtk.EventBox):
self.emit('pair-selected', True,
self.current_pair.get_text(1), self.current_pair.get_text(2),
self.current_pair.get_pixbuf(1), self.current_pair.get_pixbuf(2),
- self.current_pair.get_sound(1), self.current_pair.get_sound(2))
-
- def update_selected(self, widget, newtext1, newtext2, aimg, bimg, asnd, bsnd):
+ self.current_pair.get_sound(1), self.current_pair.get_sound(2),
+ self.current_pair.get_speak(1), self.current_pair.get_speak(2))
+
+ def update_selected(self, widget, newtext1, newtext2, aimg, bimg,
+ asnd, bsnd, aspeak, bspeak):
self.current_pair.change_text(newtext1, newtext2)
self.current_pair.change_pixbuf(aimg, bimg)
self.current_pair.change_sound(asnd, bsnd)
+ self.current_pair.change_speak(aspeak, bspeak)
self.emit('update-create-buttons', True, True)
@@ -231,14 +247,10 @@ class Pair(gtk.EventBox):
'pair-closed': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]),
}
- def __init__(self, text1, text2 = None, aimg = None, bimg = None, asnd = None, bsnd = None):
+ def __init__(self, text1, text2 = None, aimg = None, bimg = None,
+ asnd = None, bsnd = None, aspeak=False, bspeak=False):
gtk.EventBox.__init__(self)
self.bg_color = '#000000'
- if text2 == None:
- self.text2 = text1
- else:
- self.text2 = text2
- self.text1 = text1
self.asnd = asnd
self.bsnd = bsnd
@@ -251,6 +263,7 @@ class Pair(gtk.EventBox):
self.bcard1 = svgcard.SvgCard(-1,
{ 'front_text' : { 'card_text' : text1,
+ 'speak' : aspeak,
'text_color' : '#ffffff' },
'front' : { 'fill_color' : '#4c4d4f',
'stroke_color' : '#ffffff',
@@ -264,6 +277,7 @@ class Pair(gtk.EventBox):
self.bcard2 = svgcard.SvgCard(-1,
{ 'front_text' : { 'card_text' : text2,
+ 'speak' : bspeak,
'text_color' : '#ffffff' },
'front' : { 'fill_color' : '#4c4d4f',
'stroke_color' : '#ffffff',
@@ -321,19 +335,29 @@ class Pair(gtk.EventBox):
def change_sound(self, asnd, bsnd):
self.asnd = asnd
self.bsnd = bsnd
-
+
def get_text(self, card):
if card == 1:
return self.bcard1.get_text()
else:
- return self.bcard2.get_text()
-
+ return self.bcard2.get_text()
+
+ def change_speak(self, aspeak, bspeak):
+ self.bcard1.change_speak(aspeak)
+ self.bcard2.change_speak(bspeak)
+
+ def get_speak(self, card):
+ if card == 1:
+ return self.bcard1.get_speak()
+ else:
+ return self.bcard2.get_speak()
+
def get_pixbuf(self, card):
if card == 1:
return self.bcard1.get_pixbuf()
else:
return self.bcard2.get_pixbuf()
-
+
def get_sound(self, card):
if card == 1:
return self.asnd
diff --git a/cardtable.py b/cardtable.py
index e66437e..a96f7f0 100644
--- a/cardtable.py
+++ b/cardtable.py
@@ -116,13 +116,14 @@ class CardTable(gtk.EventBox):
else:
jpg = None
props = {}
- props['front_text']= {'card_text':card.get('char', '')}
-
+ props['front_text']= {'card_text':card.get('char', ''),
+ 'speak': card.get('speak', False)}
+
if card['ab']== 'a':
props['back_text']= {'card_text':text1}
elif card['ab']== 'b':
props['back_text']= {'card_text':text2}
-
+
align = self.data.get('align', '1')
card = svgcard.SvgCard(id, props, jpg, self.card_size, align)
card.connect('enter-notify-event', self.mouse_event, [x, y])
diff --git a/createcardpanel.py b/createcardpanel.py
index 7a83633..38515fa 100644
--- a/createcardpanel.py
+++ b/createcardpanel.py
@@ -46,8 +46,8 @@ _logger = logging.getLogger('memorize-activity')
class CreateCardPanel(gtk.EventBox):
__gsignals__ = {
- 'add-pair': (SIGNAL_RUN_FIRST, None, 6 * [TYPE_PYOBJECT]),
- 'update-pair': (SIGNAL_RUN_FIRST, None, 6 * [TYPE_PYOBJECT]),
+ 'add-pair': (SIGNAL_RUN_FIRST, None, 8 * [TYPE_PYOBJECT]),
+ 'update-pair': (SIGNAL_RUN_FIRST, None, 8 * [TYPE_PYOBJECT]),
}
def __init__(self):
@@ -124,13 +124,17 @@ class CreateCardPanel(gtk.EventBox):
self.cardeditor1.get_text(),
self.cardeditor1.get_pixbuf(),
self.cardeditor1.get_pixbuf(),
- self.cardeditor1.get_snd(), self.cardeditor1.get_snd())
+ self.cardeditor1.get_snd(), self.cardeditor1.get_snd(),
+ self.cardeditor1.get_speak(), self.cardeditor1.get_speak()
+ )
else:
self.emit('add-pair', self.cardeditor1.get_text(),
self.cardeditor2.get_text(),
self.cardeditor1.get_pixbuf(),
self.cardeditor2.get_pixbuf(),
- self.cardeditor1.get_snd(), self.cardeditor2.get_snd())
+ self.cardeditor1.get_snd(), self.cardeditor2.get_snd(),
+ self.cardeditor1.get_speak(), self.cardeditor2.get_speak()
+ )
self.clean(None)
@@ -141,17 +145,21 @@ class CreateCardPanel(gtk.EventBox):
self.cardeditor1.get_text(),
self.cardeditor1.get_pixbuf(),
self.cardeditor1.get_pixbuf(),
- self.cardeditor1.get_snd(), self.cardeditor1.get_snd())
+ self.cardeditor1.get_snd(), self.cardeditor1.get_snd(),
+ self.cardeditor1.get_speak(), self.cardeditor1.get_speak()
+ )
else:
self.emit('update-pair', self.cardeditor1.get_text(),
self.cardeditor2.get_text(),
self.cardeditor1.get_pixbuf(),
self.cardeditor2.get_pixbuf(),
- self.cardeditor1.get_snd(), self.cardeditor2.get_snd())
+ self.cardeditor1.get_snd(), self.cardeditor2.get_snd(),
+ self.cardeditor1.get_speak(), self.cardeditor2.get_speak()
+ )
self.clean(None)
def pair_selected(self, widget, selected, newtext1, newtext2, aimg, bimg,
- asnd, bsnd):
+ asnd, bsnd, aspeak, bspeak):
if selected:
self.cardeditor1.set_text(newtext1)
self.cardeditor2.set_text(newtext2)
@@ -159,6 +167,8 @@ class CreateCardPanel(gtk.EventBox):
self.cardeditor2.set_pixbuf(bimg)
self.cardeditor1.set_snd(asnd)
self.cardeditor2.set_snd(bsnd)
+ self.cardeditor1.set_speak(aspeak)
+ self.cardeditor2.set_speak(bspeak)
self._addbutton.set_sensitive(True)
self._updatebutton.set_sensitive(selected)
self._updatebutton_sensitive = selected
@@ -276,14 +286,14 @@ class CardEditor(gtk.EventBox):
tooltip=_('Insert sound'))
toolbar.pack_start(browsesound, False)
- usespeak = ToggleToolButton(
+ self.usespeak = ToggleToolButton(
named_icon='computer-xo',
palette=SpeakPalette())
- toolbar.pack_start(usespeak, False)
+ toolbar.pack_start(self.usespeak, False)
- browsepicture.connect('clicked', self._load_image, usespeak)
- browsesound.connect('clicked', self._load_audio, usespeak)
- usespeak.connect('toggled', self._usespeak_cb)
+ browsepicture.connect('clicked', self._load_image)
+ browsesound.connect('clicked', self._load_audio)
+ self.usespeak.connect('toggled', self._usespeak_cb)
toolbar_box = CanvasRoundBox(
radius=8,
@@ -313,15 +323,21 @@ class CardEditor(gtk.EventBox):
newtext = ''
self.textentry.set_text(newtext)
+ def get_speak(self):
+ return self.usespeak.props.active
+
+ def set_speak(self, enabled):
+ self.usespeak.props.active = enabled
+
def get_pixbuf(self):
return self.card.get_pixbuf()
def set_pixbuf(self, pixbuf):
self.card.set_pixbuf(pixbuf)
- def _load_image(self, widget, usespeak):
+ def _load_image(self, widget):
def load(index):
- usespeak.props.active = False
+ self.usespeak.props.active = False
pixbuf_t = gtk.gdk.pixbuf_new_from_file_at_size(
index, theme.PAIR_SIZE - theme.PAD*2,
@@ -341,9 +357,9 @@ class CardEditor(gtk.EventBox):
chooser.pick(what=chooser.IMAGE,
cb=lambda jobject: load(jobject.file_path))
- def _load_audio(self, widget, usespeak):
+ def _load_audio(self, widget):
def load(index):
- usespeak.props.active = False
+ self.usespeak.props.active = False
dst = join(self.temp_folder, basename(index))
shutil.copy(index, dst)
@@ -359,8 +375,11 @@ class CardEditor(gtk.EventBox):
cb=lambda jobject: load(jobject.file_path))
def _usespeak_cb(self, widget):
+ self.card.change_speak(widget.props.active)
+
if not widget.props.active:
return
+
self.snd = None
self.card.set_pixbuf(None)
self.emit('has-sound', False)
@@ -379,6 +398,7 @@ class CardEditor(gtk.EventBox):
self.emit('has-text', False)
self.emit('has-picture', False)
self.emit('has-sound', False)
+ self.usespeak.props.active = False
class SpeakPalette(Palette):
def __init__(self):
diff --git a/memorize.dtd b/memorize.dtd
index 870e18d..3c1fc15 100644
--- a/memorize.dtd
+++ b/memorize.dtd
@@ -22,4 +22,6 @@
bsnd CDATA #IMPLIED
bchar CDATA #IMPLIED
color CDATA #IMPLIED
+ aspeak CDATA #IMPLIED
+ bspeak CDATA #IMPLIED
>
diff --git a/model.py b/model.py
index 8fef631..8f7defd 100644
--- a/model.py
+++ b/model.py
@@ -36,13 +36,19 @@ class Pair(gobject.GObject):
'bimg' : (str, None, None, None, gobject.PARAM_READWRITE),
'bsnd' : (str, None, None, None, gobject.PARAM_READWRITE),
'bchar': (str, None, None, None, gobject.PARAM_READWRITE),
- 'color': (gobject.TYPE_INT, 'Base', 'Base', 0, 10, 0, gobject.PARAM_READWRITE)
+ 'aspeak': (int, 'Base', 'Base', 0, 1, 0, \
+ gobject.PARAM_READWRITE),
+ 'bspeak': (int, 'Base', 'Base', 0, 1, 0, \
+ 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, 'achar':None, 'bimg':None,
- 'bsnd':None, 'bchar':None, 'color':100}
+ self._properties = {'aimg':None, 'asnd':None, 'achar':None, 'bimg':None,
+ 'bsnd':None, 'bchar':None, 'color':100,
+ 'aspeak':False, 'bspeak':False}
def do_get_property(self, pspec):
"""Retrieve a particular property from our property dictionary
@@ -61,6 +67,10 @@ class Pair(gobject.GObject):
return self._properties["bchar"]
elif pspec.name == "color":
return self._properties["color"]
+ elif pspec.name == "aspeak":
+ return self._properties["aspeak"]
+ elif pspec.name == "bspeak":
+ return self._properties["bspeak"]
def set_property(self, name, value):
if name == 'aimg':
@@ -77,6 +87,10 @@ class Pair(gobject.GObject):
self._properties["bchar"] = value
elif name == "color":
self._properties["color"] = value
+ elif name == "aspeak":
+ self._properties["aspeak"] = int(value)
+ elif name == "bspeak":
+ self._properties["bspeak"] = int(value)
class Model(object):
@@ -245,6 +259,8 @@ class Model(object):
elem.setProp("bsnd", self.pairs[key].props.bsnd)
if self.pairs[key].props.bchar != None:
elem.setProp("bchar", self.pairs[key].props.bchar)
+ elem.setProp("aspeak", str(self.pairs[key].props.aspeak))
+ elem.setProp("bspeak", str(self.pairs[key].props.bspeak))
# elem.setProp("color", str(self.pairs[key].props.color))
if doc.validateDtd(self.ctxt, self.dtd):
@@ -286,6 +302,9 @@ class Model(object):
elem['snd'] = self.pairs[key].props.asnd
if self.pairs[key].props.achar != None:
elem['char'] = self.pairs[key].props.achar
+
+ if self.pairs[key].props.aspeak != None:
+ elem['speak'] = int(self.pairs[key].props.aspeak)
temp1.append(elem)
elem = {}
@@ -298,6 +317,8 @@ class Model(object):
elem['snd'] = self.pairs[key].props.bsnd
if self.pairs[key].props.bchar != None:
elem['char'] = self.pairs[key].props.bchar
+ if self.pairs[key].props.bspeak != None:
+ elem['speak'] = int(self.pairs[key].props.bspeak)
temp2.append(elem)
i+=1
else:
diff --git a/svgcard.py b/svgcard.py
index 365aa8e..f7107bb 100644
--- a/svgcard.py
+++ b/svgcard.py
@@ -31,7 +31,7 @@ import theme
_logger = logging.getLogger('memorize-activity')
-class SvgCard(gtk.DrawingArea):
+class SvgCard(gtk.EventBox):
border_svg = join(dirname(__file__), 'images', 'card.svg')
@@ -39,18 +39,18 @@ class SvgCard(gtk.DrawingArea):
default_props = {}
default_props['back'] = {'fill_color':'#b2b3b7', 'stroke_color':'#b2b3b7', 'opacity':'1'}
default_props['back_h'] = {'fill_color':'#b2b3b7', 'stroke_color':'#ffffff', 'opacity':'1'}
- default_props['back_text'] = {'text_color':'#c7c8cc'}
+ default_props['back_text'] = {'text_color':'#c7c8cc', 'speak':False}
default_props['front'] = {'fill_color':'#4c4d4f', 'stroke_color':'#ffffff', 'opacity':'1'}
default_props['front_h'] = {'fill_color':'#555555', 'stroke_color':'#888888', 'opacity':'1'}
- default_props['front_text'] = {'text_color':'#ffffff'}
+ default_props['front_text'] = {'text_color':'#ffffff', 'speak':False}
cache = {}
def __init__(self, id, pprops, jpeg, size, align, bg_color='#000000'):
- gtk.DrawingArea.__init__(self)
+ gtk.EventBox.__init__(self)
+
self.set_size_request(size, size)
self.bg_color = bg_color
- self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self.bg_color))
self.flipped = False
self.flipped_once = False
self.id = id
@@ -74,19 +74,24 @@ class SvgCard(gtk.DrawingArea):
self.show_text = True
self.current_face = 'back'
- # Set events and listeners
- self.connect('expose-event', self._expose_cb)
- self.set_events(gtk.gdk.ALL_EVENTS_MASK)
+ self.draw = gtk.DrawingArea()
+ self.draw.show()
+ self.draw.modify_bg(gtk.STATE_NORMAL,
+ gtk.gdk.color_parse(self.bg_color))
+ self.draw.set_events(gtk.gdk.ALL_EVENTS_MASK)
+ self.draw.connect('expose-event', self._expose_cb)
+ self.add(self.draw)
+
gc.collect()
self.show()
def _expose_cb(self, widget, event):
- gc = self.window.new_gc()
+ gc = widget.window.new_gc()
pixbuf = self._read_icon_data(self.current_face)
- self.window.draw_pixbuf(None, pixbuf, 0, 0, 0, 0)
+ widget.window.draw_pixbuf(None, pixbuf, 0, 0, 0, 0)
if self.show_jpeg:
- self.window.draw_pixbuf(None, self.jpeg, 0, 0,
+ widget.window.draw_pixbuf(None, self.jpeg, 0, 0,
theme.SVG_PAD, theme.SVG_PAD)
if self.show_text:
@@ -140,7 +145,7 @@ class SvgCard(gtk.DrawingArea):
def set_border(self, stroke_color, fill_color):
self.props['front'].update({'fill_color':fill_color, 'stroke_color':stroke_color})
- self.queue_draw()
+ self.draw.queue_draw()
while gtk.events_pending():
gtk.main_iteration()
@@ -156,7 +161,7 @@ class SvgCard(gtk.DrawingArea):
del pixbuf
self.show_jpeg = True
- self.queue_draw()
+ self.draw.queue_draw()
while gtk.events_pending():
gtk.main_iteration()
@@ -176,7 +181,7 @@ class SvgCard(gtk.DrawingArea):
self.current_face = 'back_h'
else:
self.current_face = 'back'
- self.queue_draw()
+ self.draw.queue_draw()
def flip(self):
if self.flipped:
@@ -203,7 +208,7 @@ class SvgCard(gtk.DrawingArea):
self.current_face = 'front'
self.flipped = True
- self.queue_draw()
+ self.draw.queue_draw()
while gtk.events_pending():
gtk.main_iteration()
@@ -217,7 +222,7 @@ class SvgCard(gtk.DrawingArea):
self.show_text = False
self.flipped = False
self.show_jpeg = False
- self.queue_draw()
+ self.draw.queue_draw()
def is_flipped(self):
return self.flipped
@@ -262,17 +267,24 @@ class SvgCard(gtk.DrawingArea):
def set_background(self, color):
self.bg_color = color
- self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self.bg_color))
+ self.draw.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self.bg_color))
def change_text(self, newtext):
self.text_layouts[self.flipped] = None
self.props['front_text']['card_text'] = newtext
if len(newtext) > 0:
self.show_text = True
- self.queue_draw()
+ self.draw.queue_draw()
+
def get_text(self):
return self.props['front_text'].get('card_text', '')
+ def change_speak(self, enable):
+ self.props['front_text']['speak'] = enable
+
+ def get_speak(self):
+ return self.props['front_text']['speak']
+
def PIXELS_PANGO(x):
return x * 1000