[Sugar-devel] [PATCH shell] Views: defocus the search entry by default

Gary Martin garycmartin at googlemail.com
Wed Sep 26 06:03:13 EDT 2012


Hi Simon,

On 26 Sep 2012, at 08:40, Simon Schampijer <simon at schampijer.de> wrote:

> From: Simon Schampijer <simon at laptop.org>
> 
> This patch does implement the following behavior:
> 
> - the search entry in all the views (Home (Favorites and Activity list),
>  Group and Neighborhood) is unfocused by default
> 
> - the search entry can be focused by clicking in the entry or by
>  starting to type
> 
> - the search entry contains a hint when unfocused and no search has been
>  entered, the hint is dependent on the View you are in and matches the
>  labels in the View Palettes (Frame), the existing translations have
>  been reused
> 
> - the learner can defocus the entry by clicking outside somewhere in
>  the view (toolbar or canvas), if no search has been entered the hint
>  will be displayed again if there is a search entered it will remain
>  in effect and the entry will only be unfocused, the latter will help
>  to hide the OSK and see the matches for a particular search
> 
> - clicking on the clear icon in the entry ('x') the entry will be
>  unfocused again

Tested there here on an XO (with OSK and without) and it's working very nicely. Thanks for the patch! :)

For the others reviewing this, there are a couple more behaviours on the radar as part of this search focus treatment, but their omission here should not block getting this patch landed as it's already a really good improvement (and especially for OSK user interaction):

 - the enter/return key (to defocus and leave query intact)
 - the escape key (clear query and defocus)

Regards,
--Gary

