-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi!
The attached patch adds a "Back to matches" button under the list of actions (see attachment) and makes the '>' beneath matches that have more than one action clickable to go the list of actions. This replaces that you have to press ctrl while clicking on a match to display its actions. Raphaël knows about this patch, too, and is all for it. This patch tackles bug #468455 and bug #468456. The patch is important, because it helps a lot to navigate. Without it, navigating between the list of actions and the list of matches would only be possible using the keyboard. Navigating using the keyboard is somewhat a hidden feature and everything you could achieve with the keyboard should be possible with the mouse, too. If the patch won't be part of the final 2.20 release many users obviously won't recognize the new feature of actions, because they won't intuitionally find the way to the list actions. Actions are a core feature of the new Deskbar-Applet. Therefore, I think this patch should be applied. [1]: http://bugzilla.gnome.org/show_bug.cgi?id=468455 [2]: http://bugzilla.gnome.org/show_bug.cgi?id=468456 - -- Greetings, Sebastian Pölsterl -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFGzv4p1ygZeJ3lLIcRAo0GAKCFkOSjz2ksRdVtYZ7DHZnmY9ADGACcClIm d4alahwCUn8j0auFKXXhctw= =01Vk -----END PGP SIGNATURE-----
Index: /home/sebp/workspace/deskbar-applet/deskbar/ui/cuemiac/CuemiacTreeView.py =================================================================== --- /home/sebp/workspace/deskbar-applet/deskbar/ui/cuemiac/CuemiacTreeView.py (revision 1582) +++ /home/sebp/workspace/deskbar-applet/deskbar/ui/cuemiac/CuemiacTreeView.py (working copy) @@ -29,10 +29,13 @@ 'has-more-actions' : (gobject.TYPE_BOOLEAN, 'whether the match has more than one action', 'If set to True a symbol will be displayed on the right', False, gobject.PARAM_READWRITE), - 'match-markup' : (gobject.TYPE_STRING, 'markup for match description', - 'markup for match description', - "", gobject.PARAM_READWRITE), } + __gsignals__ = { + # This signal will be emited when '>' on the right is clicked + "show-actions-activated": (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, [gobject.TYPE_PYOBJECT]), + # This signal will be emited then an area that's not the '>' from above is clicked + "do-action-activated": (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, [gobject.TYPE_PYOBJECT]), + } def __init__ (self): gtk.CellRendererText.__init__ (self) @@ -40,6 +43,12 @@ self.__match_count = 0 self.__has_more_actions = False self.__match_markup = "" + self.__button_x = 0 + self.__button_y = 0 + self.__button_width = 0 + self.__button_height = 0 + + self.set_property("mode", gtk.CELL_RENDERER_MODE_ACTIVATABLE) # Grab some default theme settings # they are probably incorrect, but we reset @@ -64,8 +73,8 @@ self.render_match (window, widget, background_area, cell_area, expose_area, flags) else: self.render_category (window, widget, background_area, cell_area, expose_area, flags) - - def render_match (self, window, widget, background_area, cell_area, expose_area, flag): + + def render_match (self, window, widget, background_area, cell_area, expose_area, flags): ctx = window.cairo_create () # Set up a pango.Layout @@ -72,8 +81,7 @@ more_actions_layout = ctx.create_layout () if self.get_property("has-more-actions"): more_actions_layout.set_markup ("<b>></b>") - else: - more_actions_layout.set_text("") + more_actions_layout.set_font_description (self.header_font_desc) more_actions_layout_width, more_actions_layout_height = more_actions_layout.get_pixel_size() @@ -78,19 +86,41 @@ more_actions_layout_width, more_actions_layout_height = more_actions_layout.get_pixel_size() - state = self.renderer_state_to_widget_state(flag) + state = self.renderer_state_to_widget_state(flags) + + self.__button_width = more_actions_layout_width + 2 + self.__button_height = cell_area.height # Draw the actual text in the remaining area cell_area_width = cell_area.width - cell_area.width -= more_actions_layout_width + 2 - gtk.CellRendererText.do_render (self, window, widget, background_area, cell_area, expose_area, flag) + cell_area.width -= self.__button_width + gtk.CellRendererText.do_render (self, window, widget, background_area, cell_area, expose_area, flags) mod_gc = widget.get_style().text_gc[state] + + self.__button_x = (cell_area.x + cell_area_width) - more_actions_layout_width - 2 + self.__button_y = cell_area.y + ( (cell_area.height - more_actions_layout_height) / 2 ) + 1 + window.draw_layout(mod_gc, - (cell_area.x + cell_area_width) - more_actions_layout_width - 2, - cell_area.y + ( (cell_area.height - more_actions_layout_height) / 2 ) + 1, + self.__button_x, + self.__button_y, more_actions_layout) + if self.get_property("has-more-actions"): + # Add some additional area around the '>' to activate it + self.__button_x -= 3 + self.__button_y = cell_area.y + self.__button_width += 3 + else: + self.__button_height = 0 + self.__button_width = 0 + self.__button_x = 0 + self.__button_y = 0 + + #window.draw_rectangle(mod_gc, False, self.__button_x, self.__button_y, + # self.__button_width, self.__button_height + # ) + def render_category (self, window, widget, background_area, cell_area, expose_area, flag): """ Renders the category title from the "category-header" property and displays a rigth aligned @@ -105,7 +135,7 @@ cat_layout = ctx.create_layout () cat_layout.set_font_description (self.header_font_desc) - cat_layout.set_markup("...") + cat_layout.set_markup("...") cat_layout_width, cat_layout_height = cat_layout.get_pixel_size() ellipsise_size = cat_layout_width @@ -153,6 +183,33 @@ if (gtk.CELL_RENDERER_SELECTED & flags) == gtk.CELL_RENDERER_SELECTED: state = gtk.STATE_SELECTED return state + + def do_activate(self, event, widget, path_string, background_area, cell_area, flags): + if not isinstance(widget, gtk.TreeView): + # Not a treeview + return False + + if event.type != gtk.gdk.BUTTON_PRESS: + # Event type not GDK_BUTTON_PRESS + return True + + ex = event.x + ey = event.y + bx = self.__button_x + # Otherwise, we get problems when the cell + # is at the top of the visible part of the treeview + by = cell_area.y + bw = self.__button_width + bh = self.__button_height + + path = tuple([int(i) for i in path_string.split(':')]) + if (ex < bx or ex > (bx+bw) or ey < by or ey > (by+bh)): + # Click wasn't on the icon + self.emit("do-action-activated", path) + return True + else: + self.emit("show-actions-activated", path) + return False def do_get_property(self, property): if property.name == 'category-header': @@ -161,8 +218,6 @@ return self.__match_count elif property.name == 'has-more-actions': return self.__has_more_actions - elif property.name == 'match-markup': - return self.__match_markup else: raise AttributeError, 'unknown property %s' % property.name @@ -173,8 +228,6 @@ self.__match_count = value elif property.name == 'has-more-actions': self.__has_more_actions = value - elif property.name == 'match-markup': - self.__match_markup = value else: raise AttributeError, 'unknown property %s' % property.name @@ -198,8 +251,7 @@ gtk.TreeView.__init__ (self, model) self.set_enable_search (False) self.set_property ("headers-visible", False) - - self.connect ("button-press-event", self.__on_button_press) + self.connect ("key-press-event", self.__on_key_press) icon = gtk.CellRendererPixbuf () @@ -205,8 +257,10 @@ icon = gtk.CellRendererPixbuf () icon.set_property("xpad", 10) hit_title = CellRendererCuemiacCategory () + hit_title.connect("show-actions-activated", self.__on_show_actions_activated) + hit_title.connect("do-action-activated", self.__on_do_action_activated) hit_title.set_property ("ellipsize", pango.ELLIPSIZE_END) - + hits = gtk.TreeViewColumn ("Hits") hits.pack_start (icon, expand=False) hits.pack_start (hit_title) @@ -291,20 +345,7 @@ path = self.__find_bottom_path() if path != None: self.__select_path(path) - - def __on_button_press (self, treeview, event): - # We want to activate items on single click - path_ctx = self.get_path_at_pos (int(event.x), int(event.y)) - if path_ctx is not None: - path, col, x, y = path_ctx - model = self.get_model () - match = model[model.get_iter(path)][model.MATCHES] - if match.__class__ != CuemiacCategory: - if event.state & gtk.gdk.CONTROL_MASK: - self.__on_activated(treeview, path, col, event) - else: - self.__on_do_default_action(treeview, path, col, event) - + # def __on_config_expanded_cat (self, value): # if value != None and value.type == gconf.VALUE_LIST: # self.__collapsed_rows = [h.get_string() for h in value.get_list()] @@ -346,7 +387,18 @@ cell.set_property ("has-more-actions", len(match.get_actions()) > 1) cell.set_property ("markup", model[iter][model.ACTIONS]) + + def __on_show_actions_activated(self, widget, path): + col = self.get_model().ACTIONS + self.__on_activated(self, path, col, None) + def __on_do_action_activated(self, widget, path): + model = self.get_model () + match = model[model.get_iter(path)][model.MATCHES] + col = self.get_model().ACTIONS + if match.__class__ != CuemiacCategory: + self.__on_do_default_action(self, path, col, None) + def __on_do_default_action(self, treeview, path, col, event): model = self.get_model() iter = model.get_iter (path) Index: /home/sebp/workspace/deskbar-applet/deskbar/ui/CuemiacWindowView.py =================================================================== --- /home/sebp/workspace/deskbar-applet/deskbar/ui/CuemiacWindowView.py (revision 1582) +++ /home/sebp/workspace/deskbar-applet/deskbar/ui/CuemiacWindowView.py (working copy) @@ -110,6 +110,8 @@ self.scrolled_results.show() # Actions TreeView + self.actions_box = gtk.VBox(spacing=3) + self.actions_model = CuemiacActionsModel() self.aview = CuemiacActionsTreeView(self.actions_model) self.aview.connect ("action-selected", self._controller.on_action_selected) @@ -120,6 +122,20 @@ self.scrolled_actions.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.scrolled_actions.set_shadow_type(gtk.SHADOW_IN) self.scrolled_actions.add(self.aview) + self.scrolled_actions.show() + self.actions_box.pack_start(self.scrolled_actions) + + buttonbox = gtk.HButtonBox() + buttonbox.set_layout(gtk.BUTTONBOX_START) + buttonbox.show() + self.actions_box.pack_start(buttonbox, False) + + back_button = gtk.Button(_("Back to matches")) + back_button.set_image( gtk.image_new_from_stock(gtk.STOCK_GO_BACK, gtk.ICON_SIZE_MENU) ) + back_button.set_relief(gtk.RELIEF_NONE) + back_button.connect("clicked", self.__on_go_back) + back_button.show() + buttonbox.pack_start(back_button, False, False, 0) # Results self.results_box = gtk.HBox() @@ -124,7 +140,7 @@ # Results self.results_box = gtk.HBox() self.results_box.pack_start(self.scrolled_results) - self.results_box.pack_start(self.scrolled_actions) + self.results_box.pack_start(self.actions_box) self.vbox_main.pack_start(self.results_box) def clear_all(self): @@ -165,7 +181,15 @@ self.realize() self.window.set_user_time(time) self.present() - + + def __show_matches(self): + self.scrolled_results.show() + self.actions_box.hide() + + def __show_actions(self): + self.scrolled_results.hide() + self.actions_box.show() + def show_results(self): width, height = self.get_size() if self.__small_window_height == None: @@ -171,8 +195,7 @@ if self.__small_window_height == None: self.__small_window_height = height self.results_box.show() - self.scrolled_results.show() - self.scrolled_actions.hide() + self.__show_matches() self.resize( width, self._model.get_window_height() ) def display_actions(self, actions, qstring): @@ -177,8 +200,7 @@ def display_actions(self, actions, qstring): self.actions_model.clear() - self.scrolled_results.hide() - self.scrolled_actions.show() + self.__show_actions() self.actions_model.add_actions(actions, qstring) self.aview.grab_focus() @@ -220,9 +242,8 @@ self.entry.set_icon (icon) - def __on_go_back(self, treeview): - self.scrolled_actions.hide() - self.scrolled_results.show() + def __on_go_back(self, widget): + self.__show_matches() self.cview.grab_focus() return False
<<inline: new-button.png>>
_______________________________________________ gnome-i18n mailing list gnome-i18n@gnome.org http://mail.gnome.org/mailman/listinfo/gnome-i18n