[Sugar-devel] [PATCH sugar] Group View: add search toolbar
Simon Schampijer
simon at schampijer.de
Mon Aug 27 04:11:27 EDT 2012
From: Simon Schampijer <simon at laptop.org>
This adds a search toolbar to the Group View. The toolbar in the
Neighborhood View has been outsourced to be usable in both Views.
Signed-off-by: Simon Schampijer <simon at laptop.org>
---
src/jarabe/desktop/Makefile.am | 3 +-
src/jarabe/desktop/groupbox.py | 41 +++++++++++++----
src/jarabe/desktop/meshbox.py | 77 +------------------------------
src/jarabe/desktop/viewtoolbar.py | 97 +++++++++++++++++++++++++++++++++++++++
4 files changed, 132 insertions(+), 86 deletions(-)
create mode 100644 src/jarabe/desktop/viewtoolbar.py
diff --git a/src/jarabe/desktop/Makefile.am b/src/jarabe/desktop/Makefile.am
index b36404e..e27bc9c 100644
--- a/src/jarabe/desktop/Makefile.am
+++ b/src/jarabe/desktop/Makefile.am
@@ -15,4 +15,5 @@ sugar_PYTHON = \
schoolserver.py \
snowflakelayout.py \
transitionbox.py \
- viewcontainer.py
+ viewcontainer.py \
+ viewtoolbar.py
diff --git a/src/jarabe/desktop/groupbox.py b/src/jarabe/desktop/groupbox.py
index 8beec90..94a5c10 100644
--- a/src/jarabe/desktop/groupbox.py
+++ b/src/jarabe/desktop/groupbox.py
@@ -16,27 +16,23 @@
import logging
-import gconf
+import gtk
from sugar.graphics import style
-from sugar.graphics.xocolor import XoColor
from jarabe.view.buddyicon import BuddyIcon
-from jarabe.view.buddymenu import BuddyMenu
-from jarabe.view.eventicon import EventIcon
from jarabe.model.buddy import get_owner_instance
from jarabe.model import friends
from jarabe.desktop.friendview import FriendView
from jarabe.desktop.viewcontainer import ViewContainer
from jarabe.desktop.favoriteslayout import SpreadLayout
+from jarabe.desktop.viewtoolbar import ViewToolbar
-class GroupBox(ViewContainer):
- __gtype_name__ = 'SugarGroupBox'
+class GroupContainer(ViewContainer):
+ __gtype_name__ = 'SugarGroupContainer'
def __init__(self):
- logging.debug('STARTUP: Loading the group view')
-
layout = SpreadLayout()
# Round off icon size to an even number to ensure that the icon
@@ -44,6 +40,25 @@ class GroupBox(ViewContainer):
style.LARGE_ICON_SIZE & ~1)
ViewContainer.__init__(self, layout, owner_icon)
+
+class GroupBox(gtk.VBox):
+ __gtype_name__ = 'SugarGroupBox'
+
+ def __init__(self):
+ logging.debug('STARTUP: Loading the group view')
+
+ gtk.VBox.__init__(self)
+
+ self._query = ''
+ self._toolbar = ViewToolbar()
+ self._toolbar.connect('query-changed', self._toolbar_query_changed_cb)
+ self.pack_start(self._toolbar, expand=False)
+ self._toolbar.show()
+
+ self._group_container = GroupContainer()
+ self.add(self._group_container)
+ self._group_container.show()
+
self._friends = {}
friends_model = friends.get_model()
@@ -56,7 +71,7 @@ class GroupBox(ViewContainer):
def add_friend(self, buddy_info):
icon = FriendView(buddy_info)
- self.add(icon)
+ self._group_container.add(icon)
self._friends[buddy_info.get_key()] = icon
icon.show()
@@ -65,6 +80,12 @@ class GroupBox(ViewContainer):
def _friend_removed_cb(self, data_model, key):
icon = self._friends[key]
- self.remove(icon)
+ self._group_container.remove(icon)
del self._friends[key]
icon.destroy()
+
+ def _toolbar_query_changed_cb(self, toolbar, query):
+ self._query = query.lower()
+ for icon in self._group_container.get_children():
+ if hasattr(icon, 'set_filter'):
+ icon.set_filter(self._query)
diff --git a/src/jarabe/desktop/meshbox.py b/src/jarabe/desktop/meshbox.py
index 412a093..8002a33 100644
--- a/src/jarabe/desktop/meshbox.py
+++ b/src/jarabe/desktop/meshbox.py
@@ -29,21 +29,19 @@ import gconf
from sugar.graphics.icon import Icon
from sugar.graphics import style
from sugar.graphics import palette
-from sugar.graphics import iconentry
from sugar.graphics.menuitem import MenuItem
-from sugar.graphics.xocolor import XoColor
from jarabe.desktop.snowflakelayout import SnowflakeLayout
from jarabe.model import neighborhood
from jarabe.model.buddy import get_owner_instance
from jarabe.view.buddyicon import BuddyIcon
-from jarabe.view.buddymenu import BuddyMenu
from jarabe.view.eventicon import EventIcon
from jarabe.desktop.networkviews import WirelessNetworkView
from jarabe.desktop.networkviews import OlpcMeshView
from jarabe.desktop.networkviews import SugarAdhocView
from jarabe.desktop.viewcontainer import ViewContainer
from jarabe.desktop.favoriteslayout import SpreadLayout
+from jarabe.desktop.viewtoolbar import ViewToolbar
from jarabe.model import network
from jarabe.model.network import AccessPoint
from jarabe.model.olpcmesh import OlpcMeshManager
@@ -54,9 +52,6 @@ from jarabe.journal import misc
_AP_ICON_NAME = 'network-wireless'
_OLPC_MESH_ICON_NAME = 'network-mesh'
-_AUTOSEARCH_TIMEOUT = 1000
-_FILTERED_ALPHA = 0.33
-
class _ActivityIcon(EventIcon):
def __init__(self, model, file_name, xo_color,
@@ -161,74 +156,6 @@ class ActivityView(SnowflakeLayout):
icon.set_filter(query)
-class MeshToolbar(gtk.Toolbar):
- __gtype_name__ = 'MeshToolbar'
-
- __gsignals__ = {
- 'query-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
- ([str])),
- }
-
- def __init__(self):
- gtk.Toolbar.__init__(self)
-
- self._query = None
- self._autosearch_timer = None
-
- self._add_separator()
-
- tool_item = gtk.ToolItem()
- self.insert(tool_item, -1)
- tool_item.show()
-
- self.search_entry = iconentry.IconEntry()
- self.search_entry.set_icon_from_name(iconentry.ICON_ENTRY_PRIMARY,
- '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)
- tool_item.add(self.search_entry)
- self.search_entry.show()
-
- self._add_separator(expand=True)
-
- def _add_separator(self, expand=False):
- separator = gtk.SeparatorToolItem()
- separator.props.draw = False
- if expand:
- separator.set_expand(True)
- else:
- separator.set_size_request(style.GRID_CELL_SIZE,
- style.GRID_CELL_SIZE)
- 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):
- logging.debug('_autosearch_timer_cb')
- self._autosearch_timer = None
- self.search_entry.activate()
- return False
-
-
class DeviceObserver(gobject.GObject):
__gsignals__ = {
'access-point-added': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
@@ -440,7 +367,7 @@ class MeshBox(gtk.VBox):
self._suspended = True
self._query = ''
- self._toolbar = MeshToolbar()
+ self._toolbar = ViewToolbar()
self._toolbar.connect('query-changed', self._toolbar_query_changed_cb)
self.pack_start(self._toolbar, expand=False)
self._toolbar.show()
diff --git a/src/jarabe/desktop/viewtoolbar.py b/src/jarabe/desktop/viewtoolbar.py
new file mode 100644
index 0000000..9db301a
--- /dev/null
+++ b/src/jarabe/desktop/viewtoolbar.py
@@ -0,0 +1,97 @@
+# Copyright (C) 2006-2007 Red Hat, Inc.
+# Copyright (C) 2009 Tomeu Vizoso, Simon Schampijer
+# Copyright (C) 2009-2012 One Laptop per Child
+# Copyright (C) 2010 Collabora Ltd. <http://www.collabora.co.uk/>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import logging
+
+import gtk
+import gobject
+
+from sugar.graphics import style
+from sugar.graphics import iconentry
+
+_AUTOSEARCH_TIMEOUT = 1000
+_FILTERED_ALPHA = 0.33
+
+
+class ViewToolbar(gtk.Toolbar):
+ __gtype_name__ = 'SugarViewToolbar'
+
+ __gsignals__ = {
+ 'query-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
+ ([str])),
+ }
+
+ def __init__(self):
+ gtk.Toolbar.__init__(self)
+
+ self._query = None
+ self._autosearch_timer = None
+
+ self._add_separator()
+
+ tool_item = gtk.ToolItem()
+ self.insert(tool_item, -1)
+ tool_item.show()
+
+ self.search_entry = iconentry.IconEntry()
+ self.search_entry.set_icon_from_name(iconentry.ICON_ENTRY_PRIMARY,
+ '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)
+ tool_item.add(self.search_entry)
+ self.search_entry.show()
+
+ self._add_separator(expand=True)
+
+ def _add_separator(self, expand=False):
+ separator = gtk.SeparatorToolItem()
+ separator.props.draw = False
+ if expand:
+ separator.set_expand(True)
+ else:
+ separator.set_size_request(style.GRID_CELL_SIZE,
+ style.GRID_CELL_SIZE)
+ 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):
+ logging.debug('_autosearch_timer_cb')
+ self._autosearch_timer = None
+ self.search_entry.activate()
+ return False
--
1.7.11.4
More information about the Sugar-devel
mailing list