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

Manuel Quiñones manuq at laptop.org
Wed Sep 26 07:39:51 EDT 2012


Wow impressive patch.  Is a great usability improvement, and having
the placeholder text is nice.  Also I don't see the text reset issue
that I was seeing in your previous test app, sent to the design thread
[1].

About code styling, do we have an agreement mixing docstrings like
"""this""" and # this ?  If so, please push.  Thanks!

[1] http://lists.sugarlabs.org/archive/sugar-devel/2012-August/039096.html

2012/9/26 Simon Schampijer <simon at schampijer.de>:
> 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
>
> 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



-- 
.. manuq ..


More information about the Sugar-devel mailing list