Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/svgcard.py
diff options
context:
space:
mode:
Diffstat (limited to 'svgcard.py')
-rw-r--r--svgcard.py103
1 files changed, 75 insertions, 28 deletions
diff --git a/svgcard.py b/svgcard.py
index 365aa8e..727cb05 100644
--- a/svgcard.py
+++ b/svgcard.py
@@ -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