Provide search-as-you-type in the mapping dialogues.
[hermes] / package / src / org / maemo / hermes / gui / contactview.py
index 0728d50..87db9ac 100644 (file)
@@ -4,8 +4,9 @@ import gobject
 import evolution
 from ctypes import *
 from pygobject import *
+from org.maemo.hermes.gui.searchablelist import SearchableList
 
-class ContactView(hildon.PannableArea):
+class ContactView(SearchableList):
     """Widget which shows a list of contacts in a pannable area.
          
        Copyright (c) Andrew Flegg <andrew@bleb.org> 2009.
@@ -16,7 +17,7 @@ class ContactView(hildon.PannableArea):
     def __init__(self, contacts):
         """Constructor. Passed a list of Contacts."""
         
-        hildon.PannableArea.__init__(self)
+        SearchableList.__init__(self, 1)
         self.contacts = contacts
         
         columns = [gtk.gdk.Pixbuf,         # 0. Photo
@@ -27,17 +28,17 @@ class ContactView(hildon.PannableArea):
 
         # -- Work out which services need to be shown...
         #
-        icons    = {}
-        services = set([])
+        self._icons    = {}
+        self._services = set([])
         for contact in self.contacts:
-            services |= contact.get_mappings()
+            self._services |= contact.get_mappings()
 
-        for service in sorted(services):
+        for service in sorted(self._services):
             columns.append(gtk.gdk.Pixbuf)
             try:
-                icons[service] = gtk.gdk.pixbuf_new_from_file('/opt/hermes/share/account-%s.png' % (service))
+                self._icons[service] = gtk.gdk.pixbuf_new_from_file('/opt/hermes/share/account-%s.png' % (service))
             except glib.GError, e:
-                icons[service] = None
+                self._icons[service] = None
                 
         columns.append(gobject.TYPE_PYOBJECT)
         self.treestore = gtk.ListStore(*tuple(columns))
@@ -66,8 +67,8 @@ class ContactView(hildon.PannableArea):
                 pixbuf = pixbuf.subpixbuf(0, 0, size, size).scale_simple(48, 48, gtk.gdk.INTERP_BILINEAR)
                 
             row = [pixbuf, contact.get_name(), ]
-            for service in services:
-                row.append(service in contact.get_mappings() and icons[service] or None)
+            for service in self._services:
+                row.append(service in contact.get_mappings() and self._icons[service] or None)
                 
             row.append(contact)
             self.treestore.append(row)
@@ -80,26 +81,36 @@ class ContactView(hildon.PannableArea):
         self.treeview.append_column(tvcolumn)
 
         i = 2
-        for service in services:
+        for service in self._services:
             self.treeview.append_column(gtk.TreeViewColumn('Service', gtk.CellRendererPixbuf(), pixbuf = i))
-            i = i + 1
+            i += 1
         
         self.treeview.connect('row-activated', self._activated)
         self.add(self.treeview)
-        self.set_size_request_policy(hildon.SIZE_REQUEST_CHILDREN)
 
+
+    # -----------------------------------------------------------------------
+    def add_mapping(self, service_id):
+        """Used to emit the `contact-activated' signal once a row has been
+           selected."""
+
+        if self._selected_iter:
+            i = 2
+            for service in self._services:
+                if service == service_id:
+                    self.treeview.get_model().set_value(self._selected_iter, i, self._icons[service])
+                i += 1
       
+
     # -----------------------------------------------------------------------
     def _activated(self, treeview, path, column):
         """Used to emit the `contact-activated' signal once a row has been
            selected."""
         
-        iter    = treeview.get_model().get_iter(path)
-        contact = treeview.get_model().get_value(iter, self._contact_index)
+        self._selected_iter = treeview.get_model().get_iter(path)
+        contact = treeview.get_model().get_value(self._selected_iter, self._contact_index)
         self.emit('contact-activated', contact)
 
 
 _contact_activated = gobject.signal_new('contact-activated', ContactView, gobject.SIGNAL_ACTION, gobject.TYPE_NONE, [gobject.TYPE_PYOBJECT])
 
-
-