diff options
Diffstat (limited to 'svgcard.py')
-rw-r--r-- | svgcard.py | 103 |
1 files changed, 75 insertions, 28 deletions
@@ -28,10 +28,12 @@ import logging from sugar.util import LRU import theme +import face +import speak.voice _logger = logging.getLogger('memorize-activity') -class SvgCard(gtk.DrawingArea): +class SvgCard(gtk.EventBox): border_svg = join(dirname(__file__), 'images', 'card.svg') @@ -47,10 +49,9 @@ class SvgCard(gtk.DrawingArea): cache = {} def __init__(self, id, pprops, jpeg, size, align, bg_color='#000000'): - gtk.DrawingArea.__init__(self) - self.set_size_request(size, size) + gtk.EventBox.__init__(self) + 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 @@ -61,6 +62,9 @@ class SvgCard(gtk.DrawingArea): self.align = align self.text_layouts = [None, None] + self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(bg_color)) + self.set_size_request(size, size) + # Views properties views = ['back', 'back_h', 'back_text', 'front', 'front_h', 'front_text'] self.pprops = pprops @@ -74,19 +78,29 @@ 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) - gc.collect() - self.show() + self.draw = gtk.DrawingArea() + self.draw.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(bg_color)) + self.draw.set_events(gtk.gdk.ALL_EVENTS_MASK) + self.draw.connect('expose-event', self._expose_cb) + self.draw.connect('realize', self._realize_cb) + self.draw.show_all() + + self.workspace = gtk.VBox() + self.workspace.add(self.draw) + self.add(self.workspace) + self.show_all() + + #gc.collect() + + def _realize_cb(self, widget): + self.gc = widget.window.new_gc() def _expose_cb(self, widget, event): - gc = self.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: @@ -105,7 +119,7 @@ class SvgCard(gtk.DrawingArea): elif self.align == '3': # bottom y = self.size - height - widget.window.draw_layout(gc, layout=layout, + widget.window.draw_layout(self.gc, layout=layout, x=(self.size - width)/2, y=y, foreground=gtk.gdk.color_parse(props['text_color'])) @@ -127,23 +141,23 @@ class SvgCard(gtk.DrawingArea): entity = '<!ENTITY stroke_color "%s">' % dict.get('stroke_color', '') data = re.sub('<!ENTITY stroke_color .*>', entity, data) - + entity = '<!ENTITY opacity "%s">' % dict.get('opacity', '') data = re.sub('<!ENTITY opacity .*>', entity, data) - + data = re.sub('size_card1', str(self.size), data) data = re.sub('size_card2', str(self.size-6), data) data = re.sub('size_card3', str(self.size-17), data) pixbuf = rsvg.Handle(data=data).get_pixbuf() self.cache[set] = pixbuf return pixbuf - + def set_border(self, stroke_color, fill_color): self.props['front'].update({'fill_color':fill_color, 'stroke_color':stroke_color}) self.queue_draw() while gtk.events_pending(): - gtk.main_iteration() - + gtk.main_iteration() + def set_pixbuf(self, pixbuf): if pixbuf == None: self.jpeg = None @@ -151,7 +165,7 @@ class SvgCard(gtk.DrawingArea): else: if self.jpeg != None: del self.jpeg - + self.jpeg = pixbuf del pixbuf self.show_jpeg = True @@ -200,14 +214,27 @@ class SvgCard(gtk.DrawingArea): else: self.show_text = False - self.current_face = 'front' + if self.id != -1 and self.get_speak(): + speaking_face = face.acquire() + if speaking_face: + self._switch_to_face(speaking_face) + speaking_face.face.status.voice = \ + speak.voice.by_name(self.get_speak()) + speaking_face.face.say(self.get_text()) + self.current_face = 'front' self.flipped = True self.queue_draw() while gtk.events_pending(): gtk.main_iteration() - gc.collect() + + #gc.collect() + + def cement(self): + if not self.get_speak(): + return + self._switch_to_face(self.draw) def flop(self): self.current_face = 'back' @@ -217,14 +244,24 @@ class SvgCard(gtk.DrawingArea): self.show_text = False self.flipped = False self.show_jpeg = False + + if self.id != -1 and self.get_speak(): + self._switch_to_face(self.draw) + self.queue_draw() - + + def _switch_to_face(self, widget): + for i in self.workspace.get_children(): + self.workspace.remove(i) + self.workspace.add(widget) + widget.set_size_request(self.size, self.size) + def is_flipped(self): return self.flipped - + def get_id(self): return self.id - + def reset(self): if self.flipped: fill_color = self.default_props.get('front_border').get('fill_color') @@ -241,14 +278,17 @@ class SvgCard(gtk.DrawingArea): for size in range(80, 66, -8) + range(66, 44, -6) + \ range(44, 24, -4) + range(24, 15, -2) + range(15, 7, -1): + + card_size = self.size - theme.SVG_PAD*2 layout = self.create_pango_layout(text) - layout.set_width(PIXELS_PANGO(self.size - theme.SVG_PAD)) - layout.set_wrap(pango.WRAP_WORD_CHAR) + layout.set_width(PIXELS_PANGO(card_size)) + layout.set_wrap(pango.WRAP_WORD) desc = pango.FontDescription('Deja Vu Sans bold ' + str(size)) layout.set_font_description(desc) if layout.get_line_count() <= max_lines_count and \ - layout.get_pixel_size()[1] <= self.size: + layout.get_pixel_size()[0] <= card_size and \ + layout.get_pixel_size()[1] <= card_size: break if layout.get_line_count() > 1: @@ -262,7 +302,7 @@ 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 @@ -270,9 +310,16 @@ class SvgCard(gtk.DrawingArea): if len(newtext) > 0: self.show_text = True self.queue_draw() + def get_text(self): return self.props['front_text'].get('card_text', '') + def change_speak(self, value): + self.props['front_text']['speak'] = value + + def get_speak(self): + return self.props['front_text'].get('speak') + def PIXELS_PANGO(x): return x * 1000 |