On Mon, 2004-02-09 at 11:33, Graham Ashton wrote:

> Apologies for responding to my own message, but I found a way to achieve
> the same result...

Just to continue this monologue for a little longer, somebody requested
the code, so here it is...

-- 
Graham Ashton
class ChangeCellRenderer(gtk.GenericCellRenderer):
                                                                                
    __gproperties__ = {
        'variable': (gobject.TYPE_STRING, 'text', 'variable changed',
                     '', gobject.PARAM_READWRITE),
        'reason': (gobject.TYPE_STRING, 'reason', 'reason for this change',
                   '', gobject.PARAM_READWRITE),
    }
    property_names = __gproperties__.keys()
                                                                                
    def __init__(self):
        self.__gobject_init__()
                                                                                
        self.xpad = 3
        self.ypad = 3
                                                                                
        self.xalign = 0.0
        self.yalign = 0.5
                                                                                
    def __getattr__(self, name):
        try:
            return self.get_property(name)
        except TypeError:
            raise AttributeError
                                                                                
    def __setattr__(self, name, value):
        try:
            self.set_property(name, value)
        except TypeError:
            self.__dict__[name] = value
                                                                                
    def do_get_property(self, property):
        if property.name not in self.property_names:
            raise TypeError('No property named %s' % (property.name,))
        return self.__dict__[property.name]
                                                                                
    def do_set_property(self, property, value):
        if property.name not in self.property_names:
            raise TypeError('No property named %s' % (property.name,))
        self.__dict__[property.name] = value
                                                                                
    def on_render(self, window, widget, background_area,
                  cell_area, expose_area, flags):
        x_offset, y_offset, width, height = self.on_get_size(widget, cell_area)
        width -= self.xpad * 2
        height -= self.ypad * 2
                                                                                
        layout = pango.Layout(widget.get_pango_context())
        list_store = widget.get_model()
                                                                                
        if self.reason:
            reason = ('<span size="smaller">%s</span>' % self.reason)
        else:
            reason = ('<span size="smaller" foreground="#0000cc">'
                      '&lt;%s&gt;'
                      '</span>' % 'Please assign a reason')
                                                                                
        layout.set_markup('<span size="smaller" weight="bold">%s</span>\n%s' %
                          (self.variable, reason))
        layout.set_width(-1)  # turn off wrapping
        widget.style.paint_layout(window, gtk.STATE_NORMAL, gtk.TRUE,
                                  cell_area, widget, 'dummy',
                                  cell_area.x + x_offset,
                                  cell_area.y + y_offset,
                                  layout)
                                                                                
    def _get_row_height(self, widget):
        layout = pango.Layout(widget.get_pango_context())
        layout.set_markup('<span size="smaller">Line 1\nLine2</span>')
        pango_scale = 1024  # available as pango.SCALE in more recent pygtk
        return (layout.get_size()[1] / pango_scale) + (self.ypad * 2)
                                                                                
    def on_get_size(self, widget, cell_area):
        calc_width = 200  # randomly picked to be less than treeview width
        calc_height = self._get_row_height(widget)
                                                                                
        if cell_area:
            y_offset = self.yalign * (cell_area.height - calc_height)
            y_offset = max(y_offset, 0)
        else:
            y_offset = self.ypad
                                                                                
        x_offset = self.xpad
        y_offset = self.ypad
        return x_offset, y_offset, calc_width, calc_height
                                                                                
                                                                                
gobject.type_register(ChangeCellRenderer)
_______________________________________________
pygtk mailing list   [EMAIL PROTECTED]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

Reply via email to