Beispiel #1
0
    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
Beispiel #2
0
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('<', '&lt;').replace('>', '&gt;')
            return unicode(text).replace('&', '&amp;')
        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)