def __init__(self, widget, name, expand=False, text=unicode, wrap=None, template=None, icon=False, pad=0, size=None, pixmaps=None, renderer=None): # Manager where icons will be pulled from self.pixmaps = pixmaps or PixmapManager('', pixmap_dir='./', size=size) self.size = SizeFilter(self.pixmaps, size=size) if isinstance(widget, Gtk.TreeView): column = Gtk.TreeViewColumn((name)) column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) column.set_expand(expand) widget.append_column(column) else: # Deal with possible drop down lists column = widget # Separators should do something widget.set_row_separator_func(self.is_separator, None) if renderer != None: renderer_custom = renderer() column.pack_start(renderer_custom, False) column.set_cell_data_func(renderer_custom, self.data_func(), None) # The icon if icon != False: renderer_icon = Gtk.CellRendererPixbuf() if pad: renderer_icon.set_property("ypad", pad) renderer_icon.set_property("xpad", pad) column.pack_start(renderer_icon, False) if not icon or icon == True: icon = self.default_icon column.set_cell_data_func(renderer_icon, self.icon_func(icon), None) if renderer == None: # The name renderer = Gtk.CellRendererText() if wrap: renderer.props.wrap_width = wrap renderer.props.wrap_mode = Pango.WrapMode.WORD column.pack_start(renderer, True) if not text: text = self.default_text renderer.props.background_set = True renderer.props.foreground_set = True column.set_cell_data_func(renderer, self.text_func(text, template), None) self._column = column
class ViewColumn(object): """Add a column to a gtk treeview without dealing with gnomes""" def __init__(self, widget, name, expand=False, text=unicode, wrap=None, template=None, icon=False, pad=0, size=None, pixmaps=None, renderer=None): # Manager where icons will be pulled from self.pixmaps = pixmaps or PixmapManager('', pixmap_dir='./', size=size) self.size = SizeFilter(self.pixmaps, size=size) if isinstance(widget, Gtk.TreeView): column = Gtk.TreeViewColumn((name)) column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) column.set_expand(expand) widget.append_column(column) else: # Deal with possible drop down lists column = widget # Separators should do something widget.set_row_separator_func(self.is_separator, None) if renderer != None: renderer_custom = renderer() column.pack_start(renderer_custom, False) column.set_cell_data_func(renderer_custom, self.data_func(), None) # The icon if icon != False: renderer_icon = Gtk.CellRendererPixbuf() if pad: renderer_icon.set_property("ypad", pad) renderer_icon.set_property("xpad", pad) column.pack_start(renderer_icon, False) if not icon or icon == True: icon = self.default_icon column.set_cell_data_func(renderer_icon, self.icon_func(icon), None) if renderer == None: # The name renderer = Gtk.CellRendererText() if wrap: renderer.props.wrap_width = wrap renderer.props.wrap_mode = Pango.WrapMode.WORD column.pack_start(renderer, True) if not text: text = self.default_text renderer.props.background_set = True renderer.props.foreground_set = True column.set_cell_data_func(renderer, self.text_func(text, template), None) self._column = column def is_separator(self, model, item_iter, data): item = model.get_value(item_iter, 0) return isinstance(item, Separator) def clean(self, text, markup=False): """Clean text of any pango markup confusing chars""" if text == None: text = '' if isinstance(text, (basestring, int, float)): if markup: text = unicode(text).replace('<', '<').replace('>', '>') return unicode(text).replace('&', '&') elif isinstance(text, dict): target = {} for key in text.keys(): target[key] = self.clean(text[key]) return target elif isinstance(text, list) or isinstance(text, tuple): target = [] for value in text: target.append(self.clean(value)) return tuple(target) else: raise TypeError("Unknown value type for text: %s" % str(type(text))) def get_callout(self, call, default=None): """Returns the right kind of method""" if isinstance(call, tuple): (call, default) = call if isinstance(call, basestring): call = item_property(call, default) return call def data_func(self): """Wrap a non-text data function""" def internal(column, cell, model, item_iter, data): item = model.get_value(item_iter, 0) cell.set_property("data", item) return internal def text_func(self, call, template=None): """Wrap up our text functionality""" callout = self.get_callout(call) def internal(column, cell, model, item_iter, data): if self.is_separator(model, item_iter, data): return item = model.get_value(item_iter, 0) text = callout(item) if template: text = template % self.clean(text, markup=True) else: text = self.clean(text) cell.set_property("markup", unicode(text)) self._set_background(cell, item) return internal def icon_func(self, call): """Wrap, wrap wrap the func""" callout = self.get_callout(call) def internal(column, cell, model, item_iter, data): if self.is_separator(model, item_iter, data): return item = model.get_value(item_iter, 0) icon = callout(item) if (icon and isinstance(icon, basestring) and self.pixmaps) or icon == None: # Expect a Gnome theme icon icon = self.pixmaps.get(icon) elif icon: icon = self.size.filter(icon) if icon: cell.set_property("pixbuf", icon) cell.set_property("visible", True) self._set_background(cell, item) else: cell.set_property("visible", False) return internal def _set_background(self, cell, item): """Internal method for setting the background color""" color = self.set_background(item) if color: cell.set_property("cell-background", color) def set_background(self, item): """Returns None, over-ride and return color string i.e. '#ff0000'""" return None def default_text(self, item): """Default text return for markup.""" return default(item, 'name', str(item)) def default_icon(self, item): """Default icon return, pixbuf or gnome theme name""" return default(item, 'icon', None)