Hi,

this is very similar to the mesh view search.

Thanks,

Tomeu
From fdad7268e4c39e277d75fa82c1eda1972467f9b8 Mon Sep 17 00:00:00 2001
From: Tomeu Vizoso <[EMAIL PROTECTED]>
Date: Thu, 15 May 2008 18:21:58 +0200
Subject: [PATCH] Implement search in the activity list.

---
 src/view/home/HomeBox.py        |   43 +++++++++++++++++++++++++++++++++++---
 src/view/home/activitieslist.py |   19 +++++++++++++++-
 2 files changed, 56 insertions(+), 6 deletions(-)

diff --git a/src/view/home/HomeBox.py b/src/view/home/HomeBox.py
index 181849f..c9effa6 100644
--- a/src/view/home/HomeBox.py
+++ b/src/view/home/HomeBox.py
@@ -15,9 +15,10 @@
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 from gettext import gettext as _
+import logging
 
-import gtk
 import gobject
+import gtk
 import hippo
 
 from sugar.graphics import style
@@ -30,6 +31,8 @@ from view.home.activitieslist import ActivitiesList
 _RING_VIEW = 0
 _LIST_VIEW = 1
 
+_AUTOSEARCH_TIMEOUT = 1000
+
 class HomeBox(hippo.CanvasBox, hippo.CanvasItem):
     __gtype_name__ = 'SugarHomeBox'
 
@@ -41,12 +44,18 @@ class HomeBox(hippo.CanvasBox, hippo.CanvasItem):
         self._enable_xo_palette = False
 
         self._toolbar = HomeToolbar()
-        #self._toolbar.connect('query-changed', self.__toolbar_query_changed_cb)
+        self._toolbar.connect('query-changed', self.__toolbar_query_changed_cb)
         self._toolbar.connect('view-changed', self.__toolbar_view_changed_cb)
         self.append(hippo.CanvasWidget(widget=self._toolbar))
 
         self._set_view(_RING_VIEW)
 
+    def __toolbar_query_changed_cb(self, toolbar, query):
+        if self._list_view is None:
+            return
+        query = query.lower()
+        self._list_view.set_filter(query)
+
     def __toolbar_view_changed_cb(self, toolbar, view):
         self._set_view(view)
 
@@ -120,6 +129,9 @@ class HomeToolbar(gtk.Toolbar):
     def __init__(self):
         gtk.Toolbar.__init__(self)
 
+        self._query = None
+        self._autosearch_timer = None
+
         self._add_separator()
 
         tool_item = gtk.ToolItem()
@@ -131,8 +143,8 @@ class HomeToolbar(gtk.Toolbar):
                                               'system-search')
         self._search_entry.add_clear_button()
         self._search_entry.set_width_chars(25)
-        #self._search_entry.connect('activate', self._entry_activated_cb)
-        #self._search_entry.connect('changed', self._entry_changed_cb)
+        self._search_entry.connect('activate', self.__entry_activated_cb)
+        self._search_entry.connect('changed', self.__entry_changed_cb)
         tool_item.add(self._search_entry)
         self._search_entry.show()
 
@@ -172,3 +184,26 @@ class HomeToolbar(gtk.Toolbar):
         self.insert(separator, -1)
         separator.show()
 
+    def __entry_activated_cb(self, entry):
+        if self._autosearch_timer:
+            gobject.source_remove(self._autosearch_timer)
+        new_query = entry.props.text
+        if self._query != new_query:
+            self._query = new_query
+            self.emit('query-changed', self._query)
+
+    def __entry_changed_cb(self, entry):
+        if not entry.props.text:
+            entry.activate()
+            return
+
+        if self._autosearch_timer:
+            gobject.source_remove(self._autosearch_timer)
+        self._autosearch_timer = gobject.timeout_add(_AUTOSEARCH_TIMEOUT,
+                                                     self.__autosearch_timer_cb)
+
+    def __autosearch_timer_cb(self):
+        self._autosearch_timer = None
+        self._search_entry.activate()
+        return False
+
diff --git a/src/view/home/activitieslist.py b/src/view/home/activitieslist.py
index f638738..c04b967 100644
--- a/src/view/home/activitieslist.py
+++ b/src/view/home/activitieslist.py
@@ -31,7 +31,8 @@ class ActivitiesList(hippo.CanvasScrollbars):
     def __init__(self):
         hippo.CanvasScrollbars.__init__(self)
         self.set_policy(hippo.ORIENTATION_HORIZONTAL, hippo.SCROLLBAR_NEVER)
-        
+
+        self._query = ''
         self._box = hippo.CanvasBox( \
                 background_color=style.COLOR_WHITE.get_int())
         self.set_root(self._box)
@@ -57,7 +58,14 @@ class ActivitiesList(hippo.CanvasScrollbars):
                 return
 
     def _add_activity(self, activity_info):
-        self._box.append(ActivityEntry(activity_info))
+        entry = ActivityEntry(activity_info)
+        self._box.append(entry)
+        entry.set_visible(entry.matches(self._query))
+
+    def set_filter(self, query):
+        self._query = query
+        for entry in self._box.get_children():
+            entry.set_visible(entry.matches(query))
 
 class ActivityEntry(hippo.CanvasBox, hippo.CanvasItem):
     __gtype_name__ = 'SugarActivityEntry'
@@ -81,6 +89,7 @@ class ActivityEntry(hippo.CanvasBox, hippo.CanvasItem):
         self._bundle_id = activity_info.bundle_id
         self._version = activity_info.version
         self._favorite = activity_info.favorite
+        self._title = activity_info.name
 
         self._favorite_icon = FavoriteIcon(self._favorite)
         self._favorite_icon.connect('notify::favorite',
@@ -128,6 +137,7 @@ class ActivityEntry(hippo.CanvasBox, hippo.CanvasItem):
     def __activity_changed_cb(self, activity_registry, activity_info):
         if self._bundle_id == activity_info.bundle_id and \
                 self._version == activity_info.version:
+            self._title = activity_info.name
             self._favorite = activity_info.favorite
             self._favorite_icon.props.favorite = self._favorite
 
@@ -147,6 +157,11 @@ class ActivityEntry(hippo.CanvasBox, hippo.CanvasItem):
     def get_version(self):
         return self._version
 
+    def matches(self, query):
+        if not query:
+            return True
+        return self._title.lower().find(query) > -1
+
 class FavoriteIcon(CanvasIcon):
     __gproperties__ = {
         'favorite' : (bool, None, None, False,
-- 
1.5.2.5

_______________________________________________
Sugar mailing list
[email protected]
http://lists.laptop.org/listinfo/sugar

Reply via email to