diff options
author | Aleksey 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) |
commit | a739d83dca1e3cb004cb4a94259e21c7de210b5f (patch) | |
tree | 767cb2fea2f9288a6af6a01c57fa0ff3d7399323 | |
parent | 834c6e2588eb7ae7e184785858c2279d9654aa5b (diff) |
Store speak props in Memorize objects
-rw-r--r-- | cardlist.py | 64 | ||||
-rw-r--r-- | cardtable.py | 7 | ||||
-rw-r--r-- | createcardpanel.py | 52 | ||||
-rw-r--r-- | memorize.dtd | 2 | ||||
-rw-r--r-- | model.py | 27 | ||||
-rw-r--r-- | svgcard.py | 48 |
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 > @@ -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: @@ -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 |