diff options
author | Manuel Quiñones <manuq@laptop.org> | 2012-09-18 13:25:19 (GMT) |
---|---|---|
committer | Manuel Quiñones <manuq@laptop.org> | 2012-09-18 22:23:38 (GMT) |
commit | 9d8e86b7641ab2bc865f75663093b3f7ad43bf9b (patch) | |
tree | 02291029eba33bd432ca250a5fa6f61a8e02e0fb /src | |
parent | 898827d8502ba84f51fea2ad05b3efff42eeb3f5 (diff) |
Add feedback in Home View, List View when there are no matching entries - SL #3838
The scrolled window widget that contains the list of activities is
replaced by a message box when there are no matching entries. This is
the same as the Journal does. An alert can be packed also, so we use
pack_end to add the message box or the list of activities again.
Use Gtk.TreeModel.iter_n_children() [1] to count the matches, note
that this work only for tree model lists.
The message box widget is copied from the Journal listview. Is done
in a separate class and can be generalized later. The only important
change here is the icon colors: to make the 'system-search' icon look
ok, the stroke color and fill color were switched.
[1] http://developer.gnome.org/gtk3/stable/GtkTreeModel.html#gtk-tree-model-iter-n-children
Signed-off-by: Manuel Quiñones <manuq@laptop.org>
Acked-by: Simon Schampijer <simon@laptop.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/jarabe/desktop/activitieslist.py | 101 | ||||
-rw-r--r-- | src/jarabe/desktop/homebox.py | 5 | ||||
-rw-r--r-- | src/jarabe/desktop/viewtoolbar.py | 3 |
3 files changed, 100 insertions, 9 deletions
diff --git a/src/jarabe/desktop/activitieslist.py b/src/jarabe/desktop/activitieslist.py index ab62b58..5d3dc20 100644 --- a/src/jarabe/desktop/activitieslist.py +++ b/src/jarabe/desktop/activitieslist.py @@ -19,6 +19,7 @@ import os import logging from gettext import gettext as _ +import glib from gi.repository import GObject from gi.repository import Pango from gi.repository import GConf @@ -50,7 +51,8 @@ class ActivitiesTreeView(Gtk.TreeView): self._query = '' - self.modify_base(Gtk.StateType.NORMAL, style.COLOR_WHITE.get_gdk_color()) + self.modify_base(Gtk.StateType.NORMAL, + style.COLOR_WHITE.get_gdk_color()) self.set_headers_visible(False) selection = self.get_selection() selection.set_mode(Gtk.SelectionMode.NONE) @@ -147,8 +149,14 @@ class ActivitiesTreeView(Gtk.TreeView): misc.launch(bundle) def set_filter(self, query): + """Set a new query and refilter the model, return the number + of matching activities. + + """ self._query = query.lower() 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] @@ -296,30 +304,78 @@ class CellRendererActivityIcon(CellRendererIcon): self.emit('erase-activated', bundle_id) +class ClearMessageBox(Gtk.EventBox): + def __init__(self, message, button_callback): + Gtk.EventBox.__init__(self) + + self.modify_bg(Gtk.StateType.NORMAL, + style.COLOR_WHITE.get_gdk_color()) + + alignment = Gtk.Alignment.new(0.5, 0.5, 0.1, 0.1) + self.add(alignment) + alignment.show() + + box = Gtk.VBox() + alignment.add(box) + box.show() + + icon = Icon(pixel_size=style.LARGE_ICON_SIZE, + icon_name='system-search', + stroke_color=style.COLOR_TRANSPARENT.get_svg(), + fill_color=style.COLOR_BUTTON_GREY.get_svg()) + box.pack_start(icon, expand=True, fill=False, padding=0) + icon.show() + + label = Gtk.Label() + color = style.COLOR_BUTTON_GREY.get_html() + label.set_markup('<span weight="bold" color="%s">%s</span>' % ( \ + color, glib.markup_escape_text(message))) + box.pack_start(label, expand=True, fill=False, padding=0) + label.show() + + button = Gtk.Button(label=_('Clear search')) + button.connect('clicked', button_callback) + button.props.image = Icon(icon_name='dialog-cancel', + icon_size=Gtk.IconSize.BUTTON) + box.pack_start(button, expand=True, fill=False, padding=0) + button.show() + + class ActivitiesList(Gtk.VBox): __gtype_name__ = 'SugarActivitiesList' + __gsignals__ = { + 'clear-clicked': (GObject.SignalFlags.RUN_FIRST, None, ([])), + } + def __init__(self): logging.debug('STARTUP: Loading the activities list') Gtk.VBox.__init__(self) - scrolled_window = Gtk.ScrolledWindow() - scrolled_window.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) - scrolled_window.set_shadow_type(Gtk.ShadowType.NONE) - scrolled_window.connect('key-press-event', self.__key_press_event_cb) - self.pack_start(scrolled_window, True, True, 0) - scrolled_window.show() + self._scrolled_window = Gtk.ScrolledWindow() + self._scrolled_window.set_policy(Gtk.PolicyType.NEVER, + Gtk.PolicyType.AUTOMATIC) + self._scrolled_window.set_shadow_type(Gtk.ShadowType.NONE) + self._scrolled_window.connect('key-press-event', + self.__key_press_event_cb) + self.pack_start(self._scrolled_window, True, True, 0) + self._scrolled_window.show() self._tree_view = ActivitiesTreeView() self._tree_view.connect('erase-activated', self.__erase_activated_cb) - scrolled_window.add(self._tree_view) + self._scrolled_window.add(self._tree_view) self._tree_view.show() self._alert = None + self._clear_message_box = None def set_filter(self, query): - self._tree_view.set_filter(query) + matches = self._tree_view.set_filter(query) + if matches == 0: + self._show_clear_message() + else: + self._hide_clear_message() def __key_press_event_cb(self, scrolled_window, event): keyname = Gdk.keyval_name(event.keyval) @@ -339,6 +395,33 @@ class ActivitiesList(Gtk.VBox): return True + def _show_clear_message(self): + if self._clear_message_box in self.get_children(): + return + if self._scrolled_window in self.get_children(): + self.remove(self._scrolled_window) + + self._clear_message_box = ClearMessageBox( + message=_('No matching activities'), + button_callback=self.__clear_button_clicked_cb) + + self.pack_end(self._clear_message_box, True, True, 0) + self._clear_message_box.show() + + def __clear_button_clicked_cb(self, button): + self.emit('clear-clicked') + + def _hide_clear_message(self): + if self._scrolled_window in self.get_children(): + return + if self._clear_message_box in self.get_children(): + self.remove(self._clear_message_box) + + self._clear_message_box = None + + self.pack_end(self._scrolled_window, True, True, 0) + self._scrolled_window.show() + def add_alert(self, alert): if self._alert is not None: self.remove_alert() diff --git a/src/jarabe/desktop/homebox.py b/src/jarabe/desktop/homebox.py index 875ecf6..8eda213 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) + self._list_view.connect('clear-clicked', + self.__activitylist_clear_clicked_cb, toolbar) self._set_view(_FAVORITES_VIEW) self._query = '' @@ -103,6 +105,9 @@ class HomeBox(Gtk.VBox): def __toolbar_view_changed_cb(self, toolbar, view): self._set_view(view) + def __activitylist_clear_clicked_cb(self, widget, toolbar): + toolbar.clear_query() + def _set_view(self, view): if view == _FAVORITES_VIEW: if self._list_view in self.get_children(): diff --git a/src/jarabe/desktop/viewtoolbar.py b/src/jarabe/desktop/viewtoolbar.py index 340ab73..96df68e 100644 --- a/src/jarabe/desktop/viewtoolbar.py +++ b/src/jarabe/desktop/viewtoolbar.py @@ -92,6 +92,9 @@ class ViewToolbar(Gtk.Toolbar): self._favorites_button.hide() self._list_button.hide() + def clear_query(self): + self.search_entry.props.text = '' + def _add_separator(self, expand=False): separator = Gtk.SeparatorToolItem() separator.props.draw = False |