Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar/canvas/IconItem.py
blob: f94be4c3cf1ec5addbc12adeaaf13c3073fe9a2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import re

import gobject
import gtk
import goocanvas

from sugar.util import GObjectSingletonMeta
from sugar.canvas.IconColor import IconColor

class IconCache(gobject.GObject):
	__metaclass__ = GObjectSingletonMeta

	def __init__(self):
		gobject.GObject.__init__(self)
		self._icons = {}

	def _create_icon(self, name, color, size):
		theme = gtk.icon_theme_get_default()
		info = theme.lookup_icon(name, size, 0)
		icon_file = open(info.get_filename(), 'r')
		data = icon_file.read()
		icon_file.close()

		if color != None:
			fill = color.get_fill_color()
			stroke = color.get_stroke_color()

			style = '.fill {fill:%s;stroke:%s;}' % (fill, fill)
			data = re.sub('\.fill \{.*\}', style, data)

			style = '.shape {stroke:%s;fill:%s;}' % (stroke, stroke)
			data = re.sub('\.shape \{.*\}', style, data)

			style = '.shape-and-fill {fill:%s; stroke:%s;}' % (fill, stroke)
			data = re.sub('\.shape-and-fill \{.*\}', style, data)

		loader = gtk.gdk.pixbuf_loader_new_with_mime_type('image/svg-xml')
		loader.set_size(size, size)
		loader.write(data)
		loader.close()
		
		return loader.get_pixbuf()

	def get_icon(self, name, color, size):
		key = (name, color, size)
		if self._icons.has_key(key):
			return self._icons[key]
		else:
			icon = self._create_icon(name, color, size)
			self._icons[key] = icon
			return icon

class IconItem(goocanvas.Image):
	__gproperties__ = {
		'icon-name': (str, None, None, None,
					  gobject.PARAM_CONSTRUCT_ONLY |
					  gobject.PARAM_READWRITE),
		'color'    : (object, None, None,
					  gobject.PARAM_CONSTRUCT_ONLY |
					  gobject.PARAM_READWRITE),
		'size'     : (int, None, None,
					  0, 1024, 24,
					  gobject.PARAM_CONSTRUCT_ONLY |
					  gobject.PARAM_READWRITE)
	}

	def do_set_property(self, pspec, value):
		if pspec.name == 'icon-name':
			self._icon_name = value
		elif pspec.name == 'color':
			self._color = value
		elif pspec.name == 'size':
			self._size = value

	def __init__(self, **kwargs):
		goocanvas.Image.__init__(self, **kwargs)

		if self._color:
			cache = IconCache()
			pixbuf = cache.get_icon(self._icon_name, self._color, self._size)
			self.props.pixbuf = pixbuf
		else:
			theme = gtk.icon_theme_get_default()
			pixbuf = theme.load_icon(self._icon_name, self._size, 0)
			self.props.pixbuf = pixbuf