diff options
author | Manuel Quiñones <manuq@laptop.org> | 2012-10-09 18:36:23 (GMT) |
---|---|---|
committer | Manuel Quiñones <manuq@laptop.org> | 2012-10-09 20:47:08 (GMT) |
commit | 6d72b348e091a8fb0775297da4cf0d86cc4c8ddd (patch) | |
tree | ed69eb5084e674a5608a542a3f1a5e40709e7a1e | |
parent | 536204c2a3f742a3d62c0c94e975c3a47ce6c12f (diff) |
Improve search in views normalizing the strings - SL #3588
Add a normalize.py file to the jarabe/util directory with a
normalize_string method inside. Before calling it, we have to decode
the strings returned by Gtk to Unicode in UTF8, because we use
Python2. When we switch to Python3 this decodification will not be
needed [1] [2] .
[1] http://python-gtk-3-tutorial.readthedocs.org/en/latest/unicode.html
[2] https://mail.gnome.org/archives/python-hackers-list/2012-June/msg00012.html
Signed-off-by: Manuel Quiñones <manuq@laptop.org>
Acked-by: Simon Schampijer <simon@laptop.org>
-rw-r--r-- | src/jarabe/desktop/Makefile.am | 3 | ||||
-rw-r--r-- | src/jarabe/desktop/activitieslist.py | 6 | ||||
-rw-r--r-- | src/jarabe/desktop/favoritesview.py | 6 | ||||
-rw-r--r-- | src/jarabe/desktop/groupbox.py | 3 | ||||
-rw-r--r-- | src/jarabe/desktop/homebox.py | 3 | ||||
-rw-r--r-- | src/jarabe/desktop/meshbox.py | 5 | ||||
-rw-r--r-- | src/jarabe/desktop/networkviews.py | 4 | ||||
-rw-r--r-- | src/jarabe/util/normalize.py | 30 | ||||
-rw-r--r-- | src/jarabe/view/buddyicon.py | 5 |
9 files changed, 54 insertions, 11 deletions
diff --git a/src/jarabe/desktop/Makefile.am b/src/jarabe/desktop/Makefile.am index e27bc9c..8150db8 100644 --- a/src/jarabe/desktop/Makefile.am +++ b/src/jarabe/desktop/Makefile.am @@ -16,4 +16,5 @@ sugar_PYTHON = \ snowflakelayout.py \ transitionbox.py \ viewcontainer.py \ - viewtoolbar.py + viewtoolbar.py \ + tools.py diff --git a/src/jarabe/desktop/activitieslist.py b/src/jarabe/desktop/activitieslist.py index 3b07e87..4d2eb1a 100644 --- a/src/jarabe/desktop/activitieslist.py +++ b/src/jarabe/desktop/activitieslist.py @@ -36,6 +36,7 @@ from sugar3.graphics.alert import Alert from jarabe.model import bundleregistry from jarabe.view.palettes import ActivityPalette from jarabe.journal import misc +from jarabe.util.normalize import normalize_string class ActivitiesTreeView(Gtk.TreeView): @@ -153,14 +154,15 @@ class ActivitiesTreeView(Gtk.TreeView): of matching activities. """ - self._query = query.lower() + self._query = normalize_string(query.decode('utf-8')) self.get_model().refilter() matches = self.get_model().iter_n_children(None) return matches def __model_visible_cb(self, model, tree_iter, data): title = model[tree_iter][ListModel.COLUMN_TITLE] - return title is not None and title.lower().find(self._query) > -1 + title = normalize_string(title.decode('utf-8')) + return title is not None and title.find(self._query) > -1 class ListModel(Gtk.TreeModelSort): diff --git a/src/jarabe/desktop/favoritesview.py b/src/jarabe/desktop/favoritesview.py index aae745a..7f5b160 100644 --- a/src/jarabe/desktop/favoritesview.py +++ b/src/jarabe/desktop/favoritesview.py @@ -50,6 +50,7 @@ from jarabe.desktop import schoolserver from jarabe.desktop.schoolserver import RegisterError from jarabe.desktop import favoriteslayout from jarabe.desktop.viewcontainer import ViewContainer +from jarabe.util.normalize import normalize_string _logger = logging.getLogger('FavoritesView') @@ -312,8 +313,9 @@ class FavoritesView(ViewContainer): query = query.strip() for icon in self.get_children(): if icon not in [self._owner_icon, self._activity_icon]: - activity_name = icon.get_activity_name().lower() - if activity_name.find(query) > -1: + activity_name = icon.get_activity_name().decode('utf-8') + normalized_name = normalize_string(activity_name) + if normalized_name.find(query) > -1: icon.alpha = 1.0 else: icon.alpha = 0.33 diff --git a/src/jarabe/desktop/groupbox.py b/src/jarabe/desktop/groupbox.py index f916f62..91c9cb5 100644 --- a/src/jarabe/desktop/groupbox.py +++ b/src/jarabe/desktop/groupbox.py @@ -24,6 +24,7 @@ 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.util.normalize import normalize_string class GroupBox(ViewContainer): @@ -69,7 +70,7 @@ class GroupBox(ViewContainer): icon.destroy() def _toolbar_query_changed_cb(self, toolbar, query): - self._query = query.lower() + self._query = normalize_string(query.decode('utf-8')) for icon in self.get_children(): if hasattr(icon, 'set_filter'): icon.set_filter(self._query) diff --git a/src/jarabe/desktop/homebox.py b/src/jarabe/desktop/homebox.py index ed5144b..b87c345 100644 --- a/src/jarabe/desktop/homebox.py +++ b/src/jarabe/desktop/homebox.py @@ -27,6 +27,7 @@ from sugar3.graphics.icon import Icon from jarabe.desktop import favoritesview from jarabe.desktop.activitieslist import ActivitiesList +from jarabe.util.normalize import normalize_string _FAVORITES_VIEW = 0 _LIST_VIEW = 1 @@ -100,7 +101,7 @@ class HomeBox(Gtk.VBox): panel.set_section_view_auto_close() def __toolbar_query_changed_cb(self, toolbar, query): - self._query = query.lower() + self._query = normalize_string(query.decode('utf-8')) self._list_view.set_filter(self._query) self._favorites_box.set_filter(self._query) diff --git a/src/jarabe/desktop/meshbox.py b/src/jarabe/desktop/meshbox.py index e1c8381..24d445c 100644 --- a/src/jarabe/desktop/meshbox.py +++ b/src/jarabe/desktop/meshbox.py @@ -32,15 +32,16 @@ from sugar3.graphics import style from sugar3.graphics import palette from sugar3.graphics.menuitem import MenuItem -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.desktop.snowflakelayout import SnowflakeLayout 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.util.normalize import normalize_string from jarabe.model import network from jarabe.model.network import AccessPoint from jarabe.model.olpcmesh import OlpcMeshManager @@ -588,7 +589,7 @@ class MeshBox(ViewContainer): net.props.paused = False def _toolbar_query_changed_cb(self, toolbar, query): - self._query = query.lower() + self._query = normalize_string(query.decode('utf-8')) for icon in self.get_children(): if hasattr(icon, 'set_filter'): icon.set_filter(self._query) diff --git a/src/jarabe/desktop/networkviews.py b/src/jarabe/desktop/networkviews.py index c949b7e..65d478e 100644 --- a/src/jarabe/desktop/networkviews.py +++ b/src/jarabe/desktop/networkviews.py @@ -35,6 +35,7 @@ from sugar3 import profile from jarabe.view.pulsingicon import EventPulsingIcon from jarabe.desktop import keydialog +from jarabe.util.normalize import normalize_string from jarabe.model import network from jarabe.model.network import Settings from jarabe.model.network import IP4Config @@ -369,7 +370,8 @@ class WirelessNetworkView(EventPulsingIcon): self.get_first_ap().model) def set_filter(self, query): - self._filtered = self._display_name.lower().find(query) == -1 + normalized_name = normalize_string(self._display_name.decode('utf-8')) + self._filtered = normalized_name.find(query) == -1 self._update_icon() self._update_color() diff --git a/src/jarabe/util/normalize.py b/src/jarabe/util/normalize.py new file mode 100644 index 0000000..f87d356 --- /dev/null +++ b/src/jarabe/util/normalize.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2012 One Laptop Per Child +# +# 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 + +from unicodedata import normalize + +def normalize_string(unicode_string): + u"""Return unicode_string normalized for searching. + + >>> normalize_string(u'Mónica Viñao') + 'monica vinao' + + >>> normalize_string(u'Ábaco') + 'abaco' + + """ + return normalize('NFKD', unicode_string).encode('ASCII', 'ignore').lower() diff --git a/src/jarabe/view/buddyicon.py b/src/jarabe/view/buddyicon.py index 59c3690..e28fc14 100644 --- a/src/jarabe/view/buddyicon.py +++ b/src/jarabe/view/buddyicon.py @@ -19,6 +19,7 @@ from sugar3.graphics.palette import Palette from sugar3.graphics.icon import EventIcon from jarabe.view.buddymenu import BuddyMenu +from jarabe.util.normalize import normalize_string _FILTERED_ALPHA = 0.33 @@ -68,6 +69,8 @@ class BuddyIcon(EventIcon): palette.props.icon.props.xo_color = self._buddy.get_color() def set_filter(self, query): - self._filtered = (self._buddy.get_nick().lower().find(query) == -1) \ + normalized_name = normalize_string( + self._buddy.get_nick().decode('utf-8')) + self._filtered = (normalized_name.find(query) == -1) \ and not self._buddy.is_owner() self._update_color() |