From e3af6ee47390ac2bde75a6c31f85c091fdc3bce2 Mon Sep 17 00:00:00 2001 From: Muriel de Souza Godoi Date: Thu, 20 Sep 2007 18:40:22 +0000 Subject: add create game icons, create game gui New svgcard system using a cache to minimize memory usage. --- (limited to 'svgcard.py') diff --git a/svgcard.py b/svgcard.py index d122d3e..cd88743 100755 --- a/svgcard.py +++ b/svgcard.py @@ -35,74 +35,69 @@ class SvgCard(gtk.DrawingArea): # Default properties default_props = {} - default_props['back_border'] = {'fill_color':'#b2b3b7', 'stroke_color':'#b2b3b7', 'opacity':'1'} - default_props['back_h_border'] = {'fill_color':'#b2b3b7', 'stroke_color':'#ffffff', 'opacity':'1'} + 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['front_border'] = {'fill_color':'#4c4d4f', 'stroke_color':'#ffffff', 'opacity':'0'} - default_props['front_h_border'] = {'fill_color':'#555555', 'stroke_color':'#888888', 'opacity':'0.5'} + 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'} - def __init__(self, id, pprops, pcache, jpeg, size, align, bg_color='#000000'): + cache = {} + + def __init__(self, id, pprops, jpeg, size, align, bg_color='#000000'): gtk.DrawingArea.__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.connect('expose-event', self._expose_cb) + self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self.bg_color)) self.flipped = False self.flipped_once = False self.id = id self.jpeg = jpeg + self.show_jpeg = False + self.show_text = False self.size = size self.align = align - self.set_flags(gtk.CAN_FOCUS) # Views properties - views = ['back_border', 'back_h_border', 'back_text', 'front_border', 'front_h_border', 'front_text'] + views = ['back', 'back_h', 'back_text', 'front', 'front_h', 'front_text'] self.pprops = pprops self.props = {} for view in views: self.props[view] = {} self.props[view].update(self.default_props[view]) self.props[view].update(pprops.get(view, {})) - - # Cache - self.cache = {} - self.cache.update(pcache) - - build_all = (len(self.cache) == 0) - - self.build_all = build_all - - if build_all or pprops.has_key('back_border'): - self.cache['back_border']= self._read_icon_data(self.props['back_border']) - if build_all or pprops.has_key('back_h_border'): - self.cache['back_h_border']= self._read_icon_data(self.props['back_h_border']) - - self.back_layout = self.get_text_layout(self.props['back_text'].get('card_text', ''), self.size-12) - self.back_layout_position = (self.size -(self.back_layout.get_size()[1]/1000))/2 - - if build_all or self.pprops.has_key('back_border') or self.pprops.has_key('back_text'): - self.cache['back'] = self.build_face('back') - if build_all or self.pprops.has_key('back_h_border') or self.pprops.has_key('back_text'): - self.cache['back_h'] = self.build_face('back_h') - - self.current_pixbuf = self.cache['back'] - self.current_layout = self.back_layout - self.current_layout_position = self.back_layout_position - self.current_text_color = self.props['back_text'].get('text_color', '#c7c8cc') + + if len(self.props['back_text'].get('card_text','')) > 0: + self.back_layout = self.get_text_layout(self.props['back_text']['card_text'], self.size-12) + self.back_layout_position = (self.size -(self.back_layout.get_size()[1]/1000))/2 + self.current_layout = self.back_layout + self.current_layout_position = self.back_layout_position + self.current_text_color = self.props['back_text']['text_color'] + 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() def _expose_cb(self, widget, event): - self.window.draw_pixbuf(None, self.current_pixbuf, 0, 0, 0, 0) gc = self.window.new_gc() - widget.window.draw_layout(gc, x=6, y=self.current_layout_position, layout=self.current_layout, foreground=gtk.gdk.color_parse(self.current_text_color)) + pixbuf = self._read_icon_data(self.current_face) + self.window.draw_pixbuf(None, pixbuf, 0, 0, 0, 0) + if self.show_jpeg: + self.window.draw_pixbuf(None, self.jpeg, 0, 0, 11, 11) + if self.show_text: + widget.window.draw_layout(gc, x=6, y=self.current_layout_position, layout=self.current_layout, foreground=gtk.gdk.color_parse(self.current_text_color)) return False - def _read_icon_data(self, dict): + def _read_icon_data(self, view): + dict = self.props[view] + set = str(self.size)+dict.get('fill_color')+dict.get('stroke_color') + if self.cache.has_key(set): + return self.cache[set] + icon_file = open(self.border_svg, 'r') data = icon_file.read() icon_file.close() @@ -120,83 +115,73 @@ class SvgCard(gtk.DrawingArea): 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) - return rsvg.Handle(data=data).get_pixbuf() - - def build_face(self, face): - if face.endswith('_h'): - text = face[:-2] - else: - text = face - pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, self.size, self.size) - pixbuf.fill(0x00000000) - self.cache[face + '_border'].composite(pixbuf, 0, 0, self.size, self.size, 0, 0, 1, 1, gtk.gdk.INTERP_NEAREST, 255) - if face.startswith('front') and self.jpeg <> None: - self.cache['jpeg'].composite(pixbuf, 11, 11, self.size-22, self.size-22, 11, 11, 1, 1, gtk.gdk.INTERP_NEAREST, 255) + pixbuf = rsvg.Handle(data=data).get_pixbuf() + self.cache[set] = pixbuf return pixbuf def set_border(self, stroke_color, fill_color): - self.props['front_border'].update({'fill_color':fill_color, 'stroke_color':stroke_color}) - self.cache['front_border'] = self._read_icon_data(self.props['front_border']) - self.cache['front'] = self.build_face('front') - self.current_pixbuf = self.cache['front'] - self.queue_draw() + self.props['front'].update({'fill_color':fill_color, 'stroke_color':stroke_color}) + self.queue_draw() + while gtk.events_pending(): + gtk.main_iteration() def set_highlight(self, status, mouse = False): if self.flipped: if mouse: return if status: - self.current_pixbuf = self.cache['front_h'] + self.current_face = 'front_h' else: - self.current_pixbuf = self.cache['front'] + self.current_face = 'front' else: if status: - self.current_pixbuf = self.cache['back_h'] + self.current_face = 'back_h' else: - self.current_pixbuf = self.cache['back'] + self.current_face = 'back' self.queue_draw() def flip(self): if not self.flipped: if not self.flipped_once: - if self.build_all or self.pprops.has_key('front_border'): - self.cache['front_border']= self._read_icon_data(self.props['front_border']) - if self.build_all or self.pprops.has_key('front_h_border'): - self.cache['front_h_border']= self._read_icon_data(self.props['front_h_border']) - self.front_layout = self.get_text_layout(self.props['front_text'].get('card_text', ''), self.size-11) - if self.align == '2': # top - self.front_layout_position = 6 - elif self.align == '3': # bottom - self.front_layout_position = self.size -(self.front_layout.get_size()[1]/1000) - else: # center and none - self.front_layout_position = (self.size -(self.front_layout.get_size()[1]/1000))/2 if self.jpeg <> None: pixbuf_t = gtk.gdk.pixbuf_new_from_file(self.jpeg) - self.cache['jpeg']= pixbuf_t.scale_simple(self.size-22, self.size-22, gtk.gdk.INTERP_BILINEAR) - del pixbuf_t - - if self.cache.has_key('front_border') or self.cache.has_key('front_text'): - self.cache['front'] = self.build_face('front') - if self.cache.has_key('front_h_border') or self.cache.has_key('front_text'): - self.cache['front_h'] = self.build_face('front_h') + self.jpeg = pixbuf_t.scale_simple(self.size-22, self.size-22, gtk.gdk.INTERP_BILINEAR) + del pixbuf_t + if len(self.props.get('front_text',[]).get('card_text','')) > 0: + self.front_layout = self.get_text_layout(self.props['front_text']['card_text'], self.size-12) + self.front_layout_position = (self.size -(self.front_layout.get_size()[1]/1000))/2 self.flipped_once = True - self.current_layout = self.front_layout - self.current_layout_position = self.front_layout_position - self.current_text_color = self.props['front_text'].get('text_color', '#c7c8cc') - self.current_pixbuf = self.build_face('front') + if self.jpeg <> None: + self.show_jpeg = True + if len(self.props['front_text'].get('card_text','')) > 0: + self.current_layout = self.front_layout + self.current_layout_position = self.front_layout_position + self.current_text_color = self.props['front_text']['text_color'] + self.show_text = True + else: + self.show_text = False + + self.current_face = 'front' + self.flipped = True self.queue_draw() + while gtk.events_pending(): gtk.main_iteration() gc.collect() def flop(self): - self.current_pixbuf = self.build_face('back') - self.current_layout = self.back_layout - self.current_layout_position = self.back_layout_position - self.current_text_color = self.props['back_text'].get('text_color', '#c7c8cc') + self.current_face = 'back' + if len(self.props['back_text'].get('card_text','')) > 0: + self.current_layout = self.back_layout + self.current_layout_position = self.back_layout_position + self.current_text_color = self.props['back_text']['text_color'] + self.show_text = True + else: + self.show_text = False self.flipped = False + self.show_jpeg = False self.queue_draw() def is_flipped(self): @@ -205,13 +190,10 @@ class SvgCard(gtk.DrawingArea): def get_id(self): return self.id - def get_cache(self): - return self.cache - def reset(self): if self.flipped: fill_color = self.default_props.get('front_border').get('fill_color') - stroke_color = self.default_props.get('front_border').get('stroke_color') + stroke_color = self.default_propsfront_text.get('front_border').get('stroke_color') self.set_border(fill_color, stroke_color) self.flop() @@ -254,7 +236,9 @@ class SvgCard(gtk.DrawingArea): self.current_layout = self.front_layout self.current_layout_position = self.front_layout_position - self.queue_draw() - + self.current_text_color = self.props['front_text']['text_color'] + if len(newtext) > 0: + self.show_text = True + self.queue_draw() def get_text(self): return self.props['front_text']['card_text'] \ No newline at end of file -- cgit v0.9.1