6 from pygobject import *
8 class ContactView(hildon.PannableArea):
9 """Widget which shows a list of contacts in a pannable area.
11 Copyright (c) Andrew Flegg <andrew@bleb.org> 2009.
12 Released under the Artistic Licence."""
15 # -----------------------------------------------------------------------
16 def __init__(self, contacts):
17 """Constructor. Passed a list of Contacts."""
19 hildon.PannableArea.__init__(self)
20 self.contacts = contacts
22 columns = [gtk.gdk.Pixbuf, # 0. Photo
25 # gobject.TYPE_PYOBJECT # y. Actual contact
28 # -- Work out which services need to be shown...
32 for contact in self.contacts:
33 services |= contact.get_mappings()
35 for service in sorted(services):
36 columns.append(gtk.gdk.Pixbuf)
38 icons[service] = gtk.gdk.pixbuf_new_from_file('/opt/hermes/share/account-%s.png' % (service))
39 except glib.GError, e:
42 columns.append(gobject.TYPE_PYOBJECT)
43 self.treestore = gtk.ListStore(*tuple(columns))
44 self._contact_index = len(columns) -1
46 # -- Build the tree model...
48 for contact in self.contacts:
49 if not contact.get_name():
52 pi = contact.get_photo()
54 if pi and pi.contents.data.uri.startswith("image/"):
55 data = string_at(pi.contents.data.inlined.data, pi.contents.data.inlined.length)
56 pixbuf_loader = gtk.gdk.PixbufLoader()
57 pixbuf_loader.write(data)
59 pixbuf = pixbuf_loader.get_pixbuf()
60 elif pi and pi.contents.data.uri.startswith("file://"):
61 filename = pi.contents.data.uri[7:]
62 pixbuf = gtk.gdk.pixbuf_new_from_file(filename)
65 size = min(pixbuf.get_width(), pixbuf.get_height())
66 pixbuf = pixbuf.subpixbuf(0, 0, size, size).scale_simple(48, 48, gtk.gdk.INTERP_BILINEAR)
68 row = [pixbuf, contact.get_name(), ]
69 for service in services:
70 row.append(service in contact.get_mappings() and icons[service] or None)
73 self.treestore.append(row)
75 self.treeview = gtk.TreeView(self.treestore)
76 self.treeview.append_column(gtk.TreeViewColumn('Picture', gtk.CellRendererPixbuf(), pixbuf = 0))
78 tvcolumn = gtk.TreeViewColumn('Name', gtk.CellRendererText(), text = 1)
79 tvcolumn.set_expand(True)
80 self.treeview.append_column(tvcolumn)
83 for service in services:
84 self.treeview.append_column(gtk.TreeViewColumn('Service', gtk.CellRendererPixbuf(), pixbuf = i))
87 self.treeview.connect('row-activated', self._activated)
88 self.add(self.treeview)
89 self.set_size_request_policy(hildon.SIZE_REQUEST_CHILDREN)
92 # -----------------------------------------------------------------------
93 def _activated(self, treeview, path, column):
94 """Used to emit the `contact-activated' signal once a row has been
97 iter = treeview.get_model().get_iter(path)
98 contact = treeview.get_model().get_value(iter, self._contact_index)
99 self.emit('contact-activated', contact)
102 _contact_activated = gobject.signal_new('contact-activated', ContactView, gobject.SIGNAL_ACTION, gobject.TYPE_NONE, [gobject.TYPE_PYOBJECT])