[Sugar-devel] [PATCH shell] Views: defocus the search entry by default
Simon Schampijer
simon at schampijer.de
Wed Sep 26 07:53:02 EDT 2012
Ok, as discussed on irc, the text with a # is a comment not meant to be
doc visible.
Pushed as 1570f7742e606d09e9fb9079711dd6a43346784d
Thanks for the review and testing,
Simon
On 09/26/2012 01:39 PM, Manuel Quiñones wrote:
> 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
>
>
>
More information about the Sugar-devel
mailing list