Ticket #3588: 0001-Improve-search-in-views-normalizing-the-strings-SL-3.patch

File 0001-Improve-search-in-views-normalizing-the-strings-SL-3.patch, 9.9 KB (added by manuq, 12 years ago)

Candidate patch

  • src/jarabe/desktop/Makefile.am

    From 401d7c2847d9dc1bd1e12d0b3a610fb37f241c6d Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= <manuq@laptop.org>
    Date: Tue, 9 Oct 2012 15:36:23 -0300
    Subject: [PATCH shell] Improve search in views normalizing the strings - SL
     #3588
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    Mail-Followup-To: <sugar-devel@lists.sugarlabs.org>
    
    The strings returned by Gtk have to be converted to Unicode because we
    use Python 2.  In Python 3 this 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>
    ---
     src/jarabe/desktop/Makefile.am       |  3 ++-
     src/jarabe/desktop/activitieslist.py |  6 ++++--
     src/jarabe/desktop/favoritesview.py  |  6 ++++--
     src/jarabe/desktop/groupbox.py       |  3 ++-
     src/jarabe/desktop/homebox.py        |  3 ++-
     src/jarabe/desktop/meshbox.py        |  5 +++--
     src/jarabe/desktop/networkviews.py   |  4 +++-
     src/jarabe/desktop/tools.py          | 30 ++++++++++++++++++++++++++++++
     src/jarabe/view/buddyicon.py         |  5 ++++-
     9 files changed, 54 insertions(+), 11 deletions(-)
     create mode 100644 src/jarabe/desktop/tools.py
    
    diff --git a/src/jarabe/desktop/Makefile.am b/src/jarabe/desktop/Makefile.am
    index e27bc9c..8150db8 100644
    a b sugar_PYTHON = \ 
    1616        snowflakelayout.py      \
    1717        transitionbox.py        \
    1818        viewcontainer.py        \
    19         viewtoolbar.py
     19        viewtoolbar.py          \
     20        tools.py
  • src/jarabe/desktop/activitieslist.py

    diff --git a/src/jarabe/desktop/activitieslist.py b/src/jarabe/desktop/activitieslist.py
    index 3b07e87..1eb7199 100644
    a b from sugar3.graphics.alert import Alert 
    3636from jarabe.model import bundleregistry
    3737from jarabe.view.palettes import ActivityPalette
    3838from jarabe.journal import misc
     39from jarabe.desktop.tools import normalize_string
    3940
    4041
    4142class ActivitiesTreeView(Gtk.TreeView):
    class ActivitiesTreeView(Gtk.TreeView): 
    153154        of matching activities.
    154155
    155156        """
    156         self._query = query.lower()
     157        self._query = normalize_string(query.decode('utf-8'))
    157158        self.get_model().refilter()
    158159        matches = self.get_model().iter_n_children(None)
    159160        return matches
    160161
    161162    def __model_visible_cb(self, model, tree_iter, data):
    162163        title = model[tree_iter][ListModel.COLUMN_TITLE]
    163         return title is not None and title.lower().find(self._query) > -1
     164        title = normalize_string(title.decode('utf-8'))
     165        return title is not None and title.find(self._query) > -1
    164166
    165167
    166168class ListModel(Gtk.TreeModelSort):
  • src/jarabe/desktop/favoritesview.py

    diff --git a/src/jarabe/desktop/favoritesview.py b/src/jarabe/desktop/favoritesview.py
    index aae745a..3848f5f 100644
    a b from jarabe.desktop import schoolserver 
    5050from jarabe.desktop.schoolserver import RegisterError
    5151from jarabe.desktop import favoriteslayout
    5252from jarabe.desktop.viewcontainer import ViewContainer
     53from jarabe.desktop.tools import normalize_string
    5354
    5455
    5556_logger = logging.getLogger('FavoritesView')
    class FavoritesView(ViewContainer): 
    312313        query = query.strip()
    313314        for icon in self.get_children():
    314315            if icon not in [self._owner_icon, self._activity_icon]:
    315                 activity_name = icon.get_activity_name().lower()
    316                 if activity_name.find(query) > -1:
     316                activity_name = icon.get_activity_name().decode('utf-8')
     317                normalized_name = normalize_string(activity_name)
     318                if normalized_name.find(query) > -1:
    317319                    icon.alpha = 1.0
    318320                else:
    319321                    icon.alpha = 0.33
  • src/jarabe/desktop/groupbox.py

    diff --git a/src/jarabe/desktop/groupbox.py b/src/jarabe/desktop/groupbox.py
    index f916f62..e1f3ae7 100644
    a b from jarabe.model import friends 
    2424from jarabe.desktop.friendview import FriendView
    2525from jarabe.desktop.viewcontainer import ViewContainer
    2626from jarabe.desktop.favoriteslayout import SpreadLayout
     27from jarabe.desktop.tools import normalize_string
    2728
    2829
    2930class GroupBox(ViewContainer):
    class GroupBox(ViewContainer): 
    6970        icon.destroy()
    7071
    7172    def _toolbar_query_changed_cb(self, toolbar, query):
    72         self._query = query.lower()
     73        self._query = normalize_string(query.decode('utf-8'))
    7374        for icon in self.get_children():
    7475            if hasattr(icon, 'set_filter'):
    7576                icon.set_filter(self._query)
  • src/jarabe/desktop/homebox.py

    diff --git a/src/jarabe/desktop/homebox.py b/src/jarabe/desktop/homebox.py
    index ed5144b..f39e3e0 100644
    a b from sugar3.graphics.icon import Icon 
    2727
    2828from jarabe.desktop import favoritesview
    2929from jarabe.desktop.activitieslist import ActivitiesList
     30from jarabe.desktop.tools import normalize_string
    3031
    3132_FAVORITES_VIEW = 0
    3233_LIST_VIEW = 1
    class HomeBox(Gtk.VBox): 
    100101            panel.set_section_view_auto_close()
    101102
    102103    def __toolbar_query_changed_cb(self, toolbar, query):
    103         self._query = query.lower()
     104        self._query = normalize_string(query.decode('utf-8'))
    104105        self._list_view.set_filter(self._query)
    105106        self._favorites_box.set_filter(self._query)
    106107
  • src/jarabe/desktop/meshbox.py

    diff --git a/src/jarabe/desktop/meshbox.py b/src/jarabe/desktop/meshbox.py
    index e1c8381..a1adb87 100644
    a b from sugar3.graphics import style 
    3232from sugar3.graphics import palette
    3333from sugar3.graphics.menuitem import MenuItem
    3434
    35 from jarabe.desktop.snowflakelayout import SnowflakeLayout
    3635from jarabe.model import neighborhood
    3736from jarabe.model.buddy import get_owner_instance
    3837from jarabe.view.buddyicon import BuddyIcon
     38from jarabe.desktop.snowflakelayout import SnowflakeLayout
    3939from jarabe.desktop.networkviews import WirelessNetworkView
    4040from jarabe.desktop.networkviews import OlpcMeshView
    4141from jarabe.desktop.networkviews import SugarAdhocView
    4242from jarabe.desktop.viewcontainer import ViewContainer
    4343from jarabe.desktop.favoriteslayout import SpreadLayout
     44from jarabe.desktop.tools import normalize_string
    4445from jarabe.model import network
    4546from jarabe.model.network import AccessPoint
    4647from jarabe.model.olpcmesh import OlpcMeshManager
    class MeshBox(ViewContainer): 
    588589                net.props.paused = False
    589590
    590591    def _toolbar_query_changed_cb(self, toolbar, query):
    591         self._query = query.lower()
     592        self._query = normalize_string(query.decode('utf-8'))
    592593        for icon in self.get_children():
    593594            if hasattr(icon, 'set_filter'):
    594595                icon.set_filter(self._query)
  • src/jarabe/desktop/networkviews.py

    diff --git a/src/jarabe/desktop/networkviews.py b/src/jarabe/desktop/networkviews.py
    index c949b7e..1adba94 100644
    a b from sugar3 import profile 
    3535
    3636from jarabe.view.pulsingicon import EventPulsingIcon
    3737from jarabe.desktop import keydialog
     38from jarabe.desktop.tools import normalize_string
    3839from jarabe.model import network
    3940from jarabe.model.network import Settings
    4041from jarabe.model.network import IP4Config
    class WirelessNetworkView(EventPulsingIcon): 
    369370                                            self.get_first_ap().model)
    370371
    371372    def set_filter(self, query):
    372         self._filtered = self._display_name.lower().find(query) == -1
     373        normalized_name = normalize_string(self._display_name.decode('utf-8'))
     374        self._filtered = normalized_name.find(query) == -1
    373375        self._update_icon()
    374376        self._update_color()
    375377
  • new file src/jarabe/desktop/tools.py

    diff --git a/src/jarabe/desktop/tools.py b/src/jarabe/desktop/tools.py
    new file mode 100644
    index 0000000..f87d356
    - +  
     1# -*- coding: utf-8 -*-
     2# Copyright (C) 2012 One Laptop Per Child
     3#
     4# This program is free software; you can redistribute it and/or modify
     5# it under the terms of the GNU General Public License as published by
     6# the Free Software Foundation; either version 2 of the License, or
     7# (at your option) any later version.
     8#
     9# This program is distributed in the hope that it will be useful,
     10# but WITHOUT ANY WARRANTY; without even the implied warranty of
     11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12# GNU General Public License for more details.
     13#
     14# You should have received a copy of the GNU General Public License
     15# along with this program; if not, write to the Free Software
     16# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     17
     18from unicodedata import normalize
     19
     20def normalize_string(unicode_string):
     21    u"""Return unicode_string normalized for searching.
     22
     23    >>> normalize_string(u'Mónica Viñao')
     24    'monica vinao'
     25
     26    >>> normalize_string(u'Ábaco')
     27    'abaco'
     28
     29    """
     30    return normalize('NFKD', unicode_string).encode('ASCII', 'ignore').lower()
  • src/jarabe/view/buddyicon.py

    diff --git a/src/jarabe/view/buddyicon.py b/src/jarabe/view/buddyicon.py
    index 59c3690..f80ac54 100644
    a b from sugar3.graphics.palette import Palette 
    1919from sugar3.graphics.icon import EventIcon
    2020
    2121from jarabe.view.buddymenu import BuddyMenu
     22from jarabe.desktop.tools import normalize_string
    2223
    2324
    2425_FILTERED_ALPHA = 0.33
    class BuddyIcon(EventIcon): 
    6869                palette.props.icon.props.xo_color = self._buddy.get_color()
    6970
    7071    def set_filter(self, query):
    71         self._filtered = (self._buddy.get_nick().lower().find(query) == -1) \
     72        normalized_name = normalize_string(
     73            self._buddy.get_nick().decode('utf-8'))
     74        self._filtered = (normalized_name.find(query) == -1) \
    7275                and not self._buddy.is_owner()
    7376        self._update_color()