> Signed-off-by: Simon Schampijer <simon at laptop.org>
> ---
> src/jarabe/desktop/activitieslist.py |  4 ++++
> src/jarabe/desktop/favoritesview.py  |  4 ++++
> src/jarabe/desktop/groupbox.py       |  6 +++++-
> src/jarabe/desktop/homebox.py        | 15 +++++++++++++++
> src/jarabe/desktop/homewindow.py     | 23 +++++++++++++++++++----
> src/jarabe/desktop/meshbox.py        |  5 +++++
> src/jarabe/desktop/viewcontainer.py  |  1 +
> src/jarabe/desktop/viewtoolbar.py    |  6 +++++-
> 8 files changed, 58 insertions(+), 6 deletions(-)
> 
> diff --git a/src/jarabe/desktop/activitieslist.py b/src/jarabe/desktop/activitieslist.py
> index b830526..1b5ddd7 100644
> --- a/src/jarabe/desktop/activitieslist.py
> +++ b/src/jarabe/desktop/activitieslist.py
> @@ -375,6 +375,10 @@ class ActivitiesList(Gtk.VBox):
>         self._alert = None
>         self._clear_message_box = None
> 
> +    def grab_focus(self):
> +        # overwrite grab focus in order to grab focus from the parent
> +        self._tree_view.grab_focus()
> +
>     def set_filter(self, query):
>         matches = self._tree_view.set_filter(query)
>         if matches == 0:
> diff --git a/src/jarabe/desktop/favoritesview.py b/src/jarabe/desktop/favoritesview.py
> index b73d016..26a89e6 100644
> --- a/src/jarabe/desktop/favoritesview.py
> +++ b/src/jarabe/desktop/favoritesview.py
> @@ -85,6 +85,10 @@ class FavoritesBox(Gtk.VBox):
>     def set_resume_mode(self, resume_mode):
>         self._view.set_resume_mode(resume_mode)
> 
> +    def grab_focus(self):
> +        # overwrite grab focus in order to grab focus from the parent
> +        self._view.grab_focus()
> +
>     def add_alert(self, alert):
>         if self._alert is not None:
>             self.remove_alert()
> diff --git a/src/jarabe/desktop/groupbox.py b/src/jarabe/desktop/groupbox.py
> index 3d7c0f3..f916f62 100644
> --- a/src/jarabe/desktop/groupbox.py
> +++ b/src/jarabe/desktop/groupbox.py
> @@ -41,7 +41,8 @@ class GroupBox(ViewContainer):
> 
>         self._query = ''
>         toolbar.connect('query-changed', self._toolbar_query_changed_cb)
> -
> +        toolbar.search_entry.connect('icon-press',
> +                                     self.__clear_icon_pressed_cb)
>         self._friends = {}
> 
>         friends_model = friends.get_model()
> @@ -72,3 +73,6 @@ class GroupBox(ViewContainer):
>         for icon in self.get_children():
>             if hasattr(icon, 'set_filter'):
>                 icon.set_filter(self._query)
> +
> +    def __clear_icon_pressed_cb(self, entry, icon_pos, event):
> +        self.grab_focus()
> diff --git a/src/jarabe/desktop/homebox.py b/src/jarabe/desktop/homebox.py
> index 8eda213..ed5144b 100644
> --- a/src/jarabe/desktop/homebox.py
> +++ b/src/jarabe/desktop/homebox.py
> @@ -45,6 +45,8 @@ class HomeBox(Gtk.VBox):
> 
>         toolbar.connect('query-changed', self.__toolbar_query_changed_cb)
>         toolbar.connect('view-changed', self.__toolbar_view_changed_cb)
> +        toolbar.search_entry.connect('icon-press',
> +                                     self.__clear_icon_pressed_cb)
>         self._list_view.connect('clear-clicked',
>                                 self.__activitylist_clear_clicked_cb, toolbar)
> 
> @@ -108,6 +110,17 @@ class HomeBox(Gtk.VBox):
>     def __activitylist_clear_clicked_cb(self, widget, toolbar):
>         toolbar.clear_query()
> 
> +    def __clear_icon_pressed_cb(self, entry, icon_pos, event):
> +        self.grab_focus()
> +
> +    def grab_focus(self):
> +        # overwrite grab focus to be able to grab focus on the
> +        # views which are packed inside a box
> +        if self._list_view in self.get_children():
> +            self._list_view.grab_focus()
> +        else:
> +            self._favorites_box.grab_focus()
> +
>     def _set_view(self, view):
>         if view == _FAVORITES_VIEW:
>             if self._list_view in self.get_children():
> @@ -116,6 +129,7 @@ class HomeBox(Gtk.VBox):
>             if self._favorites_box not in self.get_children():
>                 self.add(self._favorites_box)
>                 self._favorites_box.show()
> +                self._favorites_box.grab_focus()
>         elif view == _LIST_VIEW:
>             if self._favorites_box in self.get_children():
>                 self.remove(self._favorites_box)
> @@ -123,6 +137,7 @@ class HomeBox(Gtk.VBox):
>             if self._list_view not in self.get_children():
>                 self.add(self._list_view)
>                 self._list_view.show()
> +                self._list_view.grab_focus()
>         else:
>             raise ValueError('Invalid view: %r' % view)
> 
> diff --git a/src/jarabe/desktop/homewindow.py b/src/jarabe/desktop/homewindow.py
> index 27c81e8..a412b99 100644
> --- a/src/jarabe/desktop/homewindow.py
> +++ b/src/jarabe/desktop/homewindow.py
> @@ -14,6 +14,7 @@
> # along with this program; if not, write to the Free Software
> # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> 
> +from gettext import gettext as _
> import logging
> 
> from gi.repository import GObject
> @@ -64,12 +65,14 @@ class HomeWindow(Gtk.Window):
>         self.modify_bg(Gtk.StateType.NORMAL,
>                        style.COLOR_WHITE.get_gdk_color())
> 
> -        self.add_events(Gdk.EventMask.VISIBILITY_NOTIFY_MASK)
> +        self.add_events(Gdk.EventMask.VISIBILITY_NOTIFY_MASK|
> +                        Gdk.EventMask.BUTTON_PRESS_MASK)
>         self.connect('visibility-notify-event',
>                      self._visibility_notify_event_cb)
>         self.connect('map-event', self.__map_event_cb)
>         self.connect('key-press-event', self.__key_press_event_cb)
>         self.connect('key-release-event', self.__key_release_event_cb)
> +        self.connect('button-press-event', self.__button_pressed_cb)
> 
>         self._box = Gtk.VBox()
> 
> @@ -80,6 +83,7 @@ class HomeWindow(Gtk.Window):
>         self._home_box = HomeBox(self._toolbar)
>         self._box.pack_start(self._home_box, True, True, 0)
>         self._home_box.show()
> +        self._home_box.grab_focus()
>         self._toolbar.show_view_buttons()
> 
>         self._group_box = GroupBox(self._toolbar)
> @@ -131,6 +135,9 @@ class HomeWindow(Gtk.Window):
>             self._activate_view(shell.get_model().zoom_level)
> 
>     def __key_press_event_cb(self, window, event):
> +        if not self._toolbar.search_entry.has_focus():
> +            self._toolbar.search_entry.grab_focus()
> +
>         if event.keyval in [Gdk.KEY_Alt_L, Gdk.KEY_Alt_R]:
>             self._home_box.set_resume_mode(False)
>         return False
> @@ -140,6 +147,11 @@ class HomeWindow(Gtk.Window):
>             self._home_box.set_resume_mode(True)
>         return False
> 
> +    def __button_pressed_cb(self, widget, event):
> +        current_box = self._box.get_children()[1]
> +        current_box.grab_focus()
> +        return False
> +
>     def __map_event_cb(self, window, event):
>         # have to make the desktop window active
>         # since metacity doesn't make it on startup
> @@ -197,19 +209,22 @@ class HomeWindow(Gtk.Window):
>             self._box.pack_start(self._home_box, True, True, 0)
>             self._home_box.show()
>             self._toolbar.clear_query()
> -            self._toolbar.search_entry.grab_focus()
> +            self._toolbar.set_placeholder_text_for_view(_('Home'))
> +            self._home_box.grab_focus()
>             self._toolbar.show_view_buttons()
>         elif level == ShellModel.ZOOM_GROUP:
>             self._box.pack_start(self._group_box, True, True, 0)
>             self._group_box.show()
>             self._toolbar.clear_query()
> -            self._toolbar.search_entry.grab_focus()
> +            self._toolbar.set_placeholder_text_for_view(_('Group'))
> +            self._group_box.grab_focus()
>             self._toolbar.hide_view_buttons()
>         elif level == ShellModel.ZOOM_MESH:
>             self._box.pack_start(self._mesh_box, True, True, 0)
>             self._mesh_box.show()
>             self._toolbar.clear_query()
> -            self._toolbar.search_entry.grab_focus()
> +            self._toolbar.set_placeholder_text_for_view(_('Neighborhood'))
> +            self._mesh_box.grab_focus()
>             self._toolbar.hide_view_buttons()
> 
>     def get_home_box(self):
> diff --git a/src/jarabe/desktop/meshbox.py b/src/jarabe/desktop/meshbox.py
> index 049263e..e1c8381 100644
> --- a/src/jarabe/desktop/meshbox.py
> +++ b/src/jarabe/desktop/meshbox.py
> @@ -362,6 +362,8 @@ class MeshBox(ViewContainer):
>         self._query = ''
> 
>         toolbar.connect('query-changed', self._toolbar_query_changed_cb)
> +        toolbar.search_entry.connect('icon-press',
> +                                     self.__clear_icon_pressed_cb)
> 
>         for buddy_model in self._model.get_buddies():
>             self._add_buddy(buddy_model)
> @@ -590,3 +592,6 @@ class MeshBox(ViewContainer):
>         for icon in self.get_children():
>             if hasattr(icon, 'set_filter'):
>                 icon.set_filter(self._query)
> +
> +    def __clear_icon_pressed_cb(self, entry, icon_pos, event):
> +        self.grab_focus()
> diff --git a/src/jarabe/desktop/viewcontainer.py b/src/jarabe/desktop/viewcontainer.py
> index 1675293..76f5a69 100644
> --- a/src/jarabe/desktop/viewcontainer.py
> +++ b/src/jarabe/desktop/viewcontainer.py
> @@ -26,6 +26,7 @@ class ViewContainer(Gtk.Container):
>     def __init__(self, layout, owner_icon, activity_icon=None, **kwargs):
>         Gtk.Container.__init__(self, **kwargs)
>         self.set_has_window(False)
> +        self.set_can_focus(True)
> 
>         self._activity_icon = None
>         self._owner_icon = None
> diff --git a/src/jarabe/desktop/viewtoolbar.py b/src/jarabe/desktop/viewtoolbar.py
> index 09b4512..5cb0186 100644
> --- a/src/jarabe/desktop/viewtoolbar.py
> +++ b/src/jarabe/desktop/viewtoolbar.py
> @@ -59,6 +59,7 @@ class ViewToolbar(Gtk.Toolbar):
>         self.search_entry = iconentry.IconEntry()
>         self.search_entry.set_icon_from_name(iconentry.ICON_ENTRY_PRIMARY,
>                                              'system-search')
> +        self.set_placeholder_text_for_view(_('Home'))
>         self.search_entry.add_clear_button()
>         self.search_entry.set_width_chars(25)
>         self.search_entry.connect('activate', self._entry_activated_cb)
> @@ -95,6 +96,10 @@ class ViewToolbar(Gtk.Toolbar):
>     def clear_query(self):
>         self.search_entry.props.text = ''
> 
> +    def set_placeholder_text_for_view(self, view_name):
> +        text = _('Search in %s') % view_name
> +        self.search_entry.set_placeholder_text(text)
> +
>     def _add_separator(self, expand=False):
>         separator = Gtk.SeparatorToolItem()
>         separator.props.draw = False
> @@ -132,7 +137,6 @@ class ViewToolbar(Gtk.Toolbar):
> 
>     def __view_button_toggled_cb(self, button, view):
>         if button.props.active:
> -            self.search_entry.grab_focus()
>             self.emit('view-changed', view)
> 
> 
> -- 
> 1.7.11.4
> 
> _______________________________________________
> Sugar-devel mailing list
> Sugar-devel at lists.sugarlabs.org
> http://lists.sugarlabs.org/listinfo/sugar-devel



More information about the Sugar-devel mailing